正则表达式和$ _GET

时间:2009-06-26 13:44:47

标签: php security dynamic include

我正在为朋友制作一个小网站,不友好,所以她可以轻松添加页面。 我想我只是要在index.php中包含所有内容。所以她只需将页面放在名为 / pages / 的文件夹中就可以了。

的index.php

if (preg_match('/[a-zA-Z]/', $_GET['page'])){
$page = 'pages/'.$_GET['page'].'.php';

if ($page) {
include $page;
} else {
exit;
}

} else {
include('pages/home.php');
}

这是非常安全的吗?我只允许字母a-z。我的意思是它不会是一个像谷歌这样的大网站。好吧,我只是一个爱好者,所以我要求大家确认:)

您怎么看?

6 个答案:

答案 0 :(得分:3)

您可以使用this.

ctype_alnum($_GET["page"]);

答案 1 :(得分:2)

要确保这一点,请确保您的正则表达式为/^[a-z]+$/i。这会检查整个字符串(^是开头,$是结尾)以确保它只是按字母顺序排列。那么你的工作将是安全的(至少在这一部分)。

答案 2 :(得分:1)

没有。 a /../../../也将匹配正则表达式

使用'/^[a-zA-Z]+$/'

通过这种方式,您可以确保在允许的字母序列之前和之后没有任何内容。

答案 3 :(得分:1)

在决定包含它之前对输入运行一些检查是个好主意。首先,你可以在包含之前做一个is_file($ filename)。

另一件事,你的正则表达式设置为只允许一个字符atm - 可能不是你想要的。另一件事:正如上一张海报所说,正则表达式只检查输入看起来是否正常。之后,使用_GET变量。您应该使用preg_match的结果(您可以将结果分配给数组)以避免上述问题。

此致 假

答案 4 :(得分:1)

我真的不喜欢在路径中编辑字符串,你永远不知道可以利用什么样的浏览器和文件系统。你真正应该做的不是实际使用他们的输入,而是用它来检查有效的文件名。

使用globscandir获取pages目录中的文件列表,然后使用in_array查看请求的字符串是否为文件。如果你试图去掉路径元素,那么你就会犯错误。

答案 5 :(得分:0)

preg_match('/[a-zA-Z]/', $_GET['page'], $match)

if ($match) {
    $page = "pages/$match.php";
    if(file_exists($page){
        include $page;
    } else {
        include "pages/404.php";
    }
} else {
    include "pages/home.php";
}

也许?如果'page'设置为'blabla89349',则会包含页面'blabla.php'。我不确定这是不是你的意图?否则你可能会严格要求和

if ($match == $_GET['page']) {
...