我在那里
我正在创建一个登录屏幕,它具有返回特定页面的功能。例如,假设我正在
/invoice/insert.php?id=20
如果会话过期,则系统重定向到
login.php?backUrl = /invoice/insert.php?id=20
其中backUrl是用户开始新会话时要重定向的URL。
现在,如果出现以下情况,我正在清理backUrl:
身份验证是在每个页面上完成的,因此如果有人试图绕过安全性,我就不需要进行安全保护
login.php?backUrl = /adminpanel/users.php
我还缺少其他东西吗?
答案 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));
}
答案 1 :(得分:-1)
这就是我解决这个问题的方式。
或者:找到一个URL解析器,它可以简单地告诉您一个URL是否是相对的。
使用能够理解URL的库比进行自己的即席黑客攻击要好。