За последние 24 часа нас посетили 16727 программистов и 1587 роботов. Сейчас ищут 1360 программистов ...

Какие всё-таки функции использовать для защиты форм?

Тема в разделе "PHP для новичков", создана пользователем nikolay, 8 авг 2011.

  1. nikolay

    nikolay Активный пользователь

    С нами с:
    5 авг 2011
    Сообщения:
    17
    Симпатии:
    0
    В различной литературе выделяют следующие 4 функции - addslashes, htmlspecialchars, strip_tags, mysql_escape_string. При этом каждый автор использует по-разному. Кто-то всего одну, кто парочку. Вот и вопрос - сколько точно надо использовать и в какой последовательности, чтобы на 100% защититься от всякой гадости, вводимой в форму и адресную строку через get? Кто как использует?
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    ВСЁ зависит от того, куда пойдут строки из формы - в sql бд, на страницу или в аргументы какой-нибудь функции...
     
  3. nikolay

    nikolay Активный пользователь

    С нами с:
    5 авг 2011
    Сообщения:
    17
    Симпатии:
    0
    А чтобы сразу все три варианта предусмотреть - БД, страница, аргумент? Или так универсально сделать нельзя?
     
  4. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    it depends.
    Если полученное значение используется как параметр для запроса в базу, то я использую mysql_real_escape_string для текстовых полей и прямое приведение типа для числовых.
    addslashes имеет смысл использовать только если у тебя какая-нибудь бд в которой нет аналога mysql_real_escape_string

    Если полученное значение выводится в браузер (неважно напрямую или сначала сохраняется куда-то а потом выводится), то используется htmlspecialchars - против xss и просто чтобы верстка не скривилась от введенных пользователем тегов. strip_tags стоит использовать вместо htmlspecialchars если ты хочешь именно отрезать теги напрочь, а не показывать их как теги. То есть если пользователь введет "привет, Вася", то после htmlspecialchars результат будет "привет, <b>Вася</b>", а после strip_tags "привет, Вася". Но и в том и в другом случае тег не выделит васю болдом.
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    nikolay
    чтобы на 100% защититься от всякой гадости
    mysql_real_escape_string - для записи в бд.
    для вывода на страницу - там надо смотреть, чтобы не перестараться.

    т.е. во втором случае строка '&' может превратиться в &amp; а может даже в &amp;amp; :D
     
  6. rainarr

    rainarr Активный пользователь

    С нами с:
    20 ноя 2010
    Сообщения:
    276
    Симпатии:
    0
  7. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Я бы в б.д. хранил как прислали текст (т.е. только через escape_string), а при выводе записей из б.д. в браузер - уже делал бы htmlspecialchars()
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
    rainarr, садись двойка!
    не надо таких "!универсальных" штучек. функции экранирования символов надо выбирать в зависимости от назначения данных. мы защищаем базу от sql-инъекции или мы защищаем пользователя от js-инъекции - ввод или вывод.

    перед подстановкой значения в SQL-запрос - mysql_real_escape_string
    перед подстановкой в input или textarea - htmlspecialchars ВСЕГДА!
    при выводе данных, которые вводил пользователь и где недопустим html/js - htmlspecialchars

    stripslashes может понадобиться только как workaround если включены magic quotes — тогда проходимся им по _GET, _POST и _COOKIE в начале скрипта. (для свежих версий PHP неактуально). больше stripslashes нафиг не нужно, одни непонятные проблемы словишь.
    следствие: про addslashes насрать и забыть.
     
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Правильно. В БД надо хранить текст в оригинальном виде. Не будете же вы в вручную написанном запросе писать &amp; вместо &.
     
  10. nikolay

    nikolay Активный пользователь

    С нами с:
    5 авг 2011
    Сообщения:
    17
    Симпатии:
    0
    Всем спасибо за ответы! Буду разбираться.
     
  11. rainarr

    rainarr Активный пользователь

    С нами с:
    20 ноя 2010
    Сообщения:
    276
    Симпатии:
    0
    artoodetoo
    мой пример это пример :D
    текст в БД надо сохранять в исходном виде, если хочешь организовать поиск и всё такое, но тут вроде не спрашивали.
     
  12. nikolay

    nikolay Активный пользователь

    С нами с:
    5 авг 2011
    Сообщения:
    17
    Симпатии:
    0
    Кстати, возник такой вопрос - mysql_real_escape_string гарантирует отсутствие взлома через SQL-инъекции при условии, что использована во всех местах, где это нужно?
     
  13. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Это вопрос от КЭПа. Лучше подумай над тем, где её нужно использовать =)