Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 使用危险的LysetinerHTML呈现服务器响应而不进行清理是否明智?_Reactjs_Security_Dangerouslysetinnerhtml - Fatal编程技术网

Reactjs 使用危险的LysetinerHTML呈现服务器响应而不进行清理是否明智?

Reactjs 使用危险的LysetinerHTML呈现服务器响应而不进行清理是否明智?,reactjs,security,dangerouslysetinnerhtml,Reactjs,Security,Dangerouslysetinnerhtml,我认为使用React的危险的SetinenerHTML属性将从服务器获取的标记放置在页面上是非常常见的,例如 const SomeComponent = () => { const [markup, setMarkup] = useState(null) useEffect(() => { const resp = await fetch(...) setMarkup(resp.content) }) return <div dangero

我认为使用React的
危险的SetinenerHTML
属性将从服务器获取的标记放置在页面上是非常常见的,例如

const SomeComponent = () => {
  const [markup, setMarkup] = useState(null)

  useEffect(() => { 
    const resp = await fetch(...)
    setMarkup(resp.content)
  })

  return <div dangerouslySetInnerHTML={{ __hmtl: markup }} />
}
const SomeComponent=()=>{
const[markup,setMarkup]=useState(null)
useffect(()=>{
const resp=等待获取(…)
setMarkup(分别为内容)
})
返回
}
如果这是一个不同的场景,并且标记来自页面上的表单,这显然会带来风险,因为您不能信任表单上输入的数据,并且我们在这里没有进行任何清理

但是,我们将从服务器返回的数据放在页面上,因此可能存在某种程度的信任。对服务器的调用发生在代码中,我们可能知道正在调用的API


但是,即使我们信任服务器,考虑来自服务器的数据是否真的是不明智的?在数据返回之前,一个糟糕的参与者是否可以干预连线?

完全信任的问题
危险的LysetinerHTML

使用
危险的西丁神经HTML
采取最低限度的预防措施有很多原因。由于浏览器的逻辑是在别处定义的,因此在别处定义的逻辑将成为故障点

  • 审查和修改如何构建HTML代码逻辑的内部过程失败了吗?这是否允许XSS攻击
  • 是否有人忘记更新SSL证书?域名注册?已经有人在网络上抢占了它,现在你的应用程序使用了一个被劫持域的API
  • 是否有DNS名称服务器被黑客攻击,将您的API域指向其他服务器?路由器或任何网络设备的中间部件呢
  • 你自己的服务器被黑客攻击了吗?最不可能(眨眼),但也有可能
安全地使用
危险的LysetinerHTML

但是,有时您需要
危险地修改HTML
,因为这是最简单的解决方案。例如,存储、保存和检索粗体、斜体等标记非常容易,只需将其保存并存储为原始HTML即可

至少,在发送给用户之前,请清除任何
标记的数据,以绝对消除任何有害的可能性。您可以通过使用强制转换HTML,然后删除任何
标记节点来实现这一点

有趣的事实:当您创建带有
标记的元素时,SO的演示不喜欢它!下面的代码段将不会运行,但它在以下位置工作:

var el=document.createElement('html');
el.innerHTML=“有效段落。

另一个有效段落。

危险脚本!!!最后一段。

”; var scripts=el.getElementsByTagName('script'); 对于(var i=0;idocument.getElementById('main').append(el)谢谢你的回答。我还发现,关于“信任”问题的讨论更具一般性: