1

我正在解析一个不受信任的 URI,但它的 URI-hood 必须得到尊重。我试图防止javascript:链接,但我觉得我需要递归它,因为你可以:

javascriptjavascript::

并在删除所有实例后再次javascript:找回我们的老朋友。javascript:

我的另一个问题是类似嵌套的 unicode 实体。例如,我们可以有:

"j&#X41vascript:alert('pwnt')"

...但我们也可以有:

"j&#&#X5841vascript:alert('pwnt')"

...尽管我似乎做错了(而成功的攻击者显然不会。)

function resolveEntities(uri) {
  var s = document.createElement('span')
    , nestTally = uri.match(/&/) ? 0 : 1
    , limitReached = false;

  s.innerHTML = uri;
  while (s.textContent.match(/&/)) {
    s.innerHTML = s.textContent;
    if(nestTally++ >= 5) {
      limitReached = true;
      break;
    }
  }

  return encodeURI(s.textContent);
}
4

2 回答 2

3

你之前不是已经问过几乎同样的问题了吗?无论如何,我的建议保持不变:使用适当的 HTML sanitizer

我链接到的特定清理程序会javascript:自动删除 URL,但您也可以将其设置为仅允许某些列入白名单的 URL 方案,如 Thomas 建议的。正如他所指出的,这是一个好主意,因为只允许您知道http安全的方案更安全。https

(特别是,给定的模糊 URL 方案是否安全可能不仅取决于用户的浏览器,还取决于他们的操作系统以及他们可能安装的第三方软件——许多程序喜欢将自己注册为处理程序用于他们自己的 URL 方案。)

于 2012-09-08T15:58:31.080 回答
2

与其指定您想要列入黑名单的内容(例如javascript:URI),不如指定您想要列入白名单的内容(例如http并且https仅)。像这样的东西怎么样:

function sanitizeUri(uri) {
  if (!uri.match(/^https?:\/\//)) {
    uri = "http://" + uri;
  }
  return uri;
}
于 2012-09-08T14:44:40.083 回答