代码之家  ›  专栏  ›  技术社区  ›  magallanes

PHP如何清理指向重定向的url

  •  0
  • magallanes  · 技术社区  · 6 年前

    我在那儿

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

    /invoice/insert.php?id=20

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

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

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

    1. 如果它包含单词http:或https:,那么整个URL将被丢弃。
    2. 如果它包含单词。。然后它也被丢弃了。

    login.php?backUrl=

    我还缺什么吗?

    2 回复  |  直到 6 年前
        1
  •  0
  •   Yanis-git    6 年前

    您可以使用以下正则表达式: ^(?!http|\.\.).+

    但这并不安全,我建议您捕获任何如下url: ^\/\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

        2
  •  -1
  •   Evert    6 年前

    1. 有一个可接受域的白名单(可能只是一个)
    2. 使用适当的url解析程序将相对重定向url扩展到其绝对url
    3. 解析得到的url,并查看域是否在您的白名单中。

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