安全守则:不要信任一切来自外部的数据,所有来自外部的数据都要经过严格的筛选、过滤、替换!!!
一些比较常见的攻击:
1.SQL Injection (SQL语句注入) 攻击防范
防范场景:需要从URL或其他外部拿到SQL拼接字符串时
攻击介绍:攻击者利用SQL语句查询漏洞对数据库进行无限制操作
解决方案:
避免直接将用户的输入嵌入到SQL语句中,例如:SELECT username,password FROM `xhp_member` WHERE uid = "$_GET['uid']" ;
在使用 findAll() find() 等AR系列函数时,尽量使用param binding; 例如:
findAll("id=:id",array(":id"=>33));
如果查询参数是int类型时应将参数过滤成整数,例如:
filter_var($_GET['id'],FILTER_SANITIZE_NUMBER_INT);
2.XSS (跨站脚本注入) 攻击防范
防范场景:在页面上需要显示来自用户输入的数据时,例如评论列表、留言列表
攻击介绍:恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
解决方案:在页面中输出用户的信息时务必要过滤字符串,例如:CHtml::encode($model->comment) , 如果是内容是HTML则用CHtmlPurifier::purify()过滤有害内容;
3.CSRF (跨站请求伪造) 攻击防范
防范场景:需要用户授权才能进行的操作,例如购买商品、转账、发消息、发邮件等
攻击介绍:简单来说就是攻击者盗用了你的身份信息进行一些只有你才能进行的数据操作
解决方案:在需要用户授权后才能进行的业务逻辑操作时需要防范CSRF攻击,验证 HTTP Referer 字段、在请求地址中添加token字符串并验证、在 HTTP 头中自定义属性并验证。
4.文件上传攻击防范
防范场景:允许用户上传的地方
攻击介绍:如果允许用户上传危险的文件到服务器,例如用户上传了一个PHP文件到upload目录,且upload也有执行权限,那么上传者几乎就可以为所欲为了。
解决方案:严格检查用户上传的文件类型,防止用户上传危险性文件,例如:.exe .php .jsp .asp...,过滤危险的文件,上传目录权限一定要控制好!
5.命令注入(Command Injection)攻击防范
攻击概要:攻击者通过外部输入或其它形式获得了这些函数的执行权限:
system.exec.passthru.shell_exec,于是整个系统都被攻击者控制了
解决方案:通常如果系统无特殊需求则在配置文件里声明禁止调用这些函数,如果一定要使用到这系列函数则在使用的时候一定要严格检查权限及输入
6.eval注入(Eval Injection)攻击防范
攻击概要:eval注入一般发生在攻击者能控制输入的字符串的时候,例如:eval(“$_GET[‘userId’]”);如果被攻击者利用了该函数,那么他将拥有了所有PHP能干的事情
解决方案:尽量不用eval函数来直接执行字符串保存的PHP代码
7.远程文件包含攻击(Remote Inclusion)
攻击概要:漏洞的产生例子
if ($_GET[‘page’]) {
include $_GET[‘page’];
} else {
include "config.php";
}
解决方案:避免使用这种方式加载文件
8.表单提交欺骗攻击(Spoofed Form Submissions)
攻击概要:这种攻击主要是绕过网站的表单验证限制,在自己的代码里重新塑造他想向服务器发送的数据类型以达到不可告人的秘密;
解决方案:我们在编写表单验证代码的时候不仅仅需要做前端JS验证,且必须在服务器端也做相同的验证。记住一点,前端JS验证是给普通用户、正常用户做的,后台验证则是留给恶意用户的屏障!