小结"/>
Web基础漏洞防御小结
Web基础漏洞防御小结
SQL注入
SQL注入攻击的问题最终归于用户可以控制输入,有输入的地方就可能存在风险。数据库只负责执行sql语句,并返回结果,数据库并没有什么好的办法直接过滤SQL注入,存储过程也不例外,所以防御SQL注入还得从代码入手。下面介绍一些常用的防御方案
严格控制数据类型
针对弱类型语言。强类型语言在接受参数的时候不会自动转换,而是会抛出异常,如Java,c#。而弱类型语言如PHP,ASP等会自动推导出数据类型。所以检查输入数据的数据类型在一定程度上能对抗SQL注入。如增加is_numberic
、ctype_digit()
、settype()
等函数来判断类型。
过滤危险字符
大多数CMS过滤危险字符的方式是采用过滤函数和类。来过滤掉如union sleep load_file
等关键字,PHP中可以采用魔术引号来解决(版本5.4后被取消)。
- gpc/runtime
php 中magic_quotes_gpc与magic_quotes_runtime - 过滤函数和类
- addslashes()
- mysql_[real_]escape_string()
- intval()
- floadval()
- 等等
使用预编译语句
防止SQL注入的最佳方式就是使用预编译语句,绑定变量。如
JAVA中的Statement、CallableStatement和PreparedStatement
PHP中的PDO,但要注意不要将变量直接拼接到PDO语句中,而是使用占位符。
.NET中的SqlCommand()和OleDbComand()
等等
使用存储过程
存储过程是一组为了完成特定功能或经常使用的SQL语句集合,经过编译后存储在数据库中。但安全的存储过程才能对抗SQL注入,应当避免在存储过程中使用动态的SQL语句。
安全编码函数
参考OWASP ESAPI,它将一些特殊字符进行了安全编码。
最后站在数据库的角度,控制好权限的分配是一个能降低损失的好办法。
PHP中的安全配置
display_errors = Off
关闭错误回显可以减少敏感信息的泄露
XSS
XSS防御比较复杂,不同的浏览器有不同的利用方式,特别是有业务上有富文本编辑器的时候,防御起来更复杂。流行的浏览器都内置了一些对抗XSS的措施,如firefox的CSP、Noscript扩展、IE的XSS Filter等。
漏洞形成的最终原因是对输入与输出没有严格过滤。但很多情况下无法识别哪些是正常字符,哪些不是。下面介绍一些常用的防御方案。
HttpOnly
即禁止页面的JavaScript访问带有HttpOnly属性的Cookie。严格的来说它对防御XSS不起作用,它解决的是XSS后续的Cookie劫持。
输入和输出过滤
输入检查,即在客户端js和服务端进行输入检查,过滤掉一些字符如< > ' 等
,敏感字符串如<script> javascript
等,方法可以利用xss filter,黑名单白名单等。但存在不够智能,比较死板的问题。
输出检查,一般采用安全编码如HTML实体编码(防御在html标签和属性中输出的),Javascript编码(防止在
PHP中的安全配置
session,cookie_httponly = 1
开启httponly
CSRF
防御CSRF的最主要问题是解决可信问题,即便是管理员权限提交到服务器的数据也不一定是完全可信的。CSRF攻击成功的本质原因是重要操作的所有参数都能被攻击者猜测到。下面介绍一些常用的防御方案。
二次确认
强制让应用与用户进行交互。
如删除用户时,弹出一个对话框提示“确定删除该用户?”。这一定程度上能增加用户警觉性。
设置验证码等
但为了用户体验,不适宜设置过多。只能作为一种辅助手段
Referer Check
Referer Check最常见的应用就是“防止图片盗链”,同理也可以用来验证请求的“源”。
网站的各大页面之间都有一定的逻辑联系,所以验证Referer值是否来自当前网站开头的域名或者上一个页面是有必要的。如果是其他网站的域名,那么极有可能是CSRF攻击。
但是这种方法是有缺陷的,服务器不是什么时候都可以获取到Referer值的,有些用户出于对隐私的保护会限制Referer的发送;某些情况如从HTTPS跳到HTTP的时候,浏览器出于安全的考虑也不会发送。
Token
这是效果最好的一种方法。利用了不可预测性。
让攻击者猜测不到参数和参数值,就无法构造一个有效伪造请求。如果对参数进行随机的话,会对数据分析,用户收藏等增加难度。因此新增一个参数token,采用安全的随机生成算法,值为用户和服务器共同所持有,可以放在Session中或者Cookie中。
尽量将token放在表单中,采用隐藏标签。
多个页面可以设置多个token值。
同时要记得更新token值。
除此之外,当存在XSS的时候,token是无效的。
文件操作漏洞
文件漏洞引起的原因大致如下
- 越权引起可以操作未授权操作的文件
- 要操作更多文件可以跳转目录
- 目录过滤不严
- 直接在请求中传入文件名
下面介绍一些常用的防御方案。
合理的权限管理
设置好哪些用户能对哪些类型文件进行操作
文件上传中,设置好上传目录的权限,如不可执行文件
文件包含中,不许目录穿越,判定参数是否外部可控,限制路径等等
文件类型判定
上传漏洞中,可以使用白名单,MIME Type,后缀检查等方式检查文件类型,对图片则可以使用压缩函数或resize函数来破坏图片中可能存在的HTML代码。
文件重命名
在文件上传中,可使用随机数来改写文件的名称,让攻击者无法访问。
PHP中的安全配置
open_bassdir
来对抗文件包好、目录遍历等allow_url_fopen=Off
allow_url_include=Off
来阻止远程文件包含
代码执行 & 命令执行
这类型漏洞多是一些特殊函数引起的。下面介绍一些常用的防御方案。
减少系统执行命令
能不使用系统执行命令就不使用,从根本上减少
少使用危险函数
对PHP来说,不能完全控制的危险函数最好不要使用
eval()、assert()、preg_replace()
参数过滤
如果一定要使用,那么对变量做好过滤是有必要的,敏感字符转义
白名单
使用动态函数之前,确保动态函数是指定的白名单函数之一
防注入函数
PHP中有自带的命令防注入函数escapeshellcmd()和escapeshellarg()
PHP中的安全配置
disable_functions
可以用来禁用一些函数
变量覆盖
常见漏洞点是在做变量注册的时候未验证变量是否存在
所以防御点主要是
不使用注册变量
直接用原生的$_GET
、$_POST
等数组变量进行操作,如果考虑程序可读性等原因,需要注册个别变量,可以直接在代码中定义变量,然后再把请求中的值赋值给他们。
验证变量是否存在
如使用extract( )函数则可以配置第二个参数为EXTR_SKIP。使用php parse_str函数注册变量前需要先自行通过代码判断变量是否存在。最重要的一点,自行申明的变量一定要初始化,不然即使注册变量代码在执行流程最前面也能覆盖掉这些未初始化的变量。
PHP中的安全配置
设置register_globals=Off
更多推荐
Web基础漏洞防御小结
发布评论