За последние 24 часа нас посетили 17706 программистов и 1465 роботов. Сейчас ищут 1514 программистов ...

Защита форм от стороннего кода

Тема в разделе "PHP для новичков", создана пользователем DarkGod▲, 30 июн 2017.

  1. DarkGod▲

    DarkGod▲ Новичок

    С нами с:
    21 июн 2017
    Сообщения:
    12
    Симпатии:
    2
    Добрый вечер, столкнулся с проблемой, а точнее с уязвимостью,которая не даёт мне покоя. В любую форму на моём сайте можно вставить сторонний php или html код.

    Короче, вот страница до:
    [​IMG]
    Теперь вставляем сторонний код:
    [​IMG]
    А после отправки в БД и вывода обратно получаем:
    [​IMG]

    Подскажите, как от этого защититься ?

    Код добавления данных в БД:

    PHP:
    1. if (isset($_POST['comm_sub'])) {  
    2.     if ($_POST['comm_text'] == '') {
    3.         $err[] = 'Введите Комментарий';
    4.     }
    5.     if (empty($err)) {
    6.         $comment = R::dispense('comments');
    7.         $comment -> author = $_SESSION['id_user'];
    8.         $comment -> text = $_POST['comm_text'];
    9.         $comment -> id_stories = $ids;
    10.         R::store($comment);
    11.     }else{
    12.         echo '<div id="error">' . array_shift($err). '</div>';;
    13.     }
    14. }
     
  2. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    Можно strip_tags сделать.. тогда html и php теги вырежет..
    --- Добавлено ---
    Это у Вас какой-то фреймворк?
     
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.788
    Симпатии:
    1.328
    Адрес:
    Лень
    denis01 и DarkGod▲ нравится это.
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Нет, не можно. Это вандализм и порча данных. Человек может просто угловые скобочки туда пихнуть и все, кирдык.

    Автор, вот тебе алгоритм:
    1) Сохраняем данные в базу как есть, не забывая, конечно, про эскейпинг, чтобы от SQL-инъекции защититься.
    2) Потом вытаскиваем данные из базы как есть.
    3) Протом прогоняем их через htmlspecialchars и выводим.
    --- Добавлено ---
    @MouseZver меня опередил чуток)
     
    denis01, DarkGod▲, valentinnew и ещё 1-му нравится это.
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.788
    Симпатии:
    1.328
    Адрес:
    Лень
    isset ( ... )
    поддерживает проверку сразу нескольких переменных.
    --- Добавлено ---
    на работе, решил заглянуть на огонек
    --- Добавлено ---
    так что 2ая строка не ок, словим нотис, а если в БД по дефолту не ставить определенное значение, то вовсе отрыгнет фатал еррор помоему или варнинг
    --- Добавлено ---
    в 12 строке можно снести срезку первого ключа на implode ( '<br>', $err )
     
    DarkGod▲ нравится это.
  6. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    :eek:
    ну если там только русский текст предусматривается)) то может и не такой уж и вандализм)) :oops:
     
  7. DarkGod▲

    DarkGod▲ Новичок

    С нами с:
    21 июн 2017
    Сообщения:
    12
    Симпатии:
    2
    @Алекс8@MouseZver@Fell-x27 Спасибо большое, что бы я без вас делал
     
  8. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Русский текст тоже бывает в <угловых скобках>.
    Просто надо принять как факт, что strip_tags - это детская болезнь PHP и пережиток максимализма первых разработчиков, который до сих пор сохраняется в языке разве что для обратной совместимости и является исторически сложившимся недоразумением. И никогда им не пользоваться. Вообще. Ладно бы эта функция именно HTML-теги выпиливала, или умела бы выпиливать какой-то конкретный, так нет, она режет все без разбору, что угодит промеж угловых скобок.
     
  9. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Алекс8
    @Fell-x27
    @DarkGod▲
    а еще можно с этой функцией
    htmlspecialchars
    использовать:
    addslashes (экранирует строку с помощью слешей)
    ну наверное, в проекте видел не давно, посмотрел что эта функция делает и себе добавил в заметку.
     
  10. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.576
    Симпатии:
    1.759
    @_ne_scaju_, вот ты реально думаешь, что ты, с опытом php без году неделя, можешь что-то ценное посоветовать @Fell-x27? Тем более писать про addslashes, которая практически никогда не должна использоваться...
     
  11. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Вот почему объясни а то я сейчас использую.
     
  12. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.576
    Симпатии:
    1.759
    Для чего? Если для защиты от sql-инъекций, то она неэффективна по причине того, что не учитывает кодировку базы, и сурикат знает правильные строчки, чтоб пробить такую "защиту". От sql-инъекций надо использовать подготовленные запросы и специализированные функции библиотек по работе с базой данных.
     
    Fell-x27 нравится это.
  13. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.788
    Симпатии:
    1.328
    Адрес:
    Лень
    Denver выруби
     
  14. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @MouseZver
    Вот как раз я не использую денвер, пользуюсь опенсервером.
     
  15. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.788
    Симпатии:
    1.328
    Адрес:
    Лень
    тогда
    ничего доброго не несет
     
  16. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @MouseZver
    Понял, нафиг нужна значит эта функция.
     
  17. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.788
    Симпатии:
    1.328
    Адрес:
    Лень
    @_ne_scaju_
     
  18. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Увы, в PHP до сих пор полно legacy-дури. По этому, когда читаешь описание какой-нибудь функции, первое, что нужно сделать - подумать, "а не делает ли она какую-то противоестественную хрень?". А потом протестить, если есть сомнения, на предмет хрени в результате работы.

    Но, с другой стороны, разрабы PHP почуть эту дурь выпиливают. Register globals, например. Или short-tags. Или mysql_ расширение...