从 location.pathname 创建锚链接并清理数据

Create anchor link from location.pathname and sanitise data

提问人:Dandelion 提问时间:5/19/2023 最后编辑:Dandelion 更新时间:5/19/2023 访问量:160

问:

嗨,我正在尝试从 的内容生成面包屑,一切正常,除了当我通过 Veracode 运行代码时,它抱怨输入不受信任。window.location.pathname

我尝试将不受信任数据上的所有字符替换为以下内容:

untrustedData.replace(/[^A-Za-z0-9]/g, '');

Veracode仍然抱怨。以下是我所做的大致工作

const breadcrumbsElement = document.querySelector('#breadcrumbs');
const pathNames = window.location.pathname.split('/');

const sanitiseString = (string) => string.replace(/[^A-Za-z0-9]/g, '');

const addCrumb = (sanitisedRoute, element) => {
  const newCrumb = document.createElement('a');
  newCrumb.href = `/consumer/${sanitisedRoute}`;
  newCrumb.innerText = sanitisedRoute;
  element.appendChild(newCrumb);
};

pathNames.forEach((route) => {
  addCrumb(sanitiseString(route), breadcrumbsElement);
});

这是它给我的错误:


缺陷 ID:12

描述:此对 href() 的调用包含跨站脚本 (XSS) 缺陷。该应用程序使用不受信任的输入填充 HTTP 响应,允许攻击者嵌入恶意内容,例如 Javascript 代码,这些内容将在受害者浏览器的上下文中执行。XSS 漏洞通常被用于窃取或操纵 cookie、修改内容呈现和泄露机密信息,并定期发现新的攻击媒介。

修复:在使用所有不受信任的数据构造 HTTP 响应的任何部分之前,请对它使用上下文转义。应根据不受信任数据的具体用例来选择转义方法,否则可能无法完全抵御攻击。例如,如果数据正在写入 HTML 页面的正文,请使用 HTML 实体转义;如果要将数据写入属性,请使用属性转义;等。OWASP Java 编码器库和 Microsoft AntiXSS 库都提供上下文转义方法。有关上下文转义的更多详细信息,请参阅 https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.md。此外,作为最佳实践,请始终验证不受信任的输入,以确保其符合预期的格式,并尽可能使用集中式数据验证例程。


Veracode 特别抱怨 和element.appendChild()

newCrumb.href = `baseUrl${untrustedData}`;

我的问题是我如何清理window.location.pathNames,是否有更好的可信方法来获取当前pathNames,或者这只是Veracode的误报?

JavaScript DOM 清理 veracode

评论

0赞 mplungjan 5/19/2023
也许const breadcrumbs = window.location.pathname.split('/').map(string => string.replace(/[^A-Za-z0-9]/g, '')).map(path => { const newCrumb = document.createElement('a'); newCrumb.href = `/consumer/${path}`; newCrumb.innerText = path; }).join(" => ")
0赞 Dandelion 5/19/2023
感谢您的建议,但我并没有努力编写代码,实际上我拥有的代码比本示例中的代码做得更多。我的问题是:我不知道为什么 Veracode 在我对其进行清理时抱怨输入 (pathNames) 不受信任。
0赞 Dandelion 5/19/2023
Veracode 特别抱怨 element.appendChild() 和 newCrumb.href =baseUrl${untrustedData}
0赞 imvain2 5/19/2023
我知道这是一个“肮脏”的解决方案。但是,您始终可以向锚点添加一个单击处理程序,并将该 location.href 添加到 URL。
0赞 Dandelion 5/23/2023
感谢@imvain2那一半奏效了!实际上,我必须使用它才能通过Veracode扫描。所以锚现在正在工作,但我该如何设置?它应该具有路由,即不受信任的数据。window.open(untrustedData)element.innerText

答: 暂无答案