安全地处理$ _GET PHP

Nik*_*lay 1 php security get

我有这样的代码:

$myvar=$_GET['var'];

// a bunch of code without any connection to DB where $myvar is used like this:

$local_directory=dirname(__FILE__).'/images/'.$myvar;
if ($myvar && $handle = opendir($local_directory)) {
    $i=0; 
    while (false !== ($entry = readdir($handle))) {
        if(strstr($entry, 'sample_'.$language.'-'.$type)) {
            $result[$i]=$entry;
            $i++;
        }
    } 
    closedir($handle);
} else {
    echo 'error';
}
Run Code Online (Sandbox Code Playgroud)

我对一些剥离和转义函数有点困惑,所以问题是,$myvar为了安全起见,我需要做些什么呢?在我的情况下,我不进行任何数据库连接.

Ric*_*haw 5

您正试图阻止目录遍历攻击,因此您不希望该人放入./../../../或希望读取文件或文件名,这取决于您正在做什么.

我经常使用这样的东西:

$myvar =  preg_replace("/[^a-zA-Z0-9-]/","",$_GET['var']);
Run Code Online (Sandbox Code Playgroud)

这将替换任何不a-zA-Z0-9-带空白的内容,因此如果变量包含say *,则此代码将删除该代码.

然后我改变a-zA-Z0-9-以匹配我想在字符串中允许的字符.然后我可以将其锁定为仅包含数字或我需要的任何内容.

  • 当然是.在非常清楚的情况下,您可以将正则表达式更改为"/ ^(option1 | option2 | option3)"/而不是.始终尽可能限制输入. (2认同)