如何防止作为 URL 字段的一部分发送的 XSS

How can you prevent XSS that is sent as part of URL field

目前我在特定网页上显示 link,用户通过 POST 请求设置了 URL。该网站显示给显示 link 的第二个用户(用户 2)。单击 link 时,它将返回到用户 1 的网页(或者这就是它的目的)。但是最近出现了这种情况,如果 URL 被修改或者用户 1 是不良用户,它将 URL 设置为 Javascript://%0Aalert(document.domain)//,当 link 被点击时将执行脚本。

如何在 Java 中验证此 URL 并防止用户 1 在 POST 请求进入时将其设置为 URI?

有(至少)两种方法可以解决这个问题,可以一起使用也可以单独使用:

  1. 解析收到的 URL 并检查其所有组成部分(方案、主机名、端口、路径、查询字符串等)是否包含您的应用通常会生成的合理值并且您相信它是无害的。

    特别是,只需检查该方案是否为 http and/or https 就足以阻止您问题中提到的特定攻击,尽管您几乎肯定应该做一些不止于此。

  2. 当最初生成 URL 时,计算它的密码 message authentication code(使用存储在您的服务器上且从未发送给客户端的密钥)并将其一起发送URL。当您收到客户端返回的 URL 时,验证 MAC 是否仍然匹配。

    这是一种通用技术,用于确保 应该 由客户端原封不动地中继回服务器的值未被篡改。如果您有多个这样的值,而不是只有一个 URL,您可以将它们全部编码成一个字符串,并在所有这些值上计算一个 MAC。只要确保编码是确定性的,这样你就可以在验证 MAC 时准确地重复它。此外,您可能希望将其他元数据(例如用户 ID and/or 时间戳)合并到 MAC 输入中,以防止 replay attacks.