You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中使用dangerouslySetInnerHTML渲染的链接无法在新标签页打开

解决React中DOMPurify清理后链接无法在新标签页打开的问题

DOMPurify 默认会过滤掉 target 属性,这就是你渲染后的链接无法在新标签页打开的原因。你可以通过配置 DOMPurify 的钩子或属性白名单来解决这个问题,推荐使用钩子自动为所有链接添加安全的新标签页属性:

方法一:自动为所有链接添加 target="_blank" 和安全属性

通过 afterSanitizeAttributes 钩子,在清理完成后自动给 <a> 标签添加目标属性,同时加上安全必备的 rel="noopener noreferrer"(防止新页面篡改原页面上下文):

import DOMPurify from 'dompurify';

// 全局配置DOMPurify钩子,只需初始化一次
DOMPurify.addHook('afterSanitizeAttributes', (node) => {
  if (node.tagName === 'A') {
    node.setAttribute('target', '_blank');
    node.setAttribute('rel', 'noopener noreferrer');
  }
});

// 在组件中使用
function HtmlRenderer({ htmlString }) {
  const sanitizedHtml = DOMPurify.sanitize(htmlString);
  return <div dangerouslySetInnerHTML={{ __html: sanitizedHtml }} />;
}

方法二:仅允许已有 target 属性保留

如果你只需要保留原HTML中已存在的 target 属性,不需要自动添加,可以修改 DOMPurify 的属性白名单:

import DOMPurify from 'dompurify';

// 配置允许a标签使用target属性
DOMPurify.setConfig({
  allowedAttributes: {
    ...DOMPurify.defaults.allowedAttributes,
    'a': [...(DOMPurify.defaults.allowedAttributes['a'] || []), 'target']
  }
});

注意事项

  • rel="noopener noreferrer" 是安全最佳实践,必须添加,避免新打开的页面通过 window.opener 控制原页面,防止钓鱼或恶意攻击。
  • 全局配置的钩子只需在应用初始化时执行一次,无需在每个组件重复设置。

内容的提问来源于stack exchange,提问作者Anurag Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 05:37:33