PHP开发web应用安全总结

XSS跨站脚本

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

危害:php

  1. 盗取用户COOKIE信息。
  2. 跳转到钓鱼网站。
  3. 操做受害者的浏览器,查看受害者网页浏览信息等。
  4. 蠕虫攻击。

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

代码:java

[php]  view plain  copy
 
  在CODE上查看代码片派生到个人代码片
  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>  


解决方法:mysql

输出过滤,PHP端输出到view的模板页面上的数据都须要通过过滤:程序员

[php]  view plain  copy
 
  在CODE上查看代码片派生到个人代码片
  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

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

例子:数据库

[html]  view plain  copy
 
  在CODE上查看代码片派生到个人代码片
  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
 
  在CODE上查看代码片派生到个人代码片
  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
 
  在CODE上查看代码片派生到个人代码片
  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
 
  在CODE上查看代码片派生到个人代码片
  1. $sql = "SELECT name FROM users WHERE id = '". $_GET['id'] . "'";  

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

[sql]  view plain  copy
 
  在CODE上查看代码片派生到个人代码片
  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
 
  在CODE上查看代码片派生到个人代码片
  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. 破坏原来的XML结构,影响业务流程,甚至产生严重的错误。

例子:

[php]  view plain  copy
 
  在CODE上查看代码片派生到个人代码片
  1. $xml = "<USER role=guest><name>“ . $_GET[‘name’] . "</name><email>“ . $_GET[‘email’] . "</email></USER>";  

须要获得的XML结构:

[php]  view plain  copy
 
  在CODE上查看代码片派生到个人代码片
  1. <?xml version="1.0" encoding="UTF-8"?>     
  2. <USER role=guest>    
  3. <name>user1</name>    
  4. <email>user1@a.com</email>    
  5. </USER>   

恶意代码:

[php]  view plain  copy
 
  在CODE上查看代码片派生到个人代码片
  1. user1@a.com</email></USER><USER role=admin><name>test</name><email>user2@a.com   

意外的XML文档:

[php]  view plain  copy
 
  在CODE上查看代码片派生到个人代码片
  1. <?xml version="1.0" encoding="UTF-8"?>    
  2. <USER role=guest>    
  3. <name>user1</name>    
  4. <email>user1@a.com</email>    
  5. </USER>    
  6. <USER role=admin>    
  7. <name>test</name>    
  8. <email>user2@a.com</email>    
  9. </USER>   

解决方法:

1. 对php处理XML文档的时候,进行标签过滤

2. 尽可能减小直接被外部访问到xml文档,能够采用文件名用散列方法等。

 

url跳转漏洞

概念:Web应用程序接收到用户提交的URL参数后,没有对参数作”可信任URL”的验证,就向用户浏览器返回跳转到该URL的指令。

危害:钓鱼网站

例子:

http://m.yahoo.cn/log.php?c=web&u=http://www.163.com

解决方法:

对跳转的php函数进行进一步优化,使页面跳转能够在可信任的范围内。 例如能够有跳转域名白名单方法,这个访问各大公司使用比较多

 

文件系统跨越漏洞

概念:对文件目录参数没有进行过滤,致使恶意用户能够经过在参数中输入一些执行命令,或者跨越访问的行为,来超出用户的访问权限。

例子:经过一个或多个../跨越目录限制

[php]  view plain  copy
 
  在CODE上查看代码片派生到个人代码片
  1. $fp = fopen("image/{$_GET['filename']}", 'r');  

Getfile?filename=../../../../etc/passwd

解决方法:

1. 对文本操做的时候必定要谨慎,不可信任

2. 严格使用phpwind中安全类库 escapePath函数

 

系统命令漏洞

概念:用户提交的参数用于执行系统命令的参数。

解决:

1. 谨慎使用系统命令,对使用系统命令的地方须要进行安全评审

2. 对命令语句进行严格过滤

 

文件上传漏洞

概念:Web应用程序在处理用户上传的文件时,没有判断文件的扩展名是否在容许的范围内,或者没检测文件内容的合法性,就把文件保存在服务器上,甚至上传脚本木马到web服务器上,直接控制web服务器。

状况:

1. 未限制扩展名

2. 未检查文件内容

3. 病毒文件

解决方法:

1. 使用安全的,可信任的上传组件。

2. 检查文件扩展名,保证文件的类型正确。

3. 检查文件内容,保证用户不伪造文件类型。

 

任意文件下载漏洞 

解决方法:

1. Apache虚拟目录指向

2. Java/PHP读取文件

 

权限控制漏洞 

概念:属于业务逻辑上的安全管理。

访问控制:

1. 水平访问:Web应用程序接收到用户请求,修改某条数据时,没有判断数据的所属人,或判断数据所属人时,从用户提交的request参数(用户可控数据)中,获取了数据所属人id,致使恶意攻击者能够经过变换数据ID,或变换所属人id,修改不属于本身的数据。

2. 垂直访问:因为web应用程序没有作权限控制,或仅仅在菜单上作了权限控制,致使的恶意用户只要猜想其余管理页面的URL,就能够访问或控制其余角色拥有的数据或页面,达到权限提高目的。

存在状况:

1. URL级别的。(例如论坛须要操做评分的时候,有一个提交的URL地址,该地址提交过去,若是不作权限判断,那么恶意用户就能够随意的拿这个URL地址来进行恶意行为)

2. 菜单级别。(会员中心或者后台管理中心,会有菜单,管理员能够看到多个功能,普通管理员只能看到一部分功能。可是若是你对管理员操做的功能区不作权限判断,那么普通管理员只要猜想或者获取管理区的URL,就能够进行管理员操做了)

危害:

1. 属于业务逻辑的漏洞,这些危害性是巨大的,可让普通用户就可能获取管理员的权限,对网站进行恶意破坏或者作非法行为。

解决方案:

1. 项目先期,作一份详细的权限规划文档。

2. 在开发中严格按照权限文档的要求去作权限。

3. 后期测试须要覆盖权限这一块功能区。

4. 程序员须要常常注意这些方面的要求。

 

cookie安全设置

解决:

cookie httponly flag : 在用到用户名登录密码之类的安全性比较高的cookie的时候,能够在cookie中设置httponly属性,该属性只容许php等访问cookie,而不容许js访问。

cookie secure flag : 在涉及到https这样的状况,须要对cookie加密传输,那么能够设置这个属性

 

session安全

1. SESSION是保存在服务器端的,具备比COOKIE必定的安全性。

2. 使用COOKIE的时候,若是长时间没有动做,能够设置一个时间值,来对COOKIE进行过时。

3. 尽可能让用户每次的cookie值都是不一样的,这样能够保证cookie被盗取也不能长期使用的问题。

 

网络请求数据都须要判断

 

HTTPS

敏感信息,请走HTTPS

出处:http://blog.csdn.net/erjian666/article/details/53289763

相关文章
相关标签/搜索