Вчера я принял участие в интервью для должности разработчиков PHP. Моя задача - решить 15 вопросов довольно простой тест. Один из вопросов заключался в том, чтобы решить, что кодекс, похожий на ниже, должен рассматриваться как небезопасный. Я дал неверный ответ (и, как выяснилось), и аргументация от другого человека на этом интервью была довольно удивительной (по крайней мере для меня).
Код был примерно таким:
function someFunction($a)
{
echo $a * 4;
}
someFunction($_GET['value']);
Возможные ответы:
- всегда,
- только когда
register_globals
включен, - никогда.
Вы можете получить один балл за правильный ответ, а второй - за хорошее объяснение (аргументацию) ответа на выбранный ответ.
Мой ответ был третьим: этот код никогда не опасен. Плюс аргументация: Потому что это просто простое уравнение. Здесь нет операций с файлами или базами данных, нет потоков, протоколов и ничего. Это просто уравнение. Ничего больше. Атакующий не может что-то сделать с PHP script, неважно, каким образом неверный URL-запрос, который он или она попытается выполнить. Нет шансов.
У меня есть нулевые очки. Ни мой ответ не был правильным, ни моя аргументация не была принята. Правильный ответ: этот код всегда небезопасен - вы должны всегда бежать, что вы получили из запроса URL.
Мой вопрос: это действительно хорошая точка зрения? Нужно ли нам всегда использовать эмпирическое правило, что все, что взято непосредственно из запроса, является небезопасным, если его не фильтровать, избегать или защищать каким-либо другим способом? Означает ли это, что я преподаю своим ученикам методологии нечеткого кодирования, потому что на первой лекции PHP они пишут script для вычисления области треугольника, и они используют неэквивалентные, нефильтрованные параметры из URL в своей задаче?
Я понимаю, что безопасный и безопасный код безопасности должен быть вопросом наивысшего приоритета. Но, с другой стороны, это не что-то вроде безопасного кода-фашизма (простите меня, если я кого-то обидел), чтобы угрожать любому коду небезопасным, даже если никто не может навредить ему?
Или, может быть, я совершенно не прав, и вы можете нанести вред функции, которая повторяет четыре раза, что вы ему дали?