За последние 24 часа нас посетили 21663 программиста и 1018 роботов. Сейчас ищут 767 программистов ...

Экранирование символов

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

  1. hook007

    hook007 Новичок

    С нами с:
    12 ноя 2020
    Сообщения:
    6
    Симпатии:
    0
    Доброй день!
    Для безопасности кода, в частности XSS такая экранизация достаточная?
    Вход в базу mysql:
    PHP:
    1. $str = trim($str);
    2. $str = addslashes($str);
    3.  
    4. Вывод с базы mysql:
    5. $str = html_entity_decode($str);
    6. // тут обработка html кода к примеру:
    7. $str= preg_replace("/(^|[\n ])([\w]*?)([\w]*?:\/\/[\w]+[^ \,\"\n\r\t<]*)/is", "[URL='http://$3']$3[/URL]", $str);
    8. $str = htmlspecialchars($str);
    9. $str = nl2br($str);
    Буду благодарен за ответ ;)

    От модератора: Вставлять код надо кнопкой </>
     
    #1 hook007, 12 ноя 2020
    Последнее редактирование модератором: 12 ноя 2020
  2. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Жуткая мещанина из непонятной хрени. Прочти про каждую из используемых функций, зачем она. А в принципе, правила простые:
    1. Для предотвращения порчи запросов данными, а заодно защиты от SQL-инъекций использовать подготовленные запросы
    2. Для защиты от XSS пропускать данные через htmlspecialchars перед выводом
    3. Если нужно позволить вводить html, ограничить количество допустимых тегов. Самое простое решение для этого - strip_tags со списком разрешённых, есть более развитые решения через библиотеки.
     
    hook007 нравится это.
  3. hook007

    hook007 Новичок

    С нами с:
    12 ноя 2020
    Сообщения:
    6
    Симпатии:
    0
    Спасибо за ответ. Будьте добры подскажите пожалуйста, в если хранить в базе данных информацию без предварительной фильтрации htmlspecialchars, это ничего страшного?
     
  4. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Базе похрен, она не умеет исполнять джаваскрипт. Надо всегда понимать, что зачем делается. Почему мы защищаемся от sql-инъекций? Потому что не хотим, чтоб база исполнила SQL запрос, который мы не писали. Почему мы экранируем HTML при выводе данных? Потому что не хотим, чтоб браузер исполнил жабаскрипт, который мы не писали. Всё же просто.
     
    miketomlin и hook007 нравится это.
  5. hook007

    hook007 Новичок

    С нами с:
    12 ноя 2020
    Сообщения:
    6
    Симпатии:
    0
    Спасибо Вам! Подумал лучше утвержусь за счет мнения специалиста!
     
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Большинство обычно так и делает. Но проблема в том, что в этом случае возрастает нагрузка при выводе, особенно если вы используете «неразвитое» кеширование/не используете его совсем.
     
  7. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    @miketomlin И при какой нагрузке на сайт это действительно становится проблемой?
    --- Добавлено ---
    Из известных мне движков OpenCart хранит в базе информацию, уже пропущенную через htmlspecialchars, а при выводе они даже в третей версии из твига выпилили автоматический вызов этой функции для выводимых данных. Но работать с такими данными не фантастика как удобно.
     
  8. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Не знаю. Я так никогда не делаю.

    Смотря как работать. То что я написал, не означает, что нужно совсем отказываться от хранения данных в исходном виде.
     
    #8 miketomlin, 13 ноя 2020
    Последнее редактирование: 13 ноя 2020
  9. Сержан

    Сержан Новичок

    С нами с:
    9 мар 2021
    Сообщения:
    1
    Симпатии:
    0
    Здравствуйте!!
    есть строки полученное пост запросам из кода Latex формулы
    Вот один из них:
    $content = "{f}^{\text{'}}\left(x\right)=2x+2";
    нужно экранировать только апостроф, что бы записать в базу данных MySQL.
     
  10. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    @Сержан, пользуйтесь подготовленными запросами, база сама всё что надо сделает. Контент не исказится.