Reactjs 使用危险的LysetinerHTML呈现服务器响应而不进行清理是否明智?
我认为使用React的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
危险的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;i document.getElementById('main').append(el)代码>谢谢你的回答。我还发现,关于“信任”问题的讨论更具一般性: