【问题标题】:regex and $_GET正则表达式和 $_GET
【发布时间】:2009-06-26 13:44:46
【问题描述】:

我正在为一个朋友制作一个小网站,对菜鸟友好,所以她可以轻松添加页面。 我想我只是要将所有内容都包含在 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。我的意思是它不会是像谷歌这样的大网站。好吧,我只是一个业余爱好者,所以我要求大家确保:)

你怎么看?

【问题讨论】:

  • 您的正则表达式只检查至少一个字符是 [a-zA-Z] 并且可以随意忽略所有其他字符

标签: php security dynamic include


【解决方案1】:

你可以使用this.

ctype_alnum($_GET["page"]);

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      在决定包含输入之前对输入进行一些检查是个好主意。一方面,您可以在包含之前执行 is_file($filename)。

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

      问候 假的

      【讨论】:

        【解决方案4】:

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

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

        这样可以确保在允许的字母序列之前和之后没有任何内容。

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:
            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']) {
            ...
            

            【讨论】:

              猜你喜欢
              • 2015-12-29
              • 1970-01-01
              • 1970-01-01
              • 2017-01-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-03-21
              相关资源
              最近更新 更多