Вопросы безопасности, стоящие за этим фрагментом кода в PHP - PullRequest
1 голос
/ 07 июня 2009

Я читаю несколько книг по продвинутому PHP, и большую часть времени я нахожу код, подобный этому:

$classes = array ("MyClass1", "MyClass2");

if (!in_array ($_GET['class'], $classes))
    throw new Exception ("Class not found!");

$params = $_GET;

$obj = new $_GET['class'];

if (!method_exists ($_GET['method'], $obj)
    throw new Exception ("Method not found!");

echo $obj->{$_GET['method']}();

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

Мой вопрос: если проверяется имя класса, оно существует в массиве (я добавил это, это не было в примерах книги), какие соображения безопасности я должен принять больше? Имя класса будет выведено, поэтому фильтрация XSS не имеет особого смысла. Также имя класса не попадет в базу данных, поэтому фильтрация SQL-инъекций не нужна.

Заранее спасибо за все ваши ответы.

Ответы [ 4 ]

4 голосов
/ 07 июня 2009

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

class Foo
{
    function reset()
    {
        // rm -rf DocumentRoot
    }
}

Что, хотя и маловероятно, потенциально может быть там.

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

Но опять же, я бы никогда не использовал подобный код, я, вероятно, сделал бы какое-нибудь отображение <-> функции

3 голосов
/ 07 июня 2009

При добавлении проверки, чтобы увидеть, является ли класс одним из ограниченного набора значений, устраняется упомянутая вами проблема безопасности. Это известно как подход «белого списка» (где по умолчанию все запрещено, кроме того, что вы специально разрешаете) и является правильным подходом для такого рода вещей.

Параметр метода GET может иметь ту же проблему, но я не могу вспомнить ни одного обстоятельства, при котором это может быть использовано. В конце концов, у класса есть только ограниченный набор методов, особенно если это ваши классы. Тем не менее, возможно, стоит их отфильтровать, чтобы быть в безопасности, например, вы можете вызывать только методы, начинающиеся с "z" или чего-то еще.

1 голос
/ 07 июня 2009

я не видел проблемы. но вы можете добавить функцию filter_var в $ _GET, ссылка использовать это: http://net.tutsplus.com/tutorials/php/sanitize-and-validate-data-with-php-filters/

0 голосов
/ 07 июня 2009

Он открыт для эксплойтов внедрения кода.

По этой причине вы всегда должны очищать любые данные, возвращаемые из $ _GET, и никогда не полагать, что пользовательский ввод свободен от исполняемого кода (или какой-либо другой ошибки).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...