За последние 24 часа нас посетили 58063 программиста и 1848 роботов. Сейчас ищут 1098 программистов ...

Правельная SQL инъекция HTML кода в БД

Тема в разделе "PHP для новичков", создана пользователем andriuch_a, 12 мар 2008.

Статус темы:
Закрыта.
  1. andriuch_a

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

    С нами с:
    12 мар 2008
    Сообщения:
    9
    Симпатии:
    0
    Адрес:
    Vilnius
    У меня очень простая проблема.
    делаю доску обявленний, и столкнулся с такой проблемой, если юзер вводит вместо обявления такой код:
    <iframe src='http://rambler.ru'></Fiframe>
    то в итоге вместо обявления у меня викидывает рамблер.

    Как нужно правельно вкидывать данние в БД и как их правельно выводить чтобы разные скрипты и кавычки не портили жизнь?

    И где можно об этом почитать ?
     
  2. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
  3. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Лучше при записи - чтобы каждый раз каждое объявление не прогонять через эту функцию. Тяжелая она :)
     
  4. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Не лучше, данные в базе должны храниться в исходном виде.
     
  5. Clone

    Clone Guest

    Зачем?
     
  6. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    мне кажется, что на этот вопрос не проследует ответа, так же как и на вопрос "почему не нужно приводить к типу числа переменную, содержащую число".
     
  7. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Clone
    Обычно потому, что данные из базы используются не только для генерации HTML, но и для других целей - для отправки текстовых почтовых уведомлений, для поиска и пр.
     
  8. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Для высоконагруженных проектов да, для 99.9% сайтов наоборот нельзя так делать.
    Для того чтоб если потом ты захочешь расширить движок (а такое часто бывает, например разрешить некоторые тэги) чтоб ты мог это сделать. (и само собой по причине которую привёл Dagdamor)
    Собственно недавно думал на эту тему, и "про реферировал" пару моих постов на этом форуме
    http://dkflbk.nm.ru/php_basic_err_1.html
     
  9. Anonymous

    Anonymous Guest

    Есть хорошие пословицы, которые стоит помнить даже при разработке сайтов. Например, "Ломать не строить". Обработать данные htmlspecialchars при выводе проще, чем потом пытаться вернуть исходный код по каким либо причинам. А вообще, всем стоит понять, что нет единственных и идеальных решений, и часто каждый случай надо рассматривать отдельно.
     
  10. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    А если проект станет вдруг высоконагруженым? В данном случае - доска объявлений. Это значит что если повезет - то она станет посещаемой. А вот как раз то, что в ней когда-то администаротор разрешит использовать в объявлениях HTML - очень мала (не видел таких досок).
     
  11. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Vladson
    По-моему, лучше уж, чтобы выдало id 12, чем скрипт умер. Тем более, что сайт не будет перенаправлять на неправильные ссылки. Неправильный айдишник может сделать лишь пользователь, либо случайно, после вставки ссылки дописав букву, либо намеренно.
    Для воторого способа подходит вариант выдачи ошибки, а для первого - нет.
    Я сам раньше проверял числовые параметры функцией ctype_digit, но потом перешел на приведение типа, так как посчитал это более выгодным.
     
  12. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    Тогда придется каждый раз фильтровать данные на выходе. Не легче один раз профильтровать данные и засунуть их в БД в чистом и нужном нам виде? Зачем мне хранить всякий мусор, который ввел пользователь (\, <script>alert();</script>, " и прочее). Оно мне надо? Лучше продумать функционал движка проекта с самого начала - если планируешь разрешить какие-то теги, лучше писать свой обработчик текстовых полей - с возможностей разрешения тегов (аналог strip_tags). Если точно знаешь что в этом поле НИКОГДА не должно быть ничего похожего на код - зачем париться?

    Kreker
    +1.

    Update:
    Просто у меня привычка:
    PHP:
    1.  
    2. <?php
    3. $name = clean($_POST['name']);
    4. $age = clean($_POST['age']);
    5. ...
    6. // Здесь была форма #
    7. ?>
    8.  
    Пишу это уже на автомате :)
     
  13. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    andriuch_a
    1) Юзайте htmlspecialchars
    2) Юзайте mysql_real_escape_string
    И все будет шоколадно :)
     
  14. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Это опять таки ошибка, скрипт не умрёт а сработает именно так-как надо, даст ответ что "странички с адресом 12рапг7124 не существует" потому что её не существует и ссылок на неё нигде ты не найдёшь.
     
  15. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    andriuch_a
    Всё что тебе нужно - описано в посте Elkaz
    mysql_real_escape_string() при записи в базу и htmlspecialschars при выводе в браузер.
     
  16. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Вдруг не бывает. (99% высоконагруженых проектов с самого начала были таковыми, а 99% обычных никогда не превосходят по требовательности описанную схему)
     
  17. Anonymous

    Anonymous Guest

    +1
     
  18. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Вы оба правы и оба неправы. ИМХО. :)

    Привести к типу нужно, но вырывать тип - нет.
    Код (Text):
    1. $id = (int)$_POST['id'];
     
  19. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Кроме ИМХО какие-то факты имеются ?


    Поправка: (на тему вдруг)
    - вдруг бывает только "пук"
     
  20. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    holywarчег
     
  21. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Kreker
    Кстати спасибо за очередной миф про "смерть скрипта", я и забыл про это заблуждение.
    Обязательно освещу в следующий раз.
     
  22. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Так и думается, что словосочетания "для того чтобы если" было написано чтобы не использовать слово "вдруг" ;)
     
  23. Anonymous

    Anonymous Guest

    Проект != движок.
     
  24. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    [vs]
    Когда в 98-м люди писали гостевухи они не знали что такое спам и что понадобится капча !!!
     
  25. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    Горбунов Олег
    Чаще всего это так
     
Статус темы:
Закрыта.