PHP如何清理URL重定向

时间:2018-09-25 13:48:09

标签: php url

我在那里

我正在创建一个登录屏幕,它具有返回特定页面的功能。例如,假设我正在

  

/invoice/insert.php?id=20

如果会话过期,则系统重定向到

  

login.php?backUrl = /invoice/insert.php?id=20

其中backUrl是用户开始新会话时要重定向的URL。

现在,如果出现以下情况,我正在清理backUrl:

  1. 如果其中包含单词http:或https :,则整个URL都将被丢弃。
  2. 如果它包含单词..,那么它也会被丢弃。

身份验证是在每个页面上完成的,因此如果有人试图绕过安全性,我就不需要进行安全保护

  

login.php?backUrl = /adminpanel/users.php

我还缺少其他东西吗?

2 个答案:

答案 0 :(得分:0)

您可以使用此正则表达式:^(?!http|\.\.).+来确定字符串不是以'http'或'..'开头。

但是不安全,我建议您捕获任何看起来像^\/\w+

的网址

示例:/something

以下代码可以解决问题:

function isSafeParam($url) {
    return (bool) preg_match('#^\/\w+#',$url);
}

foreach(["/adminpanel/users.php","http://google.com","../miss/","./dl","//google.com","/my-page"] as $url) {
    var_dump(isSafeParam($url));
}

Online sample

答案 1 :(得分:-1)

这就是我解决这个问题的方式。

  1. 具有可接受的域白名单。 (可能只是一个)
  2. 使用适当的网址解析器将相对重定向网址扩展为绝对网址
  3. 解析结果网址,并查看该域是否在您的白名单中。

或者:找到一个URL解析器,它可以简单地告诉您一个URL是否是相对的。

使用能够理解URL的库比进行自己的即席黑客攻击要好。