如果我使用$_GET['page'];
来获取URL参数页面的值,我必须在使用它之前对其进行过滤,以检查该值是否等于ex" home"或者只是检查它是否等于" home"?
if(isset($_GET['page']) && !empty($_GET['page'])) {
$page = $_GET['page'];
} else {
$page = 'home';
}
if($page === "home") {
include_once('home.php');
} else {
echo "error";
}
答案 0 :(得分:0)
如果页面地址看起来像http://example.com/?page=hello,那么
使用filter_var($_GET['page'], FILTER_SANITIZE_URL)
不会产生您正在寻找的结果。 $_GET['page']
的值仅为hello
,而不是整个网址。它不会通过URL过滤器。
当我们说您必须验证输入时,我们的意思是以下内容。考虑你编写这样的代码:
include $_GET['post'] . '.php';
如果请求为http://example.com/?page=hello,则此似乎非常有效,然后包含hello.php
。但是如果我要求http://example.com/?page=../db_config怎么办?如果你有一个安全性很差的数据库配置文件,其中包含纯文本密码,我将能够得到它,并为你的数据库做任何我想做的事。
要筛选出这种情况,您可能只想接受不遍历文件层次结构的值。例如,像这样:
// Word characters are a-z, A-Z, 0-9 and _.
// Non-word characters are dangerous for you!
// So if we detect any non-word character,
// we stop processing it immediately.
if (preg_match('~\W~', $_GET['page'])) {
print 'Forbidden to hack my pretty files!';
die;
}
在此检查之后,您可以安全地包含根据用户输入构建的文件名。