Как использовать функцию eval () для выполнения кода? - PullRequest
0 голосов
/ 24 сентября 2018

Итак, я создаю простой онлайн-редактор php-кода для школьного проекта.Мы решили сделать это сами, а не использовать такую ​​библиотеку, как codemirror.

Так что в основном у нас есть большая текстовая область, куда вы помещаете свой код, который затем отправляется в другой файл php, который выполняет код с использованием php Eval() функция.Но по какой-то причине он продолжает выдавать ошибки POST, когда мы пытаемся отправить что-то вроде: Echo, While, If.(Ошибка: 500)

Простые вещи, такие как: 2 + 4, хорошо выполнить (вывод: 6).

Итак, первый вопрос: можно ли вообще выполнить php?код, который мы хотим использовать с помощью Eval ()?

Вторым будет: есть ли другой способ сделать то, что мы хотим?если да, пожалуйста, предоставьте дополнительную информацию / код.

Наш текущий код:

editor.php

<textarea id="area" cols="70" rows="30"></textarea>
<button id="submit">Submit</button>

<script>
    $('#submit').click(function (e) {
        e.preventDefault();

        var info = $('#area').val();

        $.ajax({
            type: "POST",
            url: 'pages/assignments/response.php',
            data: {area: info},
            success: function (response) {
                console.log(response);
            }
        });
    });
</script>

Response.php

<?php
if (!empty($_POST['area'])) {
    runEval($_POST['area']);
};

function runEval($data)
{
//    $data = preg_replace('/\s+/', '', $data); doesn't seem to work at all with it)
    $characters = '[a-zA-Z0-9]*';
    $functions = '';
    $operators = '[\w-><$(){}|_+=":;!&*%$]';
    $regexp = '/^((' . $characters . '|' . $functions . '\s*\((?1)+\)|\((?1)+\))(?:' . $operators . '(?2))?)+/'; /*honestly we have no idea what it does, because we copied it and changed the $characters,$functions,$operators*/

    if (preg_match($regexp, $data)) {
        eval('$result = ' . $data . ';');
        echo $result;
    } else {
        $data = false;
    }
}

?>

1 Ответ

0 голосов
/ 24 сентября 2018

Я думаю, что код, который вы скопировали, изначально использовался для математических или строковых операций, потому что он присваивает значение переменной (eval('$result = ' . $data . ';')).

Попробуйте удалить $result = и оператор echo ипосмотрите, работает ли он.

Из документов:

Код не должен переноситься при открытии и закрытии тегов PHP, т.е. 'echo "Hi!";'должен быть передан вместо ''.Все еще можно выйти и войти в режим PHP, используя соответствующие теги PHP, например, 'echo "В режиме PHP!";?> В режиме HTML!

Кроме того, переданный код должен быть действительным PHP.Это включает в себя то, что все операторы должны быть правильно завершены с помощью точки с запятой.'echo "Hi!", например, вызовет ошибку разбора, тогда как' echo "Hi!"; 'будет работать.

Оператор return немедленно прекратит оценку кода.

Код будет выполнен в объеме кода, вызывающего eval ().Таким образом, любые переменные, определенные или измененные в вызове eval (), останутся видимыми после его завершения.

http://php.net/manual/ro/function.eval.php

Кстати, обратите внимание, что, как сказано в документации, eval ()очень опасно, потому что позволяет выполнять любого вида действительного php-кода на сервере.

См .:

https://security.stackexchange.com/questions/179375/how-eval-in-php-can-be-dangerous-in-web-applications-security

...