После прочтения большого количества комментариев @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";
}