SQL注入、XSS、CSRF
XSS
跨站脚本攻击(cross Site Scripting),恶意攻击者往web页面里插入恶意的Script代码,当用户浏览该页面之时,嵌入其中web里面的script代码会被执行,从而达到恶意攻击用户的目的。
XSS主要有如下三种分类:
1.Reflected XSS(基于反射的XSS攻击):是指XSS代码在请求的url中,而后提交到服务器,服务器解析后,xss代码随着响应内容一起传给客户端进行解析执行(直接反射显示在页面)。
2.Stored XSS(基于存储的xss攻击):Stored XSS 和 Reflected XSS的差别就在于,具有攻击性的脚本被保存到了服务器端(数据库、内存、文件系统)并且可以被普通用户完整的从服务取得并执行,从而获得了在网络上传播的能力。
3.DOM-based or local XSS(基于DOM或本地的XSS攻击:DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞。可以通过DOM来动态修改页面内容,从客户端获取DOM中的数据并在本地执行。基于这个特性,就可以利用JS脚本来实现XSS漏洞的利用。
举个xss例子:
(1)在网页input或者textarea中输入
XSS不光可以在后端进行防御,也可以在前端进行防御。
可以使用 php函数 htmlspecialchars()进行将脚本符号实体化。
CSRF
跨站请求伪造(csrf) Cross-site request forgery,和XSS有些相似,都是属于跨站攻击-不攻击服务器端而攻击正常访问网站的用户,但它们的攻击类型是不同维度上的分类。CSRF顾名思义,是伪造请求,冒充用户在站内的正常操作。我们知道,绝大多数网站是通过cookie等方式辨别用户身份(包括使用服务端Session的网站,因为Session ID 也是大多保存在cookie里面的),在予以授权的。所以要伪造用户的正常操作,最好的方法是通过XSS或链接欺骗等途径,让用户在本机(即拥有身份的cookie的浏览器端)起用户所不知道的请求。
举个csrf例子:
银行A,它以GET请求来完成银行转账操作:
http://www.mybank.com/Transfer.php?toBankId=11&money=1000
危险网站B,它里面有一段html代码如下:
<img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000>
首先,你登录了银行网站 A ,然后访问危险网站 B ,噢,这时你会发现你的银行账户少了 1000 块…
CSRF漏洞如何防御?
1.验证HTTP Referer 字段,利用http头中的referer判断请求来源是否合法,referer记录了该http请求的来源地址。
简单易行,只需要在最后给所有安全敏感的请求统一增加一个拦截器来检查Referer的值就可以。特别是对于当前现有的系统,不需要改变当前系统的任何已有代码和逻辑,没有风险,非常便捷。但是有一个缺陷,低版本浏览器提供的Referer存在伪造的风险。
2.在请求地址中添加token并验证
CSRF之所以可以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户信息都存在与cookie中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的cookie来通过安全验证。我们可以设置一个token,然后在服务端先验证token,如果请求中没有token或者token内容不正确,则认为可能是CSRF攻击而拒绝该请求。
SQL注入
表单输入不合法的mysql语句,达到破解如密码这种操作,可以利用占位符进行防止这种信息。