我想知道这个小片段是否受到本地文件注入漏洞的影响。
<?php
$lang = $_GET['lang'];
include '/some/dir/prefix_'.$lang.'whatever';
我知道通过在请求中放入'%00'(空字节)可以忽略的内容。但是如果/ some / dir /目录中没有以'prefix_'开头的子目录,那么漏洞就会发生吗?怎么样?
预先感谢anwser。
答案 0 :(得分:3)
你的意思是这样吗?
$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
}
如果路径存在并且它确实位于目录树下,则测试是否允许它存在。这应该足够了。
答案 1 :(得分:2)
直接在代码中使用用户输入始终是危险的 最好让它检查值是否在可接受值的数组中。
答案 2 :(得分:1)
嗯,你可以列出这个,比如
$possible_languages = array('en','fr','pt'); #preferably not hardcoded
$lang = $_GET['lang']
if( in_array($lang, $possible_languages) ){
# do your thing
}
else {
#error out
}
基本上......永远不要相信用户输入。