За последние 24 часа нас посетили 52937 программистов и 1684 робота. Сейчас ищут 1264 программиста ...

Безопасное обращение к БД

Тема в разделе "PHP и базы данных", создана пользователем Stairdeck, 13 июл 2016.

  1. Stairdeck

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

    С нами с:
    9 ноя 2014
    Сообщения:
    47
    Симпатии:
    0
    Адрес:
    Россия
    Здравствуйте уважаемы знатоки пхп.
    Я ещё очень нуб и только учусь, разбираюсь во всех премудростях, конкретно сейчас рою информацию на счет грамотного и безопасного обращения к бд.
    Я нашел несколько способов, это использовать PDO и все делать через подготовленные запросы с плейсхолдерами и прочей лабудой, однако дело в том, что я не очень люблю PDO, и использую MySQLi.
    Не могли бы Вы подсказать моей темной голове, как обойти эти страшный SQL инъекции используя MySQLi. Полазил тут по разным кмс, у всех по разному, но обычно прогоняли через mysqli_real_escape_string, есть ли какие-то ньансы, которые я не вижу?
     
  2. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
  3. Stairdeck

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

    С нами с:
    9 ноя 2014
    Сообщения:
    47
    Симпатии:
    0
    Адрес:
    Россия
    Я просто пытаюсь как-то создать свою библиотеку для работы с базами данных и плейсхолдеры были бы не очень уместны.
     
  4. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Плейсхолдеры, конечно же, это часть решения проблемы, но в своих проектах, я не обхожусь без фильтрующих функций. Исключением могут являться какие-нибудь числовые значения, которые можно явно преобразовывать к типу integer/float перед использованием в запросах. Можете пока остановиться на этом.
     
  5. Stairdeck

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

    С нами с:
    9 ноя 2014
    Сообщения:
    47
    Симпатии:
    0
    Адрес:
    Россия
    Ну да, я читал, что плейсхолдерами дело не обходится, проверяют ещё обычно переменную на соответствие типу. Но неужели нельзя обойтись таким простым, удобным, веселым mysqli_real_escape_string? :(
     
  6. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Почему же нельзя? Обходитесь. Если для ваших задач достаточно экранирования, то почему бы и нет.
     
  7. Stairdeck

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

    С нами с:
    9 ноя 2014
    Сообщения:
    47
    Симпатии:
    0
    Адрес:
    Россия
    Хорошо, все же спрошу для уверенности. В каких случаях лучше не использовать экранирование, а сделать все через подготовленные запросами с проверкой типа переменной?
     
  8. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Я таких случаев - "лучше не экранировать" - не знаю. Если вы сами в запросе прописываете какие-то значения, то можно не экранировать, но всё, что касается данных, которые приходят с клиента, то обрабатывать их всегда и безоговорочно.
     
  9. Stairdeck

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

    С нами с:
    9 ноя 2014
    Сообщения:
    47
    Симпатии:
    0
    Адрес:
    Россия
    Не, я имел в виду то, что простая экранизация может не подойти, и нужно будет использовать подготовленные запросы с проверками.
     
  10. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
  11. hopchik

    hopchik Новичок

    С нами с:
    31 июл 2016
    Сообщения:
    1
    Симпатии:
    0
    Добрый день!

    Наткнулся на данный топик, т.к. тоже интересует этот вопрос.

    В некоторых статьях встречается неоднозначное трактование функции mysql_real_escape_string, например, https://habrahabr.ru/post/148701/.
    Т.е. первичная задача этой функции форматировать строку, а как функция безопасности - это побочный эффект.

    В некоторых фреймворках в классе работе с БД отражается эта функция и рекомендуется ее использовать.

    В связи с этим вопрос, достаточно ли просто экранировать переменные, предварительно приведя их к типу? Нет ли угрозы "залета" в SQL-запрос какого-то набора спецсимволов?
     
  12. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
  13. igordata

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

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