web安全编程(php)

一.sql注入

漏洞原理:
1.使用用户的参数拼接sql语句
2.参数改变了原有sql语句的结构
注入方式:

  1. 回显注入
  2. 报错注入
  3. 盲注
  4. 宽字节注入
    mysql的编码和php编码不一致会有这种问题

防御的方法:

1. 参数转义

1.整数类处理intval
2.字符串转义 addslashes


<?php
$str = "Is your name O'reilly?";

// 输出: Is your name O\'reilly?
echo addslashes($str);
?>

3.字符串转义
mysql_real_escape_string

2. sql预处理

预处理方式可以使参数与sql结构进行分离,保持参数是参数,结构是结构

pdo中的预处理语句
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";
 
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // 设置 PDO 错误模式为异常
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
    // 预处理 SQL 并绑定参数
    $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) 
    VALUES (:firstname, :lastname, :email)");
    $stmt->bindParam(':firstname', $firstname);
    $stmt->bindParam(':lastname', $lastname);
    $stmt->bindParam(':email', $email);
 
    // 插入行
    $firstname = "John";
    $lastname = "Doe";
    $email = "john@example.com";
    $stmt->execute();
 
    // 插入其他行
    $firstname = "Mary";
    $lastname = "Moe";
    $email = "mary@example.com";
    $stmt->execute();
 
    // 插入其他行
    $firstname = "Julie";
    $lastname = "Dooley";
    $email = "julie@example.com";
    $stmt->execute();
 
    echo "新记录插入成功";
}
catch(PDOException $e)
{
    echo "Error: " . $e->getMessage();
}
$conn = null;
?>

但是对于复杂sql语句来说有些麻烦!

二.全局变量漏洞

PHP中的变量不需要事先声明,它们会在第一次使用时自动创建,它们的类型根据上下文环境自动确定。从程序员的角度来看,这无疑是一种极其方便的处理方法。一旦一个变量被创建了,就可以在程序中的任何地方使用。这个特点导致的结果就是程序员很少初始化变量。

很显然,基于PHP的应用程序的主函数一般都是接受用户的输入(主要是表单变量,上载文件和Cookie等),然后对输入数据进行处理,然后把结果返回到客户端浏览器。为了使PHP代码访问用户的输入尽可能容易,实际上PHP是把这些输入数据看作全局变量来处理的。

<FORM METHOD="GET" ACTION="test.php">
<INPUT TYPE="TEXT" NAME="hello">
<INPUT TYPE="SUBMIT">
</FORM>

这会显示一个文本框和提交按钮。当用户点击提交按钮时,"test.php"会处理用户的输入,当"test.php"运行时,"hello"会包含用户在文本框输入的数据。从这里我们应该看出,攻击者可以按照自己的意愿创建任意的全局变量。如果攻击者不是通过表单输入来调用"test.php",而是直接在浏览器地址栏输入http://server/test.php?hello=hi&setup=no,那么,不止是"hello"被创建,"$setup"也被创建了。
下面的用户认证代码暴露了PHP的全局变量所导致的安全问题:

<?php
if ($pass == "hello")
$auth = 1;
...
if ($auth == 1)
echo "some important information";
?>

上面的代码首先检查用户的密码是否为"hello",如果匹配的话,设置"$auth"为"1",即通过认证。之后如果"$suth"为"1"的话,就会显示一些重要信息。

这段代码假定"$auth"在没有设置值的时候是空的,但是攻击者可以创建任何全局变量并赋值,通过类似"http://server/test.php?auth=1"的方法,我们完全可以欺骗这段代码,使它相信我们是已经认证过的。

因此,为了提高PHP程序的安全性,我们不能相信任何没有明确定义的变量。如果程序中的变量很多的话,这可是一项非常艰巨的任务。

三 .文件上传漏洞

在网站的运营过程中,不可避免地要对网站的某些页面或者内容进行更新,比如用户需要上传头像,发帖需要上传附件,商品需要上传照片等。
如果不对上传的文件进行限制或者限制被绕过,该功能便有可能被利用于上传可执行文件,脚本到服务器,进而进一步导致服务器沦陷。

漏洞类型:

1.客户端验证
2.服务端绕过

防范措施:

1.目录不可执行
如果web容器无法解析该目录下的文件,即使攻击者上传了脚本文件,服务器本身不会受影响,因此这一点至关重要
2.在判断文件类型时,可以结合MIME TYPE,后缀检查等方式,在文件类型检查中,强烈推荐白名单方式,因为黑名单的方式非常不可靠,能被攻击者轻易的绕过;
对于图片的处理,可以使用压缩函数或者resize函数,处理同时破坏图片中包含的恶意代码
3使用随机数改写文件名和路径
文件上传如果要执行代码,则需要用户能够访问到这个文件,在某些环境中,用户能上传,但不能访问。
如果应用了随机数改写文件名和路径,将极大增加攻击成本,再来就是像shell.php.rar.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击。

四.文件包含

漏洞原理:
开发者希望代码更加灵活,很多时候会将被包含的文件设置为变量,用来进行动态调用,不过会造成文件包含漏洞的可能。
文件包含漏洞在PHP Web Application中居多,而在JSP,ASP,.NET程序中却非常少,甚至没有包含漏洞的存在。
1.本地文件包含
2.远程文件包含
3.资源文件输出
防范方式:
1.参数验证
限制参数的文件名,限制参数中的路径,预先设置参数格式
2.open_basedir
配置PHP中open_basedir可以限制PHP只能打开特定目录
例如 open_basedir = /home/wwwroot/www.test.localhost
在windows 下多个目录应当用分号隔开,在linux下则用冒号隔开
3.关闭远程文件 加载

四.跨站脚本攻击

漏洞类型:js攻击
漏洞危害:信息泄露,冒用身份,伪造钓鱼
防御方法

1.常规过滤

1.参数接受格式检查,邮箱,手机号,主键id
2.入库时需转义格式,htmlentities() htmlspecialchars()


<?php
$str = "A 'quote' is <b>bold</b>";


// 输出: A 'quote' is &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str);

// 输出: A &#039;quote&#039; is &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str, ENT_QUOTES);
?>
3内容输出检查过滤,返回内容是否合格

五,跨站请求伪造(CSRF)

漏洞原理:

1.服务请错把"浏览器发起的请求" 当 "用户发起的请求"
2.已登录的浏览器,打开恶意网址后,被执行了相应操作

防范措施:

1.referer
2.token
3.图片验证码

六,越权

漏洞原理:

越权漏洞是Web系统中常见的安全漏洞,主要原因是开发者在对数据的增加,查询对客户端请求的数据忘记做权限的判断了。
账户越权是攻击者能够执行他本身没有资格执行的一些操作,换一句通俗的话越权就是"超越了你拥有的权限,做了你本来本可能做的事情"

漏洞分类

1.未授权访问
2.水平越权
3.垂直越权

防范措施

1.尽量不要暴露出连续ID如订单号
2.用户的操作必须传入UID和操作目标ID
3.前台和后台的查询尽量不要同一个查询接口

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容