Ярлык Eclipse & ldquo; отладка последней конфигурации отладки & rdquo; (не F11)

Безопасность - интересная концепция и привлекает к ней много людей. К сожалению, это сложный вопрос, и даже профессионалы ошибаются. Я нашел дыры в безопасности в Google (CSRF), Facebook (больше CSRF), нескольких крупных интернет-магазинах (в основном, SQL injection / XSS), а также тысячи небольших сайтов как корпоративных, так и личных.

мои рекомендации:

1) Использовать параметризованные запросы Параметрированные запросы заставляют значения, переданные запросу, обрабатываться как отдельные данные, так что входные значения не могут быть проанализированы в виде кода SQL СУБД. Многие люди рекомендуют вам избегать ваших строк, используя mysql_real_escape_string(), но, вопреки распространенному мнению, это не все-таки решение SQL-инъекции. Возьмите этот запрос, например:

SELECT * FROM users WHERE userID = $_GET['userid']

Если для $_GET['userid'] установлено значение 1 OR 1=1, специальных символов не будет, и он не будет отфильтрован. Это приводит к возврату всех строк. Или, что еще хуже, что, если он установлен на 1 OR is_admin = 1?

Параметрированные запросы предотвращают появление такого рода инъекций.

2) Подтвердите свои входы Параметрированные запросы велики, но иногда непредвиденные значения могут вызвать проблемы с вашим кодом. Убедитесь, что вы проверяете, что они находятся в пределах диапазона, и что они не позволят текущему пользователю изменять то, что они не могут.

Например, у вас может быть смена пароля который отправляет запрос POST скрипту, который изменяет свой пароль. Если вы поместите свой идентификатор пользователя в скрытую переменную в форме, они могут изменить его. Отправка id=123 вместо id=321 может означать, что они меняют чужой пароль. Убедитесь, что EVERYTHING правильно проверен с точки зрения типа, диапазона и доступа.

3) Используйте htmlspecialchars для выхода из отображаемого пользовательского ввода. Предположим, что ваш пользователь вводит их «обо мне» как-то вроде этого: </div><script>document.alert('hello!');</script><div> Проблема заключается в том, что ваш вывод будет содержать разметку, введенную пользователем. Попытка фильтровать это с помощью черных списков - это просто плохая идея. Используйте htmlspecialchars, чтобы отфильтровать строки, чтобы HTML-теги были преобразованы в объекты HTML.

4) Не используйте $ _REQUEST. Атаки на подделку запросов на межсайтовый сайт (CSRF) работают, заставляя пользователя щелкнуть ссылку или URL-адрес, который представляет собой скрипт, который выполняет действие на сайте, для которого они вошли. Переменная $_REQUEST представляет собой комбинацию $_GET, $_POST и $_COOKIE, что означает, что вы можете Не сообщайте разницу между переменной, которая была отправлена ​​в запросе POST (т. е. через тег input в вашей форме) или переменной, которая была установлена ​​в вашем URL как часть GET (например, page.php?id=1).

Предположим, пользователь хочет отправить кому-то личное сообщение. Они могут отправлять запрос POST в sendmessage.php, а параметры to, subject и message в качестве параметров. Теперь представим, что кто-то отправляет запрос GET:

sendmessage.php?to=someone&subject=SPAM&message=VIAGRA!

Если вы используете $_POST, вы не увидите ни одного из этих параметров, поскольку они установлены в $_GET. Ваш код не увидит $_POST['to'] или любую другую переменную, поэтому он не отправит сообщение. Однако, если вы используете $_REQUEST, $_GET и $_POST застревают вместе, поэтому злоумышленник может установить эти параметры как часть URL-адреса. Когда пользователь посещает этот URL-адрес, они непреднамеренно отправляют сообщение. Очень тревожная часть заключается в том, что пользователю ничего не нужно делать. Если злоумышленник создает вредоносную страницу, он может содержать iframe, указывающий на URL. Пример:

<iframe src="http://yoursite.com/sendmessage.php?to=someone&subject=SPAM&message=VIAGRA!">
</iframe>

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

5) Относитесь ко всему, что вы получили как подозрительное (или даже злонамеренное). Вы не представляете, что пользователь отправляет вас. Это может быть законным. Это может быть атака. Никогда не доверяйте тому, что отправил вам пользователь. Преобразуйте в правильные типы, проверьте входные данные, используйте белые списки для фильтрации там, где это необходимо (избегайте черных списков). Это включает в себя все, что отправлено через $_GET, $_POST, $_COOKIE и $_FILES.

Если вы следуете этим рекомендациям, у вас есть разумная стойкость с точки зрения безопасности.

37
задан Jasper 16 September 2011 в 07:16
поделиться