Php 此脚本易受LFI(本地文件注入)攻击吗?
我想知道这个小片段是否存在本地文件注入漏洞Php 此脚本易受LFI(本地文件注入)攻击吗?,php,security,code-injection,Php,Security,Code Injection,我想知道这个小片段是否存在本地文件注入漏洞 <?php $lang = $_GET['lang']; include '/some/dir/prefix_'.$lang.'whatever'; 你的意思是这样的吗 $lang .= 'en/../../../../../etc/passwd' . 0x00; 你可以通过 $path = '/some/dir/prefix_'.$_GET['path'].'whatever'; $path = realpath($path); if ((
<?php
$lang = $_GET['lang'];
include '/some/dir/prefix_'.$lang.'whatever';
你的意思是这样的吗
$lang .= 'en/../../../../../etc/passwd' . 0x00;
你可以通过
$path = '/some/dir/prefix_'.$_GET['path'].'whatever';
$path = realpath($path);
if (($path !== false) && (strncmp('/dir/some/prefix_', $path, 17) === 0)) {
// $path is fine
}
这将测试路径是否存在,以及是否确实在目录树下,您是否允许它存在。这应该足够了。在代码中直接使用用户输入总是很危险的。
最好让它检查该值是否在可接受的值数组中。好的,您可以将此值列为白名单,如
$possible_languages = array('en','fr','pt'); #preferably not hardcoded
$lang = $_GET['lang']
if( in_array($lang, $possible_languages) ){
# do your thing
}
else {
#error out
}
基本上。。。永远不要相信用户的输入。是的,我的意思是这样的。但不是这样。目录/some/dir/prefix_xy/不存在。文件系统如何将/some/dir/prefix_xy/./解析为/some/dir/?这是一个示例。也许你可以用
en
代替xy
(我在回答中改变了它)。现在prefix\u en
已经存在并且。
再次正常工作。无论如何,你不能相信它;)我引用我自己的话:“在/some/dir/目录中没有以'prefix'开头的子目录”。因此没有/some/dir/prefix\u en/目录。“whatever”指向一个文件。检查也可能是错误的。realpath(“/var/somehing”)可以返回“/mnt/somethingelse/”。我知道,这并不能回答我的问题,甚至是远程的。这个答案应该被接受。如果您不知道如何使用漏洞,这并不意味着漏洞无法使用。规则很简单:不要相信用户的输入。没有例外,我知道。我不是在使用这个代码,我只是在努力学习和理解。我很好奇。这不是我所期望的答案。仅仅因为这不是你所期望的答案,这并不意味着它是坏的或错误的。虽然这篇文章没有回答你提出的问题,但它为输入验证提供了很好的指导。