Как обеспечить наличие некоторых строковых данных в PHP-коде

У меня есть код ниже, в котором перечислены файлы из каталога и всех подкаталогов, и он работает нормально.

Теперь я хочу добиться отображения только 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");
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
33
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете сделать что-то похожее на приведенный ниже код, загружая каждый файл, а затем проверяя, содержит ли он какие-либо из этих строк.

Имейте в виду, что это будет не очень быстро, я бы подумал об использовании чего-то вроде 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.";
    }
}

Мой пример перебирает массив $checks и передает каждую из содержащихся в нем строк в strpos

atymic 20.07.2019 09:22

Благодарю. Ваше решение действительно работает просто отлично и отлично. пожалуйста, у вас есть альтернатива тому, как искать его быстрее с помощью метода grep. ожидаю услышать от тебя. Спасибо

chinazaike 20.07.2019 11:22

Например, что-то вроде этого выведет только те имена файлов, которые вы хотите найти: grep -r -l "unescape|system(|shell_exec("

atymic 20.07.2019 11:33

Вы должны сначала прочитать содержимое файла и выполнить поиск. Попробуйте заменить блок 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 20.07.2019 11:24

Ну, вы должны прочитать содержимое, чтобы найти эту строку. Вот почему это медленно.

A J 20.07.2019 11:26

@chinazaike см. этот связанный вопрос.

A J 20.07.2019 11:30

Другие вопросы по теме