是危险的SetInnerHTML从React中的API呈现HTML的唯一方法?
从技术上讲,没有。如果您愿意,您可以使用Babel变压器做一些魔术,但是这种方法不再“安全”或不值得推荐。这只是一个更灵活的选择。有关更多信息,请参阅here。
也就是说,dangerouslySetInnerHTML
仍然是将原始标记插入到组件中的推荐方法。没有错,这个名字很可怕,只是为了提醒开发商潜在的 XSS风险。您使用它的事实不会自动使您的代码“臭”或其他“坏”。
换句话说,如果你是某些你提取的代码不是恶意的,这是一个非常安全的选择。如果您信任该API,则无需担心。例如,这是绝对安全:
return <div dangerouslySetInnerHTML={{__html: "<p>foo bar</p>"}} />;
,所以是这样的:
let markup = SomeApiCallToTrustedProvider(); //"<p>foo bar</p>"
return <div dangerouslySetInnerHTML={{__html: markup}} />;
我在这个领域的专家,但我的理解是,如果用户不能影响为其他用户呈现您的网站,您可以安全地避免传统的XSS攻击。例如,如果您要从数据库中提取未经过清理的输入数据,并在代码中将其反映为原始标记。这将允许恶意用户向数据库提交代码,当向其他用户提交代码时,该代码将被有效执行,从而使用户能够操纵您的页面。
我很惊讶没有一个过滤器,允许<p>
,<h1>
等,但不是脚本标记。
那么,这将是某种消毒。有关于如何实现自己的代码片段,例如here ...
不是你的答案的直接问题,但你见过[this](https://stackoverflow.com/questions/29044518/safe - 其它对dangerouslysetinnerhtml)? –