Задать вопрос
  • Что конкретно делает эта функция mysqli_real_escape_string()?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это хороший вопрос, в первую очередь потому что найти человека, который знает правильный ответ, практически нереально. Опроси 10 похапешников, 10 из них тебе наплетут ереси, которая не имеет с реальностью ничего общего. Любой, кто заикнется про SQL инъекции, уже облажался.

    При том что функция эта совершенно примитивная - экранировать кавычки в строках SQL. Для соблюдения корректного синтаксиса. Это единственная функция этой функции, и больше ни для чего она не нужна.

    Как ты, наверное, уже знаешь, строки в SQL берутся в кавычки:
    SELECT * FROM table WHERE name='vasya'
    Вот чтобы vasya не приняли за имя таблицы или ключевое слово, его берут в кавычки. Очень просто. Но иногда у человека имя не просто вася. Что будет вот с таким запросом?
    SELECT * FROM table WHERE name='Я Д'Артаньян, а все вокруг ...'

    Мясорубка будет. БД решит, что имя - это 'Я Д', а дальше какая-то фигня, которую она не понимает. И выдаст ошибку.
    Поэтому кавычки надо экранировать.
    SELECT * FROM table WHERE name='Я Д\'Артаньян, а все ...'

    никаких ошибок не выдаст.
    Вот mysqli_real_escape_string() как раз этим и занимается - экранирует кавычку слешем, а заодно и сам слеш, потому что если слеш окажется в конце строки,
    SELECT * FROM table WHERE text='Мну сегодня в любви вкладкой ошиблись :\'

    то БД решит, что последняя кавычка экранирована, и строка не заканчивается. Снова мясорубка.
    Также mysqli_real_escape_string() экранирует еще несколько символов, но уже из чисто эстетических соображений.

    Еще одна функция этой функции - принимать в расчет кодировку текста. Есть кодировки, в которых слеш - это не слеш, а часть другого символа. И когда БД будет парсить запрос, она не поймет, что это слеш, а решит что это просто буква. И снова мясорубка.
    Поэтому перед использованием mysqli_real_escape_string() надо сказать БД, в какой кодировке у нас данные, с помощью функции mysqli_set_charset().

    Но читатель уж сучит ножками в нетерпении - а что же SQL инъекции, о которых так долго говорили большевики? Не может же быть, чтобы они были совсем не при чем. Окей, в качестве побочного эффекта, строка, в которой экранированы спецсимволы (слеш и кавычка), не пропустит инъекцию. Но здесь следует понимать две вещи:

    1. Строки надо форматировать в любом случае, независимо от того, ждем мы инъекцию, или нет. Мясорубка нам точно так же не нужна.
    2. Строками синтаксис SQL запросов не исчерпывается. Есть числовые литералы, есть имена полей. Для всех них mysqli_real_escape_string() бесполезна чуть более чем полностью.

    То есть, отсюда можно сделать вывод, что нельзя использовать mysqli_real_escape_string() для защиты от инъекций. Она предназначена для другого. Вот для этого другого, для форматирования строк, ее использовать можно. Но не нужно.

    Нашлись умные люди, которые придумали, что колупаться вручную с форматированием переменных для SQL запроса - это долго, неудобно, и можно что-то забыть или перепутать. И пусть лучше БД сама этим занимается. И придумали вместо переменных подставлять в запрос специальные маркеры, а сами переменные передавать отдельно. А БД уже потом сама разберется, что и как форматировать.

    В принципе, mysqli умеет так делать, но не так удобно как PDO. Поэтому при возможности вместо нее лучше использовать PDO:
    $stmt = $pdo->prepare("SELECT * FROM table WHERE name=? or name=?")
    $stmt->execute(["Vasya", "Д'Артаньян"]);
    $rows = $stmt->fetchAll();
    - и получить, в итоге, готовый массив с данными, которые вернула БД.
    Если же возможности нет, то кода придется написать чуть побольше
    $stmt = $mysqli->prepare("SELECT * FROM table WHERE name=? or name=?")
    $stmt->bind_param("ss", ...["Vasya", "Д'Артаньян"]);
    $stmt->execute();
    $rows = $stmt->fetch_all(MYSQLI_ASSOC);


    Но при этом всё равно никакой тебе возни с кавычками, слешами, real, escape, и прочей ерундой. Просто, быстро, лаконично и безопасно.
    Ответ написан
    4 комментария
  • Как предотвратить просвет IP сквозь Proxy?

    Host-Eiweb
    @Host-Eiweb
    Хостинг VPS серверов в Европе и США
    Это называется Fingerprint "отпечаток", в данном случае (отпечаток браузера).

    Немного ознакомиться с этим можно по этой статье:
    https://geektimes.ru/post/284604/
    Общие методы получения информации доступно раскрыты в этой статье (не углубленная информация):
    https://forumpenza.ru/content.php?r=84-Informatsiy...

    На этих ресурсах можно провериться:
    Ответ написан
    Комментировать
  • Какой VoIP телефон выбрать для офиса?

    @MinamotoSoft
    алкатель (если есть лишние деньги)

    грандстрим - если денег нет то чтото типа www.grandstream.com/products/ip-voice-telephony/en...

    Остальное - отлукавого.

    Из практики могу посоветовать брать только с PoE. Иначе геммора с БП поимеешь пополной.
    Ответ написан
    Комментировать
  • Какой софт для IP видеонаблюдения использовать?

    @dero2084
    Discovering new
    Здравствуйте.
    Можете поставить продукт от Milstone Systems XProtect Go - бесплатная версия. Есть свои ограничения, но все же!
    Ссылка на продукт..
    Ответ написан
    2 комментария
  • Как ускорить работу Drupal?

    @archelon
    Во-первых, обновите drupal. Все сайты на версии ниже 7.32 под угрозой взлома. Сам недавно разгребал.
    Во-вторых, поставьте модуль devel и смотрите, что больше всего тормозит.
    Это вкратце. Тема оптимизации drupal освещена много где и очень подробно.
    Ответ написан
    Комментировать
  • Бесплатная программа для IP-камер (сервер + клиент)

    @MatrixFailure
    Есть opensource программа zoneminder для Linux-a.
    Если для Windows то это сложнее. Встречается бесплатный софт от производителей камер, вроде AXIS или Arecont Vision.
    А некоторые серьезные производители софта предлагают часть каналов бесплатно. ITV, Milestone, кодос.
    Ответ написан
    Комментировать
  • Как организовать безопасность общения: сайт - сервер платежной системы ?

    akubintsev
    @akubintsev
    Опытный backend разработчик
    1. Действительно, нужен прежде всего VPS.
    2. ssh порт сделать нестандартным.
    3. Закрыть в фаерволе все порты, кроме необходимых. Разрешить доступ только со своих IP.
    4. Установить 2-факторную аутентификацию Google Authenticator + блокировку на превышение числа попыток авторизоваться.
    5. Использовать SSL, как при передаче файлов (ssh, sftp), так и для веба (https).
    6. Файлы проекта вынести выше папки document_root, оставив в ней только те, что нужны для доступа из web.
    7. Выставить права на файлы и каталоги таким образом, чтобы изменять файлы и каталоги мог только владелец (например пользователь deploy), а www-data мог только читать. За исключением только тех файлов и каталогов, где нужны права на запись.
    8. Установить OSSEC или аналог для аудита критически важных файлов (системные и проектные конфиги, данные для доступа к платёжной системе и т.п.), чтобы алерты отсылались сразу на почту.
    Ответ написан
    Комментировать
  • Как организовать безопасность общения: сайт - сервер платежной системы ?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Да закрыть вообще все кроме 22, 80 и 443 порта. Ну и все через HTTPS. Двухфакторная авторизация была бы не лишней и не только в админке.
    Ответ написан
    4 комментария
  • Одновремеменная работа нескольких людей на одном компьютере

    @romankit
    1. АСТЕР — программа (и только программа!), позволяющая нескольким пользователям работать с одним компьютером так же свободно, как если бы каждый имел отдельный персональный компьютер.

    2. На хабре была статья Два и более рабочих места на одном компьютере — бесплатное решение habrahabr.ru/post/210668
    Ответ написан
    1 комментарий
  • Как принимать звонки из РФ в Украине без роуминга?

    Первым делом нужно поставить GSM шлюз (описание)
    Могу посоветовать китайское оборудование OpenVOX.
    Удобство заключается в возможности масштабирования и монтирования в обычные RACK-стойки.
    Качество оборудования очень приемлемое по сравнению с аналогами.

    Все зависит от ваших потребностей.
    Можно купить к примеру короб VS-GW1202, и плату расширения VS-GWM400G - получится 4 симки, при этом можно поставить ещё одну на 8 симок. Есть коробы на 5 плат расширения OpenVox VS-GW1600 - т.е. на 20 симок.

    4 симки с коробом обойдутся где-то в 450-500$.

    Если вам нужно 4-8 симок, можно обойтись карточками OpenVox G400E или OpenVox G400P они где-то по 125$.

    Вторым делом нужно ставить и настраивать сервер телефонии Asterisk и прикрутить это железо.
    Есть готовые сборки типа Elastix с ними должно быть чуть проще.
    Ответ написан
    4 комментария