Путями я могу защитить свой сайт, исключая XSS и Внедрение SQL?


Так, члены моего веб-сайта могут отправить темы, ответы, комментарии, отредактировать их и так далее. Я всегда использую htmlspecialchars и addslashes чтобы вводы HTML защитили мой сайт от XSS и атак с использованием кода на SQL. Это достаточно или является там чем-то больше, что я отсутствую?
Спасибо.

5
задан good_evening 2 June 2010 в 15:57
поделиться

6 ответов

В веб-приложениях многое может пойти не так. Помимо XSS и SQLi, существуют:

  1. CSRF - Cross Site Request Forgery
  2. LFI/RFI - Local File Include/Remote File Include, вызванные include(), require()...
  3. Инъекция CRLF в mail()
  4. Обращение к пространству имен глобальных переменных, вызванное register_globals, extract(), import_request_variables()
  5. Обход каталога: fopen(), file_get_contents(), file_put_contents()
  6. Удаленное выполнение кода с eval() или preg_replace() с /e
  7. Удаленное выполнение кода с passthru(), exec(), system() и ``

Существует целое семейство уязвимостей, касающихся Broken Authentication and Session Management, которое является частью OWASP Top 10, который каждый программист веб-приложений должен прочитать.

A Study In Scarlet - хорошая черная книга, в которой рассматриваются многие из перечисленных мной уязвимостей.

Однако есть и странные уязвимости, такие как эта в Wordpress. Окончательным авторитетом в том, что такое уязвимость, является система CWE, которая классифицирует СТОЛЬКО уязвимостей, многие из которых могут влиять на веб-приложения.

8
ответ дан 18 December 2019 в 09:05
поделиться

Вы должны использовать mysql_real_escape_string() для SQL, а не addslashes. (Предполагается, что вы используете MySQL)

2
ответ дан 18 December 2019 в 09:05
поделиться

Лучший подход для защиты от SQL-инъекций - использовать функцию escape, специально написанную для каждой базы данных - например, для PostGreSQL используйте pg_escape_string для экранирования строковых полей перед вставкой их в базу данных. Или, в вашем случае, используйте mysql_real_escape_string.

2
ответ дан 18 December 2019 в 09:05
поделиться

SQL-инъекция:

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

  2. И экранирующие, и подготовленные операторы могут помочь только с данными . Для операторов / идентификаторов есть особые правила. (Впрочем, ничего страшного - каждая возможная комбинация должна быть жестко закодирована в скрипте)

XSS:

Не разрешать пользователям использовать HTML.
Чтобы предотвратить это, можно использовать как strip_tags () (без разрешенных тегов), так и htmlspecialchars () .
Если вы хотите разрешить некоторую разметку, подумайте об использовании BB-кода.

CSRF:

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

0
ответ дан 18 December 2019 в 09:05
поделиться

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

Также просмотрите эти ссылки, чтобы узнать о других способах защиты вашего сайта:

http://phpsec.org/projects/guide/

http://cwe.mitre.org/top25/#Listing

http://www.owasp.org/index.php/Top_10_2010-Main

6
ответ дан 18 December 2019 в 09:05
поделиться

При вставке данных в базу данных используйте подготовленные операторы. PDO лучше, чем mysql_real_espace_string.

При отображении данных, таких как комментарии, сообщения, используйте htmlentities.

0
ответ дан 18 December 2019 в 09:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: