我正在为朋友制作一个小网站,不友好,所以她可以轻松添加页面。 我想我只是要在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。我的意思是它不会是一个像谷歌这样的大网站。好吧,我只是一个爱好者,所以我要求大家确认:)
您怎么看?
答案 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)
我真的不喜欢在路径中编辑字符串,你永远不知道可以利用什么样的浏览器和文件系统。你真正应该做的不是实际使用他们的输入,而是用它来检查有效的文件名。
使用glob或scandir获取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']) {
...