【问题标题】:javascript allow redirection only for urls inside same domainjavascript 仅允许重定向同一域内的 url
【发布时间】:2015-07-22 06:36:18
【问题描述】:

我有一个 javascript,它通过设置处理“登录后重定向”问题

window.location = url;

其中“url”由 GET 参数提供。 这听起来是一种不好的做法,因为它允许重定向到当前域之外。

所以我想知道是否有一种简单且安全的方法来检查“url”是否是同一域内的绝对 url,并且仅在这种情况下允许重定向。 目前我只是检查 url 是否以“/”开头并且不包含“http”,但我不确定它是否足以完全防止打开重定向。

if (url[0] === '/' && url.indexOf('http') === -1)
{
    window.location = url;
} 

当我在客户端执行此操作时,我知道它仍然不完美,但以前根本没有任何保护。

我可以使用好的旧 JS 或 jquery。我还要支持IE9。

后期编辑:也许我没有足够清楚地提到它,但“url”应该是一个绝对 url,没有域规范。 例如,我有这种地址(末尾带有 url 参数的完整地址): http://example.com/Account/Login.aspx?ReturnUrl=%2fCheckout.aspx

我需要避免: http://example.com/Account/Login.aspx?ReturnUrl=http://otherdomain/badintention.aspx

这就是为什么我在上面告诉我,我目前检查它是否以“/”开头,但我不确定它是否足以保证安全。所以我不能使用你的一些建议。

谢谢

【问题讨论】:

    标签: javascript jquery url redirect


    【解决方案1】:

    您可以使用(相当新的)URL Api:

    var redirUrl = "http://www.somewebsite.com/some/path";
    var currentHost = location.host;
    
    if (new URL(redirUrl).host != currentHost)
        return false;
    

    【讨论】:

    • 谢谢,很高兴知道。不幸的是,我必须支持 IE9 和其他相当旧的浏览器。我已经编辑了问题。
    【解决方案2】:

    您能否只从服务器发出 HTTP 307 临时重定向而不必担心客户端代码?这样看起来更安全。 http://en.wikipedia.org/wiki/URL_redirection

    否则,您的 javascript 也会检查 window.location.hostname。

    编辑:如果您只允许使用相对 URL,那么只要您 100% 确定它是一个 URL,那么在开头检查“/”似乎应该是相当安全的,但您甚至可以添加将 window.location.hostname 放在开头,以绝对确定您正在消除语义欺骗的可能性。

    【讨论】:

    • 谢谢,我已经编辑了这个问题。也许我不够清楚,但提供的网址根本不应该包含域,只有绝对网址以“/”开头。
    • 你的意思是相对URL?我正在调整我的答案以提出建议。
    【解决方案3】:

    你可以用window.document.domain 获取当前域名,检查GET操作提供的url是否有这个?

    抱歉,理想情况下应该是评论,但没有足够的权限。

    【讨论】:

    • 任何应该是评论的东西都不应该是答案。
    • 谢谢,我已经编辑了这个问题。也许我不够清楚,但提供的网址根本不应该包含域,只有绝对网址以“/”开头。
    猜你喜欢
    • 2013-07-02
    • 2023-03-27
    • 2021-04-04
    • 2019-06-29
    • 2022-10-12
    • 2015-11-13
    • 2019-10-05
    • 2023-02-01
    • 2014-04-06
    相关资源
    最近更新 更多