系统的讲解 - PHP WEB 安全防御
常见漏洞

看到上图的漏洞是不是特别熟悉,如果不进行及时防御,就会产生蝴蝶效应。
往下看,可能会找到你要的答案。
SQL注入攻击
定义
SQL注入攻击是通过WEB表单提交,在URL参数提交或Cookie参数提交,将怀有恶意的“字符串”,提交给后台数据库,欺骗服务器执行恶意的SQL语句。
案例
//以用户登录为例,当验证用户名和密码是否正确时
$sql = "SELECT * FROM user WHERE
        username = '".$_GET['username']."' AND
        password = '".$_GET['password']."'";
用户恶意输入:
$_GET['username'] = "' or 1=1 -- '";
$_GET['password'] = "123456";
注入后的Sql语句:
$sql = "SELECT * FROM user WHERE username = ''
        or 1=1 -- ''AND password = '123456'";
执行注入后的Sql语句,可以返回 user 表的全部数据。
平时我们可以进行自测,比如使用单引号、双引号,如果是数字进行+1或-1。
SQL注入的危害很大,利用SQL注入可以进行,拖库、删库、删表、UDF提权、读取文件、...
推荐一个开源的自动化的SQL注入工具。
SQLmap:http://sqlmap.org/
- 支持各种数据库管理系统(MySql、Oracle、SQL Server、SQLite ... )。
 - 支持自动识别密码哈希格式并通过字典破解密码哈希。
 - 支持枚举用户、密码、哈希、权限、角色、数据库、数据表和列。
 - 支持完全地下载某个数据库中的某个表、某个列。
 - 支持在数据库管理系统中搜索指定的数据库名、表名或列名。
 - 支持下载或上传文件。
 - 支持执行任意命令并回现标准输出。
 - 支持布尔型盲注、时间型盲注、基于错误信息的注入、联合查询注入和堆查询注入。
 
尝试着利用工具,注入自己的项目,发现问题,然后解决问题。
SQL注入的危害,远比我们想象的要大!
防御
推荐解决方案是使用 PDO 或 MySQLi 的数据库扩展。
PHP官方文档中介绍,MySQL扩展自PHP 5.5.0起已废弃,并在自PHP7.0.0开始被移除。
如果已经在用MySQL扩展了,可以对传入的每个参数做验证,并使用框架的ORM进行查询。
另外:addslashes 和 mysql_real_escape_string 这种转义是不安全的!
XSS攻击
定义
XSS攻击是一种经常出现在WEB应用中的计算机安全漏洞,通过WEB表单提交或在URL参数提交将代码植入在用户的使用页面上。
分类
存储型
注入的恶意代码存储在服务器上(常用于留言板、论坛帖子、CRM),受害者请求服务器获取信息的时候,这些恶意代码就被浏览器成功执行。
反射型
注入的恶意代码没有存储在服务器上,通过引诱用户点击一个链接到目标网站进行实施攻击。
DOM型
注入的恶意代码并未显式的包含在web服务器的响应页面中,但会被页面中的js脚本以变量的形式来访问到的方式来进行实施攻击。
案例
存储型:论坛帖子界面input输入框中,输入 /><script>alert("xss")</script> 进行提交。
反射型:在浏览器输入框中,输入 /xxx.php?name=<script>alert(/xss/)</script>
//DOM型,代码举例
<script>
var temp = document.URL;
var temp_new = temp+'test'
document.write(decodeURI(temp_new));
</script>
XSS的危害有很多,包括盗号,挂马,控制受害者机器想其他网站发起攻击 ...
自测的方法,看见输入框就输入:/><script>alert("xss")</script> 进行提交。
推荐一个专门针对浏览器攻击的框架。
BeEF :https://beefproject.com/
防御
简单的防御可以对style、script、image、src、a等等不安全的因素进行过滤或转义。
可以自己封装一个方法,也可以使用框架的自带方法,比如 xss_clean 。
可以利用一些模板引擎避免XSS攻击,比如Laravel框架使用的Blade,还有twig,Smarty等。
可以利用HTTP-only,将cookie设置成HTTP-only防止XSS攻击。
//设置Cookie
setcookie($name, $value, $expire, $path, $domain, $secure, $httponly); 
//然后服务端通过使用 $_COOKIE 进行验证。
可以使用Content Security Policy,它的实质就是白名单制度。
入门教程请参考:http://www.ruanyifeng.com/blog/2016/09/csp.html
SSRF攻击
定义
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是攻击者伪造服务器端发起的请求,虽然攻击者无法从外网访问内网的系统,但是它通过注入恶意代码从服务端发起,通过服务端就再访问内网的系统,然后获取不该获取的数据。

案例
漏洞主要产生在包含这些方法的代码中,比如 curl、file_get_contents、fsockopen。
//代码片段
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_GET['url']);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_exec($ch);
curl_close($ch);
请求地址:http://www.xxx.com/demo.php?url=xxx
将url参数修改成,file:///etc/passwd,可以获取敏感文件的信息。
将url参数修改成,dict://127.0.0.1:3306/info,可以获取目标主机3306端口运行的应用。
除了 file协议,dict协议,还可以利用gopher协议 和 http/https 协议进行攻击。
可以攻击redis,memcache,内网应用,还可以查看一下敏感文件的信息 等等。
防御
对 curl、file_get_contents、fsockopen 这些方法中的参数进行严格验证!
限制协议只能为HTTP或HTTPS,禁止进行跳转。
如果有白名单,解析参数中的URL,判断是否在白名单内。
如果没有白名单,解析参数中的URL,判断是否为内网IP。
CSRF攻击
定义
CSRF(Cross-site request forgery:跨站请求伪造)是攻击者通过伪装成受信任的用户,盗用受信任用户的身份,用受信任用户的身份发送恶意请求。

从上图看出,完成一次CSRF攻击,需要完成两个步骤:
1.登录受信任网站A,本地生成网站A的Cookie。
2.未退出网站A的情况下,访问危险网站B。
危害
具体危害要看受信任网站是做什么的,如果是社交网站可以操控发广告,如果是电商网站可以操控购物,如果是银行网站甚至还可以操控转账,......
这样危害会造成个人信息的泄露和财产的损失。
防御
Cookie Hashing,表单提交或Ajax提交,必须使用csrf token。
对于不确定是否有csrf风险的请求,可以使用验证码(尽管体验会变差)。
对于一些重要的操作(修改密码、修改邮箱),必须使用二次验证。
文件上传漏洞
定义
文件上传漏洞是攻击者上传了一个可执行的文件到服务器上执行。
可执行文件包括有病毒、木马、恶意脚本等。
危害
文件上传漏洞与SQL注入或XSS相比,其风险更大,如果存在上传漏洞攻击者甚至可以直接上传一个webshell脚本到服务器上。
防御
- 文件扩展名检测
 - 文件 MIME 验证
 - 文件重命名
 - 文件目录设置不可执行权限
 - 设置单独域名的文件服务器
 
信息泄露
定义
信息泄露主要指用户的手机号、邮箱、密码、身份证、地址等敏感数据泄露,还有服务器上的文件和环境变量等敏感数据泄露,还包括将直接将企业源码上传到开发平台。
案例
比如开发接口时,接口返回明文的手机号。
比如调试代码时,代码中提交了一些调试信息,未进行删除。
......
防御
- 敏感数据脱敏(比如手机号、身份证、邮箱、地址)。
 - 服务器上不允许提交包含打印 phpinfo 、$_SERVER 和 调试信息等代码。
 - 定期从开发平台扫描关于企业相关的源码项目。
 
越权
定义
“超出了你自己所拥有的权限,干了你本来不可能干的事情。”
水平越权:用户A未授权可以访问用户B的数据。
垂直越权:未登录用户可以访问需要授权的应用。
举例,本来用户A只能查看自己的订单数据,但是他通过修改URL参数就能查看到用户B的订单数据。
未登录的用户,可以访问到后台模块并进行操作。
防御
对于所有涉及到用户数据的操作,必须严格判断当前用户的身份。
对于所有需要权限控制的位置,必须严格检验用户权限级别。
设计缺陷
返回信息过多
举例,登录时进行验证,当用户不存在时,返回“用户不存在”,当用户被禁用时,返回“用户已被禁用”。
避免攻击者进行恶意尝试,不应该返回过多的信息,可以统一返回“用户名或密码错误”。
短信接口被恶意攻击
举例,注册或登录时用户输入手机号码就可直接触发短信接口,这块最容易被攻击者进行短信轰炸。
应该进行增加接口调用限制:
- 设置同一手机号短信发送间隔
 - 设置每个IP地址每日最大发送量
 - 设置每个手机号每日最大发送量
 - 升级验证码,采用滑动拼图、文字点选、图表点选...
 - 升级短信接口的验证方法
 
小结
文章主要讲解了 SQL注入攻击、XSS攻击、SSRF攻击、CSRF攻击、文件上传漏洞、信息泄露、越权、设计缺陷等八大方面,通过这次的梳理,也使我自己对PHP WEB安全防御有了一个全面了解。
同时还要时刻保持警惕,所有用户输入的数据都是不值得信任的,接收到的数据必须经过校验和过滤。
也不要轻易相信从网络上发现的代码,在使用第三方类库或代码时抱有怀疑的态度,要多进行调试和验证,看起来没问题的代码可能隐藏了很多的安全隐患。
最后,推荐一款开源的漏洞演示平台,包含了100多个漏洞。
这个是安装在本地的,大家尝试注入恶意代码,同时也警醒自己不要犯这样的错误。
bWAPP:http://www.itsecgames.com/
本文欢迎转发,转发请注明作者和出处,谢谢!
系统的讲解 - PHP WEB 安全防御的更多相关文章
- (系统架构)标准Web系统的架构分层
		
标准Web系统的架构分层 1.架构体系分层图 在上图中我们描述了Web系统架构中的组成部分.并且给出了每一层常用的技术组件/服务实现.需要注意以下几点: 系统架构是灵活的,根据需求的不同,不一定每一层 ...
 - 第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第十二天】(系统架构讲解、nginx)
		
https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 ...
 - 在Linux系统下运行微信Web开发者工具
		
微信Web开发者工具只有window版本和mac版本,如果想要在Linux系统下运行微信Web开发者工具,需要花费很大周折. 注:带 * 的步骤或文件为不确定是否管用的步骤或文件.本人系统为Linux ...
 - 第三模块:面向对象&网络编程基础 第3章 选课系统作业讲解
		
01-选课系统作业讲解1 02--选课系统作业讲解2 03-选课系统作业讲解3 04--选课系统作业讲解4 01-选课系统作业讲解1 02--选课系统作业讲解2 03-选课系统作业讲解3 04--选课 ...
 - shell项目-分发系统-expect讲解
		
shell项目-分发系统-expect讲解 yum install -y expect 1. 自动远程登录 #! /usr/bin/expect set host "192.168.133. ...
 - Linux centosVMware运行告警系统、分发系统-expect讲解、自动远程登录后,执行命令并退出、expect脚本传递参数、expect脚本同步文件、指定host和要同步的文件、shell项目-分发系统-构建文件分发系统、分发系统-命令批量执行
		
一运行告警系统 创建一个任务计划crontab -e 每一分钟都执行一次 调试时把主脚本里边log先注释掉 再次执行 没有发现502文件说明执行成功了,每日有错误,本机IP 负载不高 二.分发系统-e ...
 - Android进阶(十一)Android系统架构讲解
		
如果说一个成功男人的背后会有一个默默支持的女人的话,那么一个优越稳定的平台背后必有一个成熟的系统架构所支撑着.那么,Android的系统架构是怎么样的呢?从下图我们可以从整体上有个大致的了解(图片来源 ...
 - 系统的讲解 - PHP 接口签名验证
		
目录 概览 常用验证 单向散列加密 对称加密 非对称加密 密钥安全管理 接口调试工具 在线接口文档 扩展 小结 概览 工作中,我们时刻都会和接口打交道,有的是调取他人的接口,有的是为他人提供接口,在这 ...
 - 系统的讲解 - SSO单点登录
		
目录 概念 好处 技术实现 小结 扩展 概念 SSO 英文全称 Single Sign On,单点登录. 在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统. 比如:淘宝网(www.t ...
 
随机推荐
- 基于JS的WEB会议室预订拖拽式图形界面的实现
			
06年的一篇blog,转到这个博客上: 很早之前写的,后来由于这个功能模块取消,最终没有上线,所以与Server交互的那部分还没有写,不过那部分方案我也已经出来了,而且现在客户端这一部分已经通过了比较 ...
 - 说说Android的MVP模式
			
http://toughcoder.NET/blog/2015/11/29/understanding-Android-mvp-pattern/ 安卓应用开发是一个看似容易,实则很难的一门苦活儿.上手 ...
 - virtualenv 中 install flask 的小问题
			
最经在学习Python flask 框架 ,用virtualenv建立好我的flask虚拟环境后,执行 sudo pip install flask 并没有报错 我以为已经装上了flask,但当我进入 ...
 - Zookeeper + Dubbo + SpringMVC + dubbo-admin
			
第一步:在CentOS/Windows上安装Zookeeper[前提] A:CentOS Zookeeper作为Dubbo服务的注册中心,Dubbo原先基于数据库的注册中心,没采用Zookee ...
 - VS下使用Google Protobuf完成SOCKET通信
			
如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信 出处:如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信 最近一 ...
 - thinkphp实现数据分页
			
方法一: public function show_cate(){ $category_name = array( '1' => '政法综治前沿', '2' => '政策法规', '3' ...
 - Python_eval()
			
''' eval()用来把任意字符串转化为Python表达式并进行求值 ''' print(eval('3+4')) #计算表达式的值 a=3 b=4 print(eval('a+b')) #这时候要 ...
 - .Net中集合排序的一种高级玩法
			
背景: 学生有名称.学号, 班级有班级名称.班级序号 学校有学校名称.学校编号(序号) 需求 现在需要对学生进行排序 第一排序逻辑 按学校编号(序号)排列 再按班级序号排列 再按学生学号排列 当然,在 ...
 - javascript 原型机制
			
prototype,__proto__,constructor 在 JavaScript 原型继承结构里面,规范中用 [[Prototype]] 表示对象隐式的原型,在 JavaScript 中用 _ ...
 - Extjs--12种布局方式
			
按照Extjs的4.1的文档来看,extjs的布局方式大致有12种,下面一一介绍,有些代码就是文档中的. 1.Border 边界布局 border布局,最多可以将页面分割为"东南西北中&qu ...