当前位置: 首页 > 面试题库 >

危险地设置内部HTML是从React中的API渲染HTML的唯一方法吗?

翁钧
2023-03-14
问题内容

我正在用React制作电视指南。我正在从此API中获取表演信息:http :
//api.tvmaze.com/episodes/333

如您所见,summary包含html。如果我渲染该字段。那么HTML将被解释为字符串,这意味着您可以<p>在页面上看到标签等。

我知道我可以使用,dangerouslySetInnerHTML但出于安全原因不建议使用。最佳做法是什么?从API获取格式化的文本并需要呈现它必须非常普遍。我很惊讶,没有一个过滤器,这将允许<p><h1>等等,但不script标签。


问题答案:

危险地设置内部HTML是从React中的API渲染HTML的唯一方法吗?

从技术上讲,没有。如果愿意,可以使用Babel变压器做一些魔术,但是这种方法不再“安全”或推荐使用。这只是一个更灵活的选择。

也就是说,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>但没有脚本标记。



 类似资料:
  • 问题内容: 我需要能够在文本区域(即,,,)中呈现一些HTML标记,但是textareas仅将其内容解释为文本。有没有一种简单的方法,而无需依赖外部库/插件(我正在使用jQuery)?如果没有,您知道我可以使用任何jQuery插件吗? 问题答案: 这与不可能。您正在寻找的是一个内容可编辑的 div,这很容易做到:

  • 问题内容: 我需要能够在文本区域(即)中呈现一些HTML标记,但是textareas仅将其内容解释为文本。有没有一种简单的方法,而无需依赖外部库/插件(我正在使用jQuery)?如果没有,您知道我可以使用任何jQuery插件吗? 问题答案: 这与不可能。您正在寻找的是一个内容可编辑的 div,这很容易做到: jsFiddle

  • 我有一个HTML,使用 我想做的是懒惰加载图像的性能。我尝试了几个包,如react-lazyload,但它似乎并没有懒惰加载图像的方式。如果我将超文本标记语言字符串拉到React组件中,它确实有效。 延迟加载如何处理从加载的图像?我怎样才能懒散地加载图像?

  • 问题内容: 是否可以从外部源获取HTML / JSX内容并在React中动态呈现它?在我们的例子中,我们想从Wordpress API中获取内容,并在客户端和服务器上都进行渲染(我们正在使用NextJS) 因此,Wordpress API返回一个JSON响应,其中包括一个content属性,该属性是一串HTML / JSX。内容看起来像这样。 因此,如您所见,它将是HTML和React组件/ JS

  • 问题内容: 与在元素上设置元素的innerHTML与在元素上设置危险地设置InnerHTML属性有什么“幕后”区别?假设为简单起见,我正在对事物进行适当的消毒。 例: 与 我做的事情比上面的示例复杂一些,但总体思路是相同的 问题答案: 是,有一点不同! 使用vs 的直接效果是相同的-DOM节点将使用注入的HTML更新。 但是 ,在使用它时,让React 在幕后知道该组件内部的HTML并不是它关心的

  • 问题是: 使用Spring 4,我在访问网页时收到了这个消息 我所拥有的: 我有这个主类: 然后我有这个WebAppConfig.class(目前只有一些配置注释): 而这个控制器HomeController.java: 你好!!显示在日志中。 最后,我在上有一个html文件,其中只有一些html标签,包括一个标签,带有。 问题是: 我知道我错过了渲染视图的方式,但我搜索了几个关于stackove