XSS防范指南 【翻译】

原文地址: The definitive guide to XSS

什么是XSS,又称为跨站点脚本攻击

我们这样定义XSS:它是由于网站没有安全处理好用户输入导致该站点成为攻击自己用户的媒介的一种攻击;

通常,黑客可以利用我们网站的漏洞,注入JavaScript;
利用这些漏洞, 黑客可以窃取用户的信息;

通常,XSS分为三种:
1. 持久型XSS
2. 反射型XSS
3. 基于DOM型XSS

为什么说XSS危险?

黑客通常在你不知道,并且未经过你允许的情况的情况下,注入的JavaScript代码可以静悄悄地在你的用户浏览器运行,并把你用户的信息偷走。
这是非常危险的。

xss只是前端或者后端的问题吗?

这是涉及前端和后端的问题。

xss示例

XSS通常发生在你允许用户输入任意的字符,并且你存储在后端然后再展示出来。

例如,你有一个博客,你允许用户进行评论,然后有一些恶意的用户输入了恶意代码注入,当其他用户加载他的评论的时候,当你没有任何阻止的措施的时候,恶意代码就自动运行了。例如他输入了

<script> alert('xss');</script>

使用alert 是因为这里只是作为一个简单的示例.

什么是持久型XSS

持久型XSS是三种XSS之一。这是我上面在博客文章示例中描述的内容。

什么是反射型XSS?

Reflected XSS是一种通过向最终用户提供一个内部包含脚本的链接来动态利用站点中漏洞的方法。 这样,攻击者提供的链接类似于

yoursite.com/?example=<script>alert('test')</script>

如果您的网站使用example GET变量执行某项操作并将其显示在页面上,并且您没有检查和清除其值,那么该脚本将由用户的浏览器执行。

一个典型的例子是搜索表单。它可能位于*/ search URL*中,并且您可以使用GET term变量接受搜索词

当有人搜索<term>字符串时,您可能会显示它。现在,如果您不对value进行过滤,那么现在就会遇到问题

垃圾邮件/网络钓鱼电子邮件是这种XSS攻击的常见媒介。当然,网站越大越重要,黑客就越会尝试对其进行黑客入侵。

什么是DOM型XSS?

使用持久性XSS,必须将攻击代码发送到服务器,然后可以在服务器上进行清理(并希望将其清除)。对于反射的XSS,同样如此

基于DOM的XSS是一种XSS,其中恶意代码永远不会发送到服务器。通常,这是通过使用网址的片段部分或通过引用document.URL / document.location.href来实现的。您在网上发现的一些示例实际上不再起作用,因为现代浏览器会自动为我们在地址栏中转义JS。它们只有在您取消转义时才起作用,这有点吓人(不要这样做!)

这是一个简单的工作示例。假设您有一个页面正在http://127.0.0.1:8081/testxss.html上收听。您的客户端JavaScript会查看URL片段部分中传递的测试变量:
http://127.0.0.1:8081/testxss.html#test=something#test = something
值永远不会发送到服务器。

仅限本地。持久/反映的XSS将不起作用。但是说您的脚本使用以下命令访问该值:

const pos = document.URL.indexOf("test=") + 5;
const value = document.URL.substring(document.URL.indexOf("test=") + 5, document.URL.length)

然后你直接把它写在了页面上:

document.write(value)

一切都很好,直到有人像这样调用URL:
http://127.0.0.1:8081/testxss.html#test=
现在,由于引用document.URL会自动转义,在这种情况下,什么也不会发生。
你会得到

%3Cscript%3Ealert('x')%3C/script%3E

打印到页面。该值已转义,因此不会被解释为HTML。

但是,如果由于某种原因而取消了转义document.URL值,那么在运行JavaScript时现在会遇到问题。任何JS都可以在您的用户浏览器上运行。

有什么预防措施?

有三种方法:
1.校验
2.编码
3.CSP

如果你需要添加html元素到页面上,使用

document.querySelector('#myElement').textContent = theUserGeneratedInput

如果你想新建元素到页面,使用

const el = document.createTextNode(theUserGeneratedInput)

如果你想设置元素的属性,使用

document.querySelector('#myElement').setAttribute('attributeName', theUserGeneratedInput)

如果你想添加参数到URL,使用

window.location.href = window.location.href + '?test=' + window.encodeURIComponent(theUserGeneratedInput)

通常,当您无法使用转义来过滤输入时,通常会进行验证。一个常见的示例是CMS,它使用户可以用HTML定义页面的内容。你无法转义。

您可以使用黑名单或白名单策略进行验证。区别在于,通过将其列入黑名单,您可以决定要禁止哪些标签。使用白名单,您可以决定要允许哪些标签。白名单更安全,因为黑名单容易出错,复杂并且也不适合未来。

CSP表示内容安全策略。这是浏览器实施的一项新标准,仅强制执行来自安全和受信任来源的JavaScript代码,并且您可以禁止在代码中运行内联JavaScript。例如,允许上述XSS利用的JavaScript类型。

Web服务器通过在提供页面时添加Content-Security-Policy
HTTP标头来启用CSP

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值