跨站脚本攻击XSS-防御

  sre, 开发

XSS攻击的防御
5.1HttpOnly
XSS 一般利用js脚本读取用户浏览器中的Cookie,而如果在服务器端对 Cookie 设置了HttpOnly 属性,那么js脚本就不能读取到cookie,但是浏览器还是能够正常使用cookie。
HttpOnly其实是解决XSS的Cookie劫持攻击。浏览器将禁止页面的Javascript访问带有HttpOnly属性的Cookie。从而防止Cookie劫持攻击。
response.setHeader(“Set-Cookie”, “cookiename=value; path=/; Domain=domainvalue; Max-Age=seconds; HTTPOnly”);
5.2输入检查
在XSS的防御上,输入检查一般是检查用户输入的数据中是否包含一些特殊字符,如<、>、’、”等。如果发现存在特殊字符,则将这些字符过滤。
输入检查的逻辑,必须放在服务器端代码中实现。如果只是在客户端使用JavaScript进行输入检查,是很容易被攻击者绕过的。目前Web开发的普遍做法,是同时在客户端JavaScript中和服务器端代码中实现相同的输入检查。客户端JavaScript的输入检查,可以抵挡大部分误操作的正常用户,从而节约服务器资源。
但是,输入检查的方式对预警的理解并不完整。如下例。、
用户想要输入:1+1<3,对于输入检查来说,发现了敏感字符<,并将其过滤掉,则会改变用户的本意,输出变为:1+1 3。而且输入数据可能会展示在多个地方,每个地方语境可能不同,如果单一的替换操作,可能会出现问题。
所以输入检查一般用在存储型的XSS攻击,务必确保存入数据库中的数据没有脚本。
对于输入,处理使用XSS filter之外,对于每一个输入,在客户端和服务器端还要进行各种验证,验证是否合法字符,长度是否合法,格式是否正确。在客户端和服务端都要进行验证,因为客户端的验证很容易被绕过。其实这种验证也分为了黑名单和白名单。黑名单的验证就是不能出现某些字符,白名单的验证就是只能出现某些字符。尽量使用白名单。
5.3输出检查
在变量输出到HTML页面时,可以使用编码或者转义的方式来防御XSS攻击。
在HTML标签和属性中输出
如:{username},

<c:outvalue=”{username}”>


此时的转义规则如下:
< 转成 < > 转成 >
& 转成 &
” 转成 ”
‘ 转成 ‘
用HtmlEncode编码。
在

VALUE为输出变量。
如果用javascriptEncode编码,则当黑客输入";alert(1)//时,可以防御,但是当黑客输入' onclick='alert(1)时,则会攻击成功。
如果用HTMLEncode编码,则当黑客输入' onclick='alert(1)时,可以防御,但是当黑客输入";alert(1)//时,则会攻击成功。
总结:在VALUE输入到

LEAVE A COMMENT

Captcha Code