PHP相关系列 - PHP开发web应用安全总结

XSS跨站脚本

概念:恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。

危害:

  1. 盗取用户COOKIE信息。

  2. 跳转到钓鱼网站。

  3. 操作受害者的浏览器,查看受害者网页浏览信息等。

  4. 蠕虫攻击。

描述:反射型跨站。GET或POST内容未过滤,可以提交js以及HTML等恶意代码。

代码:

[php] view plain copy print?

  1. <?php echo $_GET['msg']; ?>  

  2. //正常URL  

  3. user.php?msg=henhao  

  4. //带JS的URL  

  5. user.php?msg=<script>alert(1)</script>  

  6. //恶意跳转URL  

  7. user.php?msg=<script>window.history.back(-1);</script>  


解决方法:

输出过滤,PHP端输出到view的模板页面上的数据都需要经过过滤:

[php] view plain copy print?

  1. /** 

  2.  * 安全过滤类-过滤HTML标签 

  3.  *  Controller中使用方法:$this->controller->filter_html($value) 

  4.  * @param  string $value 需要过滤的值 

  5.  * @return string 

  6.  */  

  7. public function filter_html($value) {  

  8.     if (function_exists('htmlspecialchars')) return htmlspecialchars($value);  

  9.     return str_replace(array("&"'"', "'", "<", ">"), array("&", """, "'", "<"">"), $value);  

  10. }  



CSRF跨站攻击

概念:CSRF跨站请求伪造,也被称成为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

危害:强迫受害者的浏览器向一个易受攻击的Web应用程序发送请求,最后达到攻击者所需要的操作行为。

例子:

[html] view plain copy print?

  1. <img src=“http://a.com/addfriend.php?id=123/>   

1. 上面是一个图片的html标签,但是src中是一个添加id为123好友的新增好友链接。

2. 恶意用户可以将这段代码植入其它网站网页上面,甚至可以img设置为0,0,让用户不知不觉中点击这个链接,达到用户并不像加这个人好友,但是添加的目的。

3. 当很多人都无意加了id为123这个人为好友的时候,id为123的恶意用户就有权限来查看这些人的信息,甚至可以发送很多恶意的信息,达到恶意用户的目的。

解决方法:

1. http://a.com/addfriend.php?id=123 使用POST方法会相对安全一点。

2. 采用类似随即码或者令牌的形式,让用户操作唯一性。 (每次用户登录网站随机生成一个token,存放在cookie中,用户的所有操作中都需要经过token验证)

 

带上这个init_token,然后每次请求都去验证一下就好了。token在浏览器打开的时候生效,关闭浏览器再打开浏览器的时候会变化

flash安全问题

例子:

[html] view plain copy print?

  1. http://images.sohu.com/bill/s2010/liulin/nokia/1602600902.swf?clickthru=javascript:alert(1)  


解决方法:

在网站根目录中,添加crossdomain.xml文件,这个文件主要是控制flash的域访问。

淘宝的:http://www.taobao.com/crossdomain.xml

[html] view plain copy print?

  1. <?xml version="1.0" ?>    

  2. <cross-domain-policy>    

  3. <allow-access-from domain="*.taobao.com" />    

  4. <allow-access-from domain="*.taobao.net" />    

  5. <allow-access-from domain="*.taobaocdn.com" />    

  6. <allow-access-from domain="*.tbcdn.cn" />    

  7. <allow-access-from domain="*.allyes.com" />    

  8. </cross-domain-policy>   

sql注入安全问题

概念:所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

危害:

1. 查询数据库中敏感信息。

2. 绕过认证。

3. 添加、删除、修改服务器数据。

4. 拒绝服务。?id=(BENCHMARK(100000000, MD5(RAND()));

例子:

[sql] view plain copy print?

  1. $sql = "SELECT name FROM users WHERE id = '". $_GET['id'] . "'";  

当ID值为:1’ or 1=’1  SQL语句(已测试可以注入):

[sql] view plain copy print?

  1. SELECT name FROM users WHERE id = ‘1’ or 1=’1 ‘  

说明:1=1的时候,条件语句WHEREOR之前的不起作用。 ‘的作用是组装SQL语句。

解决方法:

SQL组装的时候,对外部变量以及所有变量都进行过滤:

PHPWIND中,可以用sqlEscape、sqlImplode、sqlSingle、sqlMulti等函数过滤组装。过滤主要是一些’单引号这些可以破坏SQL组装的数据。

[php] view plain copy print?

  1. /** 

  2.  * SQL组装-私有SQL过滤 

  3.  * @param  string $val 过滤的值 

  4.  * @param  int    $iskey 0-过滤value值,1-过滤字段 

  5.  * @return string 

  6.  */  

  7. private function build_escape_single($val$iskey = 0) {  

  8.     if ($iskey === 0) {  

  9.         if (is_numeric($val)) {  

  10.             return " '" . $val . "' ";  

  11.         } else {  

  12.             return " '" . addslashes(stripslashes($val)) . "' ";  

  13.         }  

  14.     } else {  

  15.         $val = str_replace(array('`'' '), ''$val);  

  16.         return ' `'.addslashes(stripslashes($val)).'` ';  

  17.     }  

  18. }  

 

XML注入安全问题

概念:和SQL注入原理一样,XML是存储数据的地方,如果在查询或修改时,如果没有做转义,直接输入或输出数据,都将导致XML注入漏洞。攻击者可以修改XML数据格式,增加新的XML节点,对数据处理流程产生影响。

危害:

1. 攻击者可以新增XML节点

2. 破