在某些情况下,系统命令在PHP中失败


system command is failing in php for some case

嗨,我们正面临PHP的一个非常关键的问题。实际上我不知道这是PHP限制还是别的什么。我们真的需要一些专家的建议。我们在PHP中开发了一个重定向应用程序,我们捕获所有传入请求的变量,并使用系统命令将其存储在数据库中。但是最近我们发现,对于一些记录,它不能捕获变量到数据库中,尽管这些变量存在于APACHE日志文件中。请建议可能的问题,因为捕获变量直接影响业务。是因为php系统命令的限制,不能一次处理多个请求吗?交货。

dt.php?key=46232X&fh=E30103ERCQSM4WOZU61&id=ERCWOZU61

这是传入请求的正常模式。获取传入变量源的代码:

$query_string=$_SERVER['QUERY_STRING'];
 $referer=$_SERVER['HTTP_REFERER'];
 $uri=$_SERVER['REQUEST_URI'];

除了上面提到的变量,我不能放在这里,但我们正在捕获所有变量。

我正在使用的系统命令

system("nohup php $folder_path/incoming-process.php $p_id $cd $query_string $referer $ipaddress $uid $vid $uri > /dev/null &");

incoming-process.php

ignore_user_abort(true);
set_time_limit(0);
error_reporting(0);
include_once('database.php');
$project_id =$_SERVER['argv'][1];
$cd=$_SERVER['argv'][2];
$query_string=$_SERVER['argv'][3];
$referer=$_SERVER['argv'][4];
$ipaddress=$_SERVER['argv'][5];
$user_id=$_SERVER['argv'][6];
$vendor_rule_id=$_SERVER['argv'][7];
$vendor_id=$_SERVER['argv'][8];
$uri=$_SERVER['argv'][9];
$uri=urldecode($uri);
$query_string=urldecode($query_string);
$ipaddress=urldecode($ipaddress);

 //inserting variables & other details into Vendor_incoming_Info                           
$url = $uri;
parse_str(parse_url($url, PHP_URL_QUERY), $parts);
$keys = array_keys($parts);
$total=substr_count($uri, '=');
$uri=mysql_real_escape_string($uri);
$insert_incoming_info="insert into Vendor_Incoming_Info( Vendor_Id,Variable_Name,Value,User_Id) VALUES";
 for($i=0;$i<$total;$i++){
     $var=$keys[$i];
     $value=$parts[$var];
     if($var!='cd'){
        $insert_incoming_info=$insert_incoming_info." ('$vendor_id','$var','$value','$user_id') ,";
     }
    }
$insert_incoming_info= substr($insert_incoming_info,0,-1);
    $insert_incoming_info=$insert_incoming_info." ;";    
    mysql_query($insert_incoming_info);

您容易受到OS命令注入和SQL注入的攻击。

在这两种情况下,您都无法确保将值解释为预期的值,即作为字符串参数。

对于OS命令参数,使用escapeshellarg,例如:

$args = array(
    "php",
    "$folder_path/incoming-process.php",
    $p_id,
    $cd,
    $query_string,
    $referer,
    $ipaddress,
    $uid,
    $vid,
    $uri,
);
$args = array_map("escapeshellarg", $args);
$args = implode(" ", $args);
system("nohup $args > /dev/null &");

关于SQL参数值,请查看如何在PHP中防止SQL注入?