За последние 24 часа нас посетили 18455 программистов и 1615 роботов. Сейчас ищут 1502 программиста ...

Защита от XSS и SQL injection

Тема в разделе "Прочие вопросы по PHP", создана пользователем NR55RU, 24 дек 2012.

  1. NR55RU

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

    С нами с:
    16 фев 2011
    Сообщения:
    88
    Симпатии:
    0
    Сейчас занят созданием пары классов которые должны обеспечивать более менее безопасность пользовательского ввода, как минимум от самых распространённых и известных XSS и SQL injection.

    Хотел бы попросить поделится опытом более опытных людей. Так как думаю что обычное экранирование обеспечивает лишь самый низкий уровень безопасности от наиболее прямого и тупого запроса.
    В частности есть пара вопросов.

    1. Можно ли заменять все символы которые я считаю не безопасными на их HTML коды вида &#xxx;
    2. Достаточно ли будет заменить "0x" на, например "Ox" (вместо нуля буква О) что бы защитится от SQL-hex вставок.
    3. Имеет ли смысл взять список SQL команд например (select, drop, order by и тд и тп) и заменять их на что-то так же безопасное.
    4. Как предотвратить обход проверки с помощью ANSI кодировки в запросе ? Достаточно ли будет что то делать с выражением вида "%хх", в частности с теми которые совпадают с запрещёнными символами, например менять их на HTML коды ?

    Вообще хотел бы узнать как именно можно обеспечить хорошую защиту пользовательского ввода, перерыл много чего, но все везде сводится к описанию атак и словам что пользовательский ввод надо фильтровать, но как именно нигде никто особо не пишет.
    Таким образом хотелось бы обсудить конкретные приемы фильтрации ввода.
     
  2. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    конечно можно. надо всё менять не глядя. а то вдруг чо.
    Да, это решение всех вопросов - совать в базу не то, что прислали. Можно пойти ещё дальше и заменять весь присланный пользовательский ввод на "Ох" или даже на "Ох, блин".

    Да, конечно. Нормальные люди ведь не используют эти слова в повседневной речи.

    Ну не знаю. Наверное... ВЫСТАВИТЬ КОДИРОВКУ????
     
  3. NR55RU

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

    С нами с:
    16 фев 2011
    Сообщения:
    88
    Симпатии:
    0
    По поводу пункта 4.
    Если я все понимаю верно то разумеется, есть кодировка страницы и в этой кодировке браузер отдает серверу данные, но я встречал не однократно описание атак где параметры меняли в ANSI, в частности кавычки и прочие и скармливали серверу, в итоге это обходило ряд проверок, может конечно это работало на каких-то старых версиях PHP а может я чего то не понял, посему и спрашиваю :)
     
  4. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  5. NR55RU

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

    С нами с:
    16 фев 2011
    Сообщения:
    88
    Симпатии:
    0
    А вообще является ли HTML код вида &#xxx; безопасным ?
    Ничто его не пытается интерпретировать как символ, за исключением браузера при отображении ?

    Просто сейчас провел эксперимент, заменил все кавычки на ' , после чего попросил функцию mysql_real_escape_string() отработать строчку с данными кодами, она успешно про экранировала последовательность '
    Почему так получается ? ... кодировка соединения стоит UTF8
     
  6. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    безопасным для чего? от чего?

    дык кто ж его знает что там и где чего интерпретирует. зависит от задачи.

    шут её знает
     
  7. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    всегда думай о цели. для для запросов MySQL опасна только одинарная кавычка — обезопась себя или плесхолдерами или подходящим *escape_string. не надо усложнять.
     
  8. NR55RU

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

    С нами с:
    16 фев 2011
    Сообщения:
    88
    Симпатии:
    0
    Ну да, следуя ссылке которую дал igordata я как раз и "закопался" сейчас в функционал mysqli, ранее пользовался обычным mysql и не знал что есть такие средства(да еще и имеет ООП функционал, ваще прелесть). Отсюда и попытка "изобрести велосипед", хотя такие попытки даром не проходят, узнаешь много нового :)
    Если кому из начинающих интересна тема mysqli то вот нарыл хорошую ссылочку, все доходчиво и на русском : http://www.bvisoft.com/reads/263.php
    Думаю в сочетании с минимальными разумными проверками, подготовленные sql запросы и sql процедуры, вполне будут способствовать защите от большинства SQL атак.
     
  9. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Статья 2007 года, оч.интересно.
     
  10. NR55RU

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

    С нами с:
    16 фев 2011
    Сообщения:
    88
    Симпатии:
    0
    Думаю это не более чем ошибка времени на сайте :)
    Так же, мои поиски защиты от SQL-i привели меня к такой статье на тему экранирования.
    Так же весьма хорошо написана, будет интересна тем кто копает информацию в данном направлении как я.
    http://phpfaq.ru/slashes

    В процессе разбирательств с подготовленными запросами и экранированием, так же получил важный ответ на тему надо или нет экранировать кавычки при составление параметизированных подготовленых запросов.
    Овтет нашел в документации:
     
  11. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    В Yii при выполнении запроса передаю параметры, которые в PDO вызываются через http://www.php.ru/manual/pdostatement.bindparam.html
    Никаких проблем с sql inj нету.
    Есть также возможность поставить на apache mod_security, защитит от SQL inj и XSS, но это на крайний случай.

    p.s руки у разработчиков должны из правильного места быть.
     
  12. artem-Kuzmin

    artem-Kuzmin Активный пользователь

    С нами с:
    16 фев 2012
    Сообщения:
    809
    Симпатии:
    0
    Подготовленные выражения гораздо медленнее простых sql команд)..
    И их использование правильное не там где надо экранировать переменные для этого quote
     
  13. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Насколько медленнее?
     
  14. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Интересно разговор повернулся. А можно выкладки с цифрами?
     
  15. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    не стоит даже заморачиваться.
    собственная реализация подобного все равно будет тормознее и глючнее
     
  16. artem-Kuzmin

    artem-Kuzmin Активный пользователь

    С нами с:
    16 фев 2012
    Сообщения:
    809
    Симпатии:
    0
    http://www.php.ru/manual/pdo.prepare.html#108481
    Пишет о 3кратном..
    Я почему то доверяю.
    До этого тоже везде пихнул подготовленные выражения уже не с целью многократного использования, а просто чтоб удобнее кинул массив он сам там проэкрнируется)..
    А щас так не пользую оно конечно не заметно по скорости, но хочется все же стремитьс к грамотному коду)...

    Зачем собственная реализация какая-то особая..
    Просто создать функцию принимающую параметры и будет норм..
    Главная ведь цель и тогда и дает выигрыш многократное использование
     
  17. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    artem-Kuzmin, кажется местный парсер опять неудачно подменил ссылку на собственный недомануал.
    тысяча чертей!
     
  18. artem-Kuzmin

    artem-Kuzmin Активный пользователь

    С нами с:
    16 фев 2012
    Сообщения:
    809
    Симпатии:
    0
    Меня порой радует функционал форума))...
    http://php.net
    /manual/ru/pdo.prepare.php#108481
     
  19. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    кстати, о (не)эффективности биндинга параметров:
    1. плейсхолдеры бывают серверные и клиентские, в PDO по умолчанию клиентские (пруф, глава "Работа с плейсхолдерами"). если вся обработка параметра происходит на клиенте, то от prepare не стоит ждать ускорения!
    2. нестандартный подход к prepare, постоянное соединение и любопытные тесты http://habrahabr.ru/post/149613/
     
  20. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    каммент какогото неизвестного - я лично не беру в расчет.
    а если я там щас напишу наоборот - о 3-х кратном превосходстве. вы тоже поверите? )
     
  21. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    тебе — поверим )
     
  22. artem-Kuzmin

    artem-Kuzmin Активный пользователь

    С нами с:
    16 фев 2012
    Сообщения:
    809
    Симпатии:
    0
    прочел всю статью))..
    человек который пишет, слишком многословен и сам походу не понимает о чем пишет)), хотя почитать не помешало..
    Пишет о том, что экранирование гадость. Надо пользовать только плейсхолдеры..
    А плейсхолдеры действительно только серверные же бывают, а клиентские та же самая херь, что экранирование), просто делается через функцию...
    А он так это описывает будто это чем то отличается от обычного экранирования..

    Читая комменты к pdo много видел как умные люди просто extends PDO и расширяли как ему надо)..
    А тут он начал ковырять какие то свои quote функии в которых не вижу смысла проще наслоедовать и допилить..

    Добавлено спустя 9 минут 32 секунды:
    ПРочитал и 2)..
    Использовать подготовленные выражения думаю вполне подходит для скриптов больших данных..
    Хотя там лучше LOAD DATA

    Там оч много хороших комментариев поэтому это как минимум стоит задуматься).
    но не написали же)
     
  23. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    любая статья не догма, а повод подумать. новая инфа.
     
  24. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    я прекрасно понимаю, что дополнительные действия(prepare,bind...) - требуют доп. ресурсов (память, процессор..).
    без этого никуда.
    также я имею некоторый опыт работы с pdo. и никогда не сталкивался с проблемами вызванными тормознутостью подготовленных выражений.
    для моих нужд производительности хватает. когда работал в студии - тоже проблем с этим не испытывал никто из знакомых.
    гнаться за наносекундами - я уже давно бросил.
    оптимизировать нужно самые тормозные места. а это обычно сами запросы, правильные индексы, денормализация и т.д.

    т.е. я не отрицаю что они более ресурсоемки. но все в допустимых пределах и реальных проблем это никогда не доставляло.
     
  25. artem-Kuzmin

    artem-Kuzmin Активный пользователь

    С нами с:
    16 фев 2012
    Сообщения:
    809
    Симпатии:
    0
    Та я вижу проблему в другом) даже не в тормознутости маленькой а просто в использовании не по назначению)