嗨,我们正面临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注入?