验证并过滤URL参数

时间:2018-01-26 18:47:49

标签: php

如果我使用$_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";
}

1 个答案:

答案 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;
}

在此检查之后,您可以安全地包含根据用户输入构建的文件名。