Когда PHP-код действительно должен рассматриваться как небезопасный?

Вчера я принял участие в интервью для должности разработчиков PHP. Моя задача - решить 15 вопросов довольно простой тест. Один из вопросов заключался в том, чтобы решить, что кодекс, похожий на ниже, должен рассматриваться как небезопасный. Я дал неверный ответ (и, как выяснилось), и аргументация от другого человека на этом интервью была довольно удивительной (по крайней мере для меня).

Код был примерно таким:

function someFunction($a)
{
    echo $a * 4;
}

someFunction($_GET['value']);

Возможные ответы:

  • всегда,
  • только когда register_globals включен,
  • никогда.

Вы можете получить один балл за правильный ответ, а второй - за хорошее объяснение (аргументацию) ответа на выбранный ответ.

Мой ответ был третьим: этот код никогда не опасен. Плюс аргументация: Потому что это просто простое уравнение. Здесь нет операций с файлами или базами данных, нет потоков, протоколов и ничего. Это просто уравнение. Ничего больше. Атакующий не может что-то сделать с PHP script, неважно, каким образом неверный URL-запрос, который он или она попытается выполнить. Нет шансов.

У меня есть нулевые очки. Ни мой ответ не был правильным, ни моя аргументация не была принята. Правильный ответ: этот код всегда небезопасен - вы должны всегда бежать, что вы получили из запроса URL.

Мой вопрос: это действительно хорошая точка зрения? Нужно ли нам всегда использовать эмпирическое правило, что все, что взято непосредственно из запроса, является небезопасным, если его не фильтровать, избегать или защищать каким-либо другим способом? Означает ли это, что я преподаю своим ученикам методологии нечеткого кодирования, потому что на первой лекции PHP они пишут script для вычисления области треугольника, и они используют неэквивалентные, нефильтрованные параметры из URL в своей задаче?

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

Или, может быть, я совершенно не прав, и вы можете нанести вред функции, которая повторяет четыре раза, что вы ему дали?

Ответ 1

Проблема в том, что позже кто-то может изменить функцию "somefunction" и сделать больше, чем просто умножить ее на 4.

Функция сама по себе небезопасна, но строка:

 someFunction($_GET['value']);

Небезопасно. Возможно, someFunction получает рефакторинг в другой файл или находится в коде. Вы всегда должны проверять и очищать данные, предоставленные пользователем, чтобы защитить себя, а другие, работающие с библиотекой или функцией, где-то не поймали, не ожидая, что вы передадите им чистые данные массива $_GET.

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

Ответ 2

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

Ответ 3

НИКОГДА не доверяет тому, что происходит от пользователя. Просто не. Даже если вы не можете понять, как неправильно использовать ваш код/​​класс/пакет, закройте свою собственную задницу, убедившись, что вход в ваш продукт - именно то, что вы ожидаете, никаких сюрпризов. При минимальном минимуме кто-то может подавать плохой ввод на этот метод, просто вставляя ваше приложение, чтобы он отображал ошибку или выдавал белый экран смерти. Код, который выполняет базовое умножение, является главным кандидатом на такое злонамеренное поведение. Это относится не только к PHP, но и к программированию/дизайну в целом.