
[英]Requesting data using API Confusion between GET and POST | Is this curl get secure to use?
[英]Is it secure to use “require” with GET/POST data?
使用以下代码是否安全:
require($_SERVER['DOCUMENT_ROOT'] . "/pages/" . $_GET['page'] . ".php")
不,这不安全。 为什么?
因为两个点的序列/../表示一个目录返回,攻击者可能在您的系统上包含任何内容,甚至高于$_SERVER['DOCUMENT_ROOT']
。 (在一个不幸的配置中,这意味着秘密/敏感的OS配置文件。)
您必须IF或SWITCH以获取允许的值以防止恶意输入。 例:
switch($_GET['page']) {
case 'welcome': $page='welcome';
case 'shop': $page='shop';
default: $page='index';
}
require($_SERVER['DOCUMENT_ROOT'] . "/pages/" . $page . ".php")
还可以查看in_array()
以获得更轻松的过滤效果。
StackOverflow对如何使用PHP清理用户输入有一个有用的问答。 它已经有几年了,但原则并没有改变。
快速回答是:如果你可以首先避免这个问题,那你就更好了。
向我们展示您如何使用它,我们可以提供改进建议。
这不安全。 您可以使用具有允许值的数组。 例如
$allowed_pages = array('index', 'test', 'my_page')
if (!in_array($_GET['page'], $allowed_pages)){
echo 'good bye';
die();
} else {
//
}
如果您信任dir中的所有文件,请尝试:
if (in_array($_GET['page'],glob("/pages/*.php"))) {
require($_SERVER['DOCUMENT_ROOT'] . "/pages/" . $_GET['page'] . ".php");
} else echo "Nice try hacker!";
这是使用我用来清理上传文件名的函数部分的另一个解决方案:
选项#2 谢谢Daniel,Rok!
$page = preg_replace('/[^a-zA-Z0-9_ %\[\]\.\(\)%&-]/s', '', $_GET['page']);
$filename = $_SERVER['DOCUMENT_ROOT'] . "/pages/" . str_replace("/",'',$page) . ".php";
if (file_exists($filename)) {
require($filename);
} else echo "Nice try hacker!";
请注意,这仅在文件名中没有特殊字符时才有效
使用regExp检查$_GET['page']
!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.