php readfile ('folder/subfolder' .$_GET ['userInput' ]) 安全问题?

标签 php security file-io

我有一个 page.php?id=example 并且在 page.php 中:

readfile('folder/subfolder/'.$_GET['id']);

id 变量是一个字符串并且可能取无限个不同的值,因此很难在 php 中枚举它们?

最多我可以验证所有字符都是字母。

如果 id 执行了 readfile($_GET['id']),我知道可以读取任何 php 文件并获得我的代码和数据库密码。

但是使用readfile('folder/subfolder/'.$_GET['id']):

  • 我知道 ../ 但我试过了,它似乎不起作用?它 告诉我:readfile(folder/subfolder/../../index.php): 无法打开 stream: 没有那个文件或目录
  • 如果我每次都检查 ./ 的存在,它会是 足够了还是有其他类似的技巧?
  • 我应该使用 int id 而不是字符串吗?
  • 我应该不这样做吗?

最佳答案

您应该永远将用户输入传递给文件操作。即使您转义了所有“.”,您也永远不会知道那里是否存在一些新的安全问题。

所以你可以

  • 将用户输入列入白名单,例如,通过使用 in_array 检查用户输入是否在您的列表中定义。
  • 使用上面提到的数字 ID(这样您就可以通过 (int) 转义用户输入)。
  • 如果您必须使用字符串输入,只允许定义的字符,例如,使用 preg_match('/^[A-Za-z0-9_-]+$/', $_GET[' id']);.

关于php readfile ('folder/subfolder' .$_GET ['userInput' ]) 安全问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25280531/

相关文章:

php - 在 PHP 中 while/foreach 内包装 3 个或更少的对象

php - 在外部(非 WP)脚本中包含 WordPress 导航

.net - 使用 WCF 和 DefaultCredentials 时如何处理密码更改?

java - PBE 算法参数不可用

c# - 以编程方式在方法体结束前插入代码行

c - 如何从文本文件中将数据作为字符读取,然后将每个字符除以一个 int

javascript - 我在登录表单中不断收到错误的用户名和密码

apache - 什么是代理服务器以及它如何帮助服务器架构

java - 使用 apache FTPclient 使用 Collections.sort() 排序和下载文件

php - 查找两个用户之间的公共(public)列,如果没有则查找 null/0