Запуск сайта с защитой от заражения - PullRequest
1 голос
/ 28 октября 2011

Я новый php "разработчик" и новый участник сайта SOF.Я запускаю веб-сайт впервые, и в моем онлайн-исследовании мне сказали, что, хотя PHP может показаться простым, самое важное, что упускают из виду разработчики, - это инъекции.

Поскольку SOF заявляет, что вам следует провести исследование, прежде чем задавать вопрос, я сделал это, и, похоже, mysql_real_escape_string ();требуется экранировать символы, которые могут повредить базу данных.Затем я также обнаружил, что вы подготовили заявления.Однако, выполняя поиск как в SOF, так и в Google, я обнаружил, что не имеет значения, какой из двух вы используете, потому что в любом случае вводимые пользователем данные используются для запроса / вставки в базу данных.

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

Вот что я делаю:

 For Post variables: 

 $thething = mysql_real_escape_string($_POST['field']);


 For Get variables: 

 $thething = mysql_real_escape_string($_GET['id']);


 For Request variables: 

 $thething = mysql_real_escape_string($_REQUEST['id']);

Пожалуйста, дайте мне знать, что вы, ребята, думаете.

Ответы [ 5 ]

1 голос
/ 28 октября 2011

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

Смежные вопросы:

mysqli подготовленные заявления и mysqli_real_escape_string

real_escape_string против подготовленных утверждений

0 голосов
/ 28 октября 2011

Я думаю, что это весьма уязвимо для инъекций sql:

$ thething = mysql_real_escape_string ($ _ GET ['id']);mysql_query ("выберите * у пользователя, где id =". $ thething);

Подтверждение концепции: http://localhost/index.php?id=sleep(30)

Загрузка этой страницы займет 30 секунд, поскольку она уязвима для инъекции sql,

Более безопасный подход к защите себя от SQL-инъекций - это параметризованные библиотеки запросов, такие как PDO или mysqli.Вы должны проверить все.Я рекомендую использовать такой сервис, как Sitewatch или проект с открытым исходным кодом, например skipfish .

0 голосов
/ 28 октября 2011

мы думаем, что ваша идея защиты совершенно неверна.

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

  2. Таким образом mysql_real_escape_string (); экранировать символы, которые могут разбить строку.

  3. Таким образом mysql_real_escape_string (); требуется только для экранирования строк . И это не поможет немного с любой другой частью запроса.

  4. Кроме того, строки могут поступать в запрос не только из POST GET и REQUEST, но и из любого источника в мире. вы должны экранировать строку, которая входит в запрос , а не из какого-либо источника. Направление это причина, а не источник.

  5. пожалуйста, обратитесь к вопросу в комментариях для дальнейших объяснений

0 голосов
/ 28 октября 2011

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

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

Если вы используете PHP-фреймворк, такой как CakePHP или CodeIgniter, они обычно предоставляют одинаковые функции. Например, Активные записи CodeIgniter позаботятся обо всей входной очистке для вас.

Дополнительная информация о безопасности:

Поскольку вы новичок в веб-разработке (как и я), также обратите внимание на XSS-инъекции , еще одну уязвимую точку.

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

Соляные пароли во время хеширования, избегайте хеширования md5. Перейти на sha256, sha512 или bcrypt.

С безопасностью дело не в , если вы будете скомпрометированы, а скорее , когда вы будете скомпрометированы. Безопасность должна быть непрерывным, бесконечным процессом.

0 голосов
/ 28 октября 2011

PreparedStatements будет экранировать ввод для вас, когда вы используете его с заполнителем

SELECT * FROM myTable WHERE `id` = ?

Однако, это не поддерживается процедурным расширением mysql, в чем причина, почему многие существующие сайты остаются с mysql_(real_)escape_string(), но вы можете использовать его с Mysqli или PDO. Я рекомендую использовать подготовленные заявления, когда вы находитесь в начале разработки.

...