XSS和CSRF
XSS (cross-site scripting) (跨站脚本)
下面这段网址就属于XSS
攻击:
https://security.stackexchange.com/search?q="<script>alert(document.cookie)</script>"
XSS
本质是Html
注入,和SQL
注入差不多。SQL
、Html
、人类语言都是指令和数据混在一起,都存在注入风险(程序根据分隔符、标签识别指令和数据,人类则是根据语境、语义和日常经验判断)。比如注册用户时,用户输入“张三”并提交,服务端会生成“
欢迎新用户,张三
”传给浏览器。如果用户输入"<script>alert('逗你玩')<script>
",服务端会生成 “<p>欢迎新用户,<script>alert('逗你玩')<script></p>
”,输入内容就会被浏览器识别为指令执行,这就是XSS注入;
小偷也是根据这个原理,输入一个有特殊语义的名字,让服务端识别为指令,从而完成了一次漂亮的存储型XSS
注入攻击。
XSS
: 通过客户端脚本语言(最常见如:JavaScript
)在一个论坛发帖中发布一段恶意的JavaScript
代码就是脚本注入,如果这个代码内容有请求外部服务器,那么就叫做XSS
!
a) 恶意嵌入<script>
标签
b) <
和>
伪装成unicode
码
CSRF (cross-site request forgery(伪造)) (跨站请求伪造)
Cross-site request forgery, 也被称为 one-click attack
CSRF
:又称XSRF
,冒充用户发起请求(在用户不知情的情况下),完成一些违背用户意愿的请求(如恶意发帖,删帖,改密码,发邮件等)。
下面这样就是CSRF
攻击:
https://security.stackexchange.com/account?new_password=abc123
防卫
大多数CSRF
防卫措施通常都是依靠嵌入额外的数据认证机制,以使应用程序能够识别出这一请求来自不可信的位置。
CSRF
依赖于XSS
,防住XSS
基本也就防住了CSRF
。让我们明确我们的目的,其实就是不让用户踏入XSS
的坑,那我们有两个方法防止用户入坑,一个是对外部输入进行彻彻底底的敏感字符过滤,一个是在显示的时候做一些特殊处理不让敏感代码顺利执行。
a) 转义成HTML字符实体。目前来讲,最简单的办法防治办法,还是将前端输出数据都进行转义最为稳妥。比如,按照刚刚我们那个例子来说,其本质是,浏览器遇到script
标签的话,则会执行其中的脚本。但是如果我们将script
标签的进行转义,则浏览器便不会认为其是一个标签,但是显示的时候,还是会按照正常的方式去显示。
<?php echo htmlentities($username);?>
b) \转义
c) cookie
的HttpOnly
属性,js
无法进行读写
相同点
二者都发生在客户端