我有一个 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/