- XSS - Cross-site scripting
xss其实就是html的注入问题,攻击者的输入没有经过严格的控制进入数据库,最终显示给来访的用户,导致可以在来访用户 的浏览器里以浏览器用户的身份执行html代码,数据的流程如下: 攻击者的html输入->web程序->进入数据库->web程序->用户浏览器。
比如我只想在页面上显示一个名字:
<span class="name">{{name}}</span>
但是,如果我的名字是长这样的:
XXX<script>alert('SB')</script>
这时候就好玩了:
<span class="name">XXX<script>alert('SB')</script></span>
攻击手段和目的
-
攻击者使被攻击者在浏览器中执行脚本后,如果需要手机来自被攻击者的数据(如cookie或其他敏感信息),可以自行架设一个网站,让被攻击攻击者通过javascript等方式把收集好的数据作为参数提交,随后以数据库等形式记录在攻击者自己的服务器上。
-
盗用cookie,获取敏感信息
-
利用 iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的如发微博、加好友、发私信等操作。
-
利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动
-
在访问量极大的一些页面上的XSS可以攻击一些小型网站,实现DDoS攻击的效果
XSS 怎么防御
一个经典的防御方法就是对内容进行转义和过滤,比如
var escapeHtml = function(str) {
if(!str) return '';
str = str.replace(/&/g, '&');
str = str.replace(/</g, '<');
str = str.replace(/>/g, '>');
str = str.replace(/"/g, '&quto;');
str = str.replace(/'/g, ''');
// str = str.replace(/ /g, ' ');
return str;
};
var name = escapeHtml(`<script>alert('SB')</script>`);
此时 name 会变成
<script>;alert('SB')</script>
CSRF
CSRF是跨站伪造(Cross-site request forgery)的英文缩写。CSRF 顾名思义,是伪造请求,冒充用户在站内的正常操作。我们知道,绝大多数网站是通过 cookie 等方式辨识用户身份(包括使用服务器端 Session 的网站,因为 Session ID 也是大多保存在 cookie 里面的),再予以授权的。所以要伪造用户的正常操作,最好的方法是通过 XSS 或链接欺骗等途径,让用户在本机(即拥有身份 cookie 的浏览器端)发起用户所不知道的请求。
要完成一次CSRF攻击,受害者必须依次完成两个步骤。
1.登录受新人的网站A,并在本地生成Cookie。
2.在不登出A的情况下,访问危险网站B。
一个CSRF攻击是如何工作的?
在他们的钓鱼站点,攻击者可以通过创建一个AJAX按钮或者表单来针对你的网站创建一个请求:
<form action="https://my.site.com/me/something-destructive" method="POST">
<button type="submit">Click here for free money!</button>
</form>
如何减轻CSRF攻击
-
只使用JSON api
使用JavaScript发起AJAX请求是限制跨域的。
不能通过一个简单的<form>来发送JSON,
所以,通过只接收JSON,你可以降低发生上面那种情况的可能性。 -
CSRF Tokens
最终的解决办法是使用CSRF tokens。
CSRF tokens是如何工作的呢?
服务器发送给客户端一个token。
客户端提交的表单中带着这个token。
如果这个token不合法,那么服务器拒绝这个请求。
参考:
网友评论