У меня есть код ниже, в котором перечислены файлы из каталога и всех подкаталогов, и он работает нормально.
Теперь я хочу добиться отображения только PHP-файлов, содержащих следующие строковые функции. eval, система, shell_exec.
Я думаю, мне нужно создать массив, например
$check=array("unescape", "system(","shell_exec(");
Ниже приведен код, в котором перечислены все файлы PHP.
function c_check($path){
if (file_exists($path) && is_dir($path)){
$files = glob($path ."/*");
if (count($files) > 0){
// Loop through retuned array
foreach($files as $file){
if (is_file("$file")){
// Display only filename
echo basename($file) . "<br>";
} else if (is_dir("$file")){
c_check("$file");
}
}
} else{
echo " directory file not found";
}
} else {
echo " directory does not exist.";
}
}
// Call the function
c_check("../content_folder");






Вы можете сделать что-то похожее на приведенный ниже код, загружая каждый файл, а затем проверяя, содержит ли он какие-либо из этих строк.
Имейте в виду, что это будет не очень быстро, я бы подумал об использовании чего-то вроде grep и разборе его вывода.
function c_check($path)
{
$checks = ["unescape", "system(", "shell_exec("];
if (file_exists($path) && is_dir($path)) {
$files = glob($path . "/*");
if (count($files) > 0) {
// Loop through returned array
foreach ($files as $file) {
if (is_file("$file")) {
$fileContents = file_get_contents($file);
foreach ($checks as $illegalString) {
if (strpos($fileContents, $illegalString) !== false) {
echo basename($file) . "<br>";
}
}
} else {
if (is_dir("$file")) {
c_check("$file");
}
}
}
} else {
echo " directory file not found";
}
} else {
echo " directory does not exist.";
}
}
Благодарю. Ваше решение действительно работает просто отлично и отлично. пожалуйста, у вас есть альтернатива тому, как искать его быстрее с помощью метода grep. ожидаю услышать от тебя. Спасибо
Например, что-то вроде этого выведет только те имена файлов, которые вы хотите найти: grep -r -l "unescape|system(|shell_exec("
Вы должны сначала прочитать содержимое файла и выполнить поиск. Попробуйте заменить блок if в цикле foreach этим.
if (is_file("$file")){
$contents = file_get_contents($file);
if (strpos($contents, "eval")!==false || strpos($contents, "system")!==false || strpos($contents, "shell_exec")!==false){
//this is the file you're looking for.
}
}
Он читает содержимое файла и выполняет поиск слов.
Спасибо, ваше решение также отлично работает, но оно медленное.
Ну, вы должны прочитать содержимое, чтобы найти эту строку. Вот почему это медленно.
@chinazaike см. этот связанный вопрос.
Мой пример перебирает массив
$checksи передает каждую из содержащихся в нем строк вstrpos