每日一问---关于前端安全XSS

关于前端安全XSS

XSS

XSS,即 Cross Site Script,中译是跨站脚本攻击;其原本缩写是CSS,但为了和层叠样式表(Cascading Style Sheet)有所区分,因而在安全领域叫做 XSS

攻击者通过恶意插入脚本,实现对用户访问网站内容的控制

其大致分为三种类型

1.反射型(Reflected XSS)

当服务器端脚本立即使用 web 客户端提供的数据(最常见的是 HTTP 查询参数(例如 HTML 表单提交))来解析并向用户显示结果页面时,这些漏洞就会显现出来

反射 XSS 是攻击者发现页面有这样的漏洞时发生的攻击,例如:

假如页面的HTML是如下

<body>
...
<div> showing results for keyword 
<script> 
    document.write(
        window.location.href.substr(window.location.href.indexOf('q=') + 2)
    )
</script>
</div>
...
...JavaScript results...
...
</body>

在此输入URL地址

期望的 URL: https://mywebpage.com/search?q=javascript

如果恶意注入代码如下

恶意URL: https://mywebpage.com/search?q=<script>恶意代码</script>

当攻击者诱使用户点击这种恶意的 URL ,用户敏感数据会被泄露

攻击的流程如下

image

2.存储型(Stored XSS)

攻击者提供的数据被服务器保存,然后在正常浏览过程中返回给其他用户的“正常”页面上永久显示,而没有适当的 HTML 转义。

其攻击流程如下

image

3.基于DOM型(DOM based XSS)

恶意代码通过 JavaScript 代码完全在客户端反映出来的

这种攻击和反射型是类似的,但不同的是,恶意的 URL 部分将不会被发送到服务器。 例如:

期望 URL: https://mywebpage.com/search?q=javascript

基于DOM型

恶意 URL:  https://mywebpage.com/search#q=<script>恶意代码</script>

如果在页面中存在

var text = document.getElementById("text");
text.innerHTML  = malicious URL

就会破坏DOM结构,攻击者就可以通过脚本实现控制内容


如何防护

每一个可以由用户输入并在您的应用程序中使用的值(无论是在服务器端还是在客户端)都应该被视为不受信任的数据,因此应该在使用前进行处理!

输入检测

对用户输入的内容进行检测并转义

function escapeText(text) {
  return text.replace(/&/g, '&amp;')
             .replace(/</g, '&lt;')
             .replace(/>/g, '&gt;')
             .replace(/"/g, '&quot;')
}
输出检查

在服务端数据渲染HTML的时候,使用编码或转义的方式避免


参考资料

XSS CSRF 例子
github book
<<白帽子讲 Web 安全>>

页面字体以及格式

<div style="font-size:18px;color:#333;line-height:24px;font-family:楷体;"> </div>

问题标题

<font style="font-weight:700"></font>

引用

<font style="color:blue;"></font>

一般层级

#### ##### ######

注意事项

<font style="color:red;"></font>

加重

<font style="font-weight:700;color:#333;"></font>

Recommended Posts