XSS和CSRF

XSS (cross-site scripting) (跨站脚本)

下面这段网址就属于XSS攻击:

https://security.stackexchange.com/search?q="<script>alert(document.cookie)</script>"

XSS本质是Html注入,和SQL注入差不多。SQLHtml、人类语言都是指令和数据混在一起,都存在注入风险(程序根据分隔符、标签识别指令和数据,人类则是根据语境、语义和日常经验判断)。比如注册用户时,用户输入“张三”并提交,服务端会生成“

欢迎新用户,张三

”传给浏览器。如果用户输入"<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) cookieHttpOnly属性,js无法进行读写

相同点

二者都发生在客户端

stackexchange

wikipedia

知乎

用大白话谈谈XSS与CSRF

OWASP Cross-site Scripting (XSS)

聊一聊WEB前端安全那些事儿

results matching ""

    No results matching ""