Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 此脚本易受LFI(本地文件注入)攻击吗?_Php_Security_Code Injection - Fatal编程技术网

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/”。我知道,这并不能回答我的问题,甚至是远程的。这个答案应该被接受。如果您不知道如何使用漏洞,这并不意味着漏洞无法使用。规则很简单:不要相信用户的输入。没有例外,我知道。我不是在使用这个代码,我只是在努力学习和理解。我很好奇。这不是我所期望的答案。仅仅因为这不是你所期望的答案,这并不意味着它是坏的或错误的。虽然这篇文章没有回答你提出的问题,但它为输入验证提供了很好的指导。