【问题标题】:Preventing the user from entering javascript instead of a url for use in an href防止用户输入 javascript 而不是在 href 中使用的 url
【发布时间】:2010-11-30 04:24:11
【问题描述】:

我需要阻止用户将 javascript 放入应该是链接字段的内容中。我知道我可以在他们输入的 url 的开头检查“javascript:”,但我想知道是否有某种方法可以构造 <a> 标记以强制它将 href 视为地址?我觉得这将是一个更好的解决方案,因为人们总是想方设法绕过基本检查。

【问题讨论】:

  • 目的是什么?该字段是否被发送到服务器?如果是这样,那么验证应该真的发生在那个端。任何人都可以与客户胡闹,让它为所欲为。
  • 这是为了阻止用户制造 XSS 攻击。

标签: javascript href sanitization


【解决方案1】:

一个有趣的解决方案(如果你问我非常有效)是将http:// 放在尚未以它开头的网址前面。这是我的意思的草图:

if(url.slice(0,"http://".length) !== "http://" && url.slice(0,"https://".length) !== "https://") {
    url = "http://" + url;
}

【讨论】:

    【解决方案2】:

    我猜白名单比黑名单更好,并检查 http(s) 协议。

    【讨论】:

    • 我就是这么想的。我可能只是要求 URL 以 http 或 https 开头
    【解决方案3】:

    您总是可以预先添加 http:// 或 https:// 协议。可能需要替换才能删除任何现有的 http 或 https。

    即使你有

    http://javascript:alert('test');
    

    javascript 不会运行。

    【讨论】:

      【解决方案4】:

      首先,您应该认识到可以操纵浏览器提交用户想要的任何内容,因此客户端验证既不必要也不充分,只是方便(对用户而言)。

      鉴于此,我想到了一个简单的过程:

      • 通过在 URL 的开头要求协议规范来强制每个 URL 都是绝对的。
      • 强制协议是 {http, https} 之一。

      试试这个:

      function validateUrl(value) {
        return value.match(/^(http|https):\/\//) != null;
      }
      
      if(validateUrl(inputField.value)) {
        // value is acceptable
      } else {
        // value is not an acceptable URL
      }
      

      【讨论】:

        【解决方案5】:

        没有强制标签将 href 视为 URL 的纯 HTML 方式。

        您唯一能做的(我知道的)就是在 href 属性中检查 javascript。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-03-11
          • 2011-01-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-28
          • 2013-05-26
          相关资源
          最近更新 更多