如何检测一个字符串是否包含PHP码? PHP
How to detect if a string contains PHP code? PHP
我会记录对我的网站提出的每个请求。我非常清楚在执行任何包含来自查询字符串的数据的 MySQL 查询之前需要采取的安全措施。我尽可能地从注射中清理它,到目前为止所有测试都成功使用:
htmlspecialchars, strip_tags, mysqli_real_escape_string
。
但在访问页面的日志中,我发现包含大量 php 代码的失败黑客尝试的查询字符串:
?1=%40ini_set%28"display_errors"%2C"0"%29%3B%40set_time_limit%280%29%3B%40set_magic_quotes_runtime%280%29%3Becho%20%27->%7C%27%3Bfile_put_contents%28%24_SERVER%5B%27DOCUMENT_ROOT%27%5D.%27/webconfig.txt.php%27%2Cbase64_decode%28%27PD9waHAgZXZhb
在前面的例子中我们可以看到:
display_errors, set_time_limit, set_magic_quotes_runtime, file_put_contents
另一个例子:
/?s=/index/%5Cthink%5Capp/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=ctlpy.php&vars[1][]=<?php @assert($_REQUEST["ysy"]);?>ysydjsjxbei37$
这个最糟糕,里面甚至还有一些 <?php
和 $_REQUEST["ysy"]
的东西。虽然我能够对其进行清理,但在解码字符串时剥离标签并编码 <
或 >
我可以看到正在发送的请求类型。
有什么方法可以检测包含 php 代码的字符串,例如:
filter_var($var, FILTER_SANITIZE_PHP);
仅供参考:这不是一个真正的函数,我只是想说明我在寻找什么。
或某种函数:
function findCode($var){
return ($var contains PHP) ? true : false
}
再说一次,不是真的
无需清理,已处理完毕,只需检测字符串中的 PHP 代码。我需要这个,因为我想检测它们并将它们保存在其他日志中。
注意:切勿执行或评估来自查询字符串的代码
看了很多评论后,@KIKO Software 想出了一个巧妙的主意,使用 PHP 分词器,但最终变得极其困难,因为要分析的字符串需要具有几乎完美的语法或它会失败。
所以我想出的最好的解决方案是一个简单的函数,它试图找到常用的 PHP 语句,在我的例子中,尤其是在带有代码注入的查询字符串上。此解决方案的另一个优点是我们可以根据需要修改和添加任意数量的 PHP 语句。 请记住,使列表变大会大大降低您的脚本速度。此函数使用 strpos 而不是 preg_match (regex),因为它被证明执行速度更快。
这不会在字符串中找到 100% PHP 代码,但您可以自定义它以找到所需的代码,从不包括可以在常规英语中使用的术语,像 'echo' 或 'if'
function findInStr($string, $findarray){
$found=false;
for($i=0;$i<sizeof($findarray);$i++){
$res=strpos($string,$findarray[$i]);
if($res !== false){
$found=true;
break;
}
}
return $found;
}
只需使用:
$search_line=array(
'file_put_contents',
'<?=',
'<?php',
'?>',
'eval(',
'$_REQUEST',
'$_POST',
'$_GET',
'$_SESSION',
'$_SERVER',
'exec(',
'shell_exec(',
'invokefunction',
'call_user_func_array',
'display_errors',
'ini_set',
'set_time_limit',
'set_magic_quotes_runtime',
'DOCUMENT_ROOT',
'include(',
'include_once(',
'require(',
'require_once(',
'base64_decode',
'file_get_contents',
'sizeof',
'array('
);
if(findInStr("this has some <?php echo 'PHP CODE' ?>",$search_line)){
echo "PHP found";
}
我会记录对我的网站提出的每个请求。我非常清楚在执行任何包含来自查询字符串的数据的 MySQL 查询之前需要采取的安全措施。我尽可能地从注射中清理它,到目前为止所有测试都成功使用:
htmlspecialchars, strip_tags, mysqli_real_escape_string
。
但在访问页面的日志中,我发现包含大量 php 代码的失败黑客尝试的查询字符串:
?1=%40ini_set%28"display_errors"%2C"0"%29%3B%40set_time_limit%280%29%3B%40set_magic_quotes_runtime%280%29%3Becho%20%27->%7C%27%3Bfile_put_contents%28%24_SERVER%5B%27DOCUMENT_ROOT%27%5D.%27/webconfig.txt.php%27%2Cbase64_decode%28%27PD9waHAgZXZhb
在前面的例子中我们可以看到:
display_errors, set_time_limit, set_magic_quotes_runtime, file_put_contents
另一个例子:
/?s=/index/%5Cthink%5Capp/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=ctlpy.php&vars[1][]=<?php @assert($_REQUEST["ysy"]);?>ysydjsjxbei37$
这个最糟糕,里面甚至还有一些 <?php
和 $_REQUEST["ysy"]
的东西。虽然我能够对其进行清理,但在解码字符串时剥离标签并编码 <
或 >
我可以看到正在发送的请求类型。
有什么方法可以检测包含 php 代码的字符串,例如:
filter_var($var, FILTER_SANITIZE_PHP);
仅供参考:这不是一个真正的函数,我只是想说明我在寻找什么。
或某种函数:
function findCode($var){
return ($var contains PHP) ? true : false
}
再说一次,不是真的
无需清理,已处理完毕,只需检测字符串中的 PHP 代码。我需要这个,因为我想检测它们并将它们保存在其他日志中。
注意:切勿执行或评估来自查询字符串的代码
看了很多评论后,@KIKO Software 想出了一个巧妙的主意,使用 PHP 分词器,但最终变得极其困难,因为要分析的字符串需要具有几乎完美的语法或它会失败。
所以我想出的最好的解决方案是一个简单的函数,它试图找到常用的 PHP 语句,在我的例子中,尤其是在带有代码注入的查询字符串上。此解决方案的另一个优点是我们可以根据需要修改和添加任意数量的 PHP 语句。 请记住,使列表变大会大大降低您的脚本速度。此函数使用 strpos 而不是 preg_match (regex),因为它被证明执行速度更快。
这不会在字符串中找到 100% PHP 代码,但您可以自定义它以找到所需的代码,从不包括可以在常规英语中使用的术语,像 'echo' 或 'if'
function findInStr($string, $findarray){
$found=false;
for($i=0;$i<sizeof($findarray);$i++){
$res=strpos($string,$findarray[$i]);
if($res !== false){
$found=true;
break;
}
}
return $found;
}
只需使用:
$search_line=array(
'file_put_contents',
'<?=',
'<?php',
'?>',
'eval(',
'$_REQUEST',
'$_POST',
'$_GET',
'$_SESSION',
'$_SERVER',
'exec(',
'shell_exec(',
'invokefunction',
'call_user_func_array',
'display_errors',
'ini_set',
'set_time_limit',
'set_magic_quotes_runtime',
'DOCUMENT_ROOT',
'include(',
'include_once(',
'require(',
'require_once(',
'base64_decode',
'file_get_contents',
'sizeof',
'array('
);
if(findInStr("this has some <?php echo 'PHP CODE' ?>",$search_line)){
echo "PHP found";
}