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

Javascript 如何防止作为URL字段一部分发送的XSS,javascript,java,security,xss,Javascript,Java,Security,Xss,目前,我正在一个特定的网页上显示一个链接,该链接的URL由用户通过POST请求设置。该网站将显示给显示该链接的第二个用户(用户2)。当点击链接时,它将返回到用户1的网页(或者这就是它的目的)。但是最近出现了这种情况,如果URL被修改或者用户1是一个坏用户,它会将URL设置为Javascript://%0Aalert(document.domain)//,当单击链接时,它将执行脚本 如何在Java中验证此URL并防止用户1在POST请求传入时将其设置为正确的URI?有(至少)两种方法可以解决此问题

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

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

有(至少)两种方法可以解决此问题,您可以一起使用或单独使用:

  • 解析接收到的URL,并检查其所有组成部分(方案、主机名、端口、路径、查询字符串等)是否包含应用程序正常生成的合理值,以及您认为无害的值

    特别是,只要检查方案是否为
    http
    和/或
    https
    ,就足以阻止您问题中提到的特定攻击,尽管您几乎可以肯定应该做更多的验证

  • 最初生成URL时,计算其加密密钥(使用存储在服务器上且从未发送到客户端的密钥),并将其与URL一起发送。当您从客户端收到URL时,请验证MAC是否仍然匹配

    这是一种通用技术,用于确保客户机应原封不动地中继回服务器的值不会被篡改。如果您有多个这样的值,而不仅仅是一个URL,您可以将它们全部编码为一个字符串,并在所有这些值上计算一个MAC。只需确保编码是确定性的,以便在验证MAC时可以准确地重复编码。此外,您可能希望将其他元数据(如用户的ID和/或时间戳)组合到MAC输入中,以防止受到攻击


  • Java不是javascriptYup我知道这一点。我的后端服务器是java的。POST请求到达服务器,我想验证URL。然后你需要解释你是如何设置的,不清楚你在问什么。谢谢!我不想限制基于http或https的URI,因为我也想允许其他有效的URI(可能像google://),对于第二个解决方案,因为用户1发出POST请求来设置URL,所以我有点困惑,当数据发送给作为客户机的用户2时,密钥在这种情况下如何有用。让我知道你的想法!如果URL来自不受信任的来源(其他用户通常被视为不受信任的来源),并且您不想以任何方式对其进行限制,那么问题根本无法解决。毕竟,
    javascript:
    是一个完全有效的URI方案,用户可能会合法地选择它。你能得到的最接近的方法是编译一个“安全”URI方案列表-不应该包括
    javascript:
    -并禁止任何其他内容。这是有道理的。是的,在我的例子中,我认为用户1是一个不受信任的源,所以我可能不得不列出一个安全URI列表。再次感谢!