javascript - 安全地将表单参数反射(reflect)为 Javascript 变量,而不会扰乱 Fortify

标签 javascript asp.net fortify

我正在使用 Fortify 静态代码分析来分析我们的软件。 Fortify 报告称我们存在跨站点脚本漏洞(已反射(reflect)),但我认为我们实际上并没有这样做。

我可以尝试与客户争论这一点,让他们相信这是安全的(没有人愿意这样做,因为它需要审核),或者让 Fortify 满意;

我从 ASP.NET 的请求中获取表单参数,并“手动”(不使用 API)对其进行转义(转义任何换行符、\字符、引号并删除任何脚本标记)。然后我将其转储回浏览器,如下所示

output.Write("var enteredText = \"" + htmlEscape( Form.Params["enteredText"] ) +"\"");

加强投诉,除非我这样做

output.Write("var enteredText = \"" + htmlEscape( HttpUtility.HtmlEncode(Form.Params["enteredText"]) ) +"\"");
但这意味着要使用 Javascript var 'enteredText' 我必须使用 Javascript 对它进行 HTML 解码,这意味着我的应用程序上还有 10k 的代码(除非我错了)。在这种情况下,<>和实体的整个编码和解码都是多余的,不是吗?

如何安抚 Fortify?

最佳答案

如果应用程序允许在 EnteredText 字段中使用任意 JavaScript,并将其作为 JavaScript 在浏览器中执行,那么您确实存在反射性跨站点脚本漏洞,而且情况非常严重。任何可以导致用户针对您的应用程序发布帖子(例如,鱼叉式网络钓鱼攻击)的人都可能对用户造成各种伤害。这是一次非常简单的攻击。

因此,修复方法是以下之一

  • 拒绝此 EnteredText 字段中的 JavaScript(以及 HTML 和 CSS)。或者,如果这破坏了您的应用程序:

  • 查看需要在 EnteredText 字段中包含可执行代码并将可接受的值列入白名单的用例。对于 JavaScript,拒绝任何可能导致页面重写的内容:OnLoad()、document.body.innerHTML(例如)的事件处理程序或重定向用户的浏览器。
    同时拒绝任何可能发布到远程服务器的内容(例如表单、img、css 标签)。正如您所暗示的,这可能是很多代码。

这只是一个简单的示例,您需要研究可在跨站点脚本攻击中使用的标记和事件处理程序的类型。如果您不拒绝 EnteredText 字段中的内容,您仍然会遇到该漏洞。

希望这有帮助。祝你好运。

关于javascript - 安全地将表单参数反射(reflect)为 Javascript 变量,而不会扰乱 Fortify,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23574684/

相关文章:

javascript - Html 地理定位未在本地主机应用程序上请求许可?

javascript - 使用 createObjectURL 动态创建视频(流)

javascript - 访问另一个文件时未定义 fetch

asp.net 2.0 session 超时

javascript - 单击提交按钮后重定向 [HTML]

gradle - 使用 Gradle 进行 HP Fortify 扫描

Fortify SCA 排除测试文件夹\文件

javascript - 单击事件后将值连接到函数

asp.net - Gridview ControlState 非常大,即使禁用 View 状态并且不使用 DataKeyNames

java - Java 中 JSON 注入(inject)的强化错误