常见的xss攻击有两种,一种是反射型,攻击者诱使用户点击一个嵌入恶意脚本的链接,达到攻击目的。另外一种是持久型,攻击者提交含有恶意脚本的请求并被应用保存在了数据库中。
虽然xss攻击相对来说是一种比较老的攻击手段,但是却又在不断的变化出新的攻击方式,因此对它的防范也是较复杂的,但是主要的防御手段有如下两种。
消毒
xss一般利用恶意脚本来攻击,所以输入的内容一般用户是较少使用的,所以我们需要对HTML危险字符进行转义,如"<",">"这类字符。许多语言都有提供对HTML危险字符的过滤:
PHP的htmlentities()或是htmlspecialchars()。
Python的cgi.escape()。
ASP的Server.HTMLEncode()。
ASP.NET的Server.HtmlEncode()或功能更强的Microsoft Anti-Cross Site Scripting Library
Java的xssprotect(Open Source Library)。
Node.js的node-validator。
例如我使用的是php,所以可以利用htmlentities或htmlspecialchars这两个函数
这两个函数的功能都是转换字符为HTML字符编码,特别是url和代码字符串。防止字符标记被浏览器执行。转换英文时二者不会出现问题,当转换中文时htmlentities()就会出现乱码。而且htmlentities转换所有的html标记,而htmlspecialchars只转换&、”、’、<、>这5个标记。
HttpOnly
浏览器禁止页面javascript访问带有HttpOnly属性的Cookie。HttpOnly并不是直接对抗xss攻击,而是防治xss攻击者窃取Cookie。对于存放敏感信息的Cookie,如用户认证信息等,可以通过对该Cookie添加HttpOnly属性,避免被攻击窃取。