• Что конкретно делает эта функция 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 комментария
  • Как сверстать подобные блоки?

    aliencash
    @aliencash
    Партизан
    Дизайнера на кол. Картинками делайте.
    Ответ написан
    4 комментария
  • Как вывести строку из txt файла по порядку на php?

    copist
    @copist
    Empower people to give
    $filepath = 'path/to/file.txt'; // файл со строками
    $filenumpath = 'path/to/file.line'; // дополнительный файл с номером последней строки
    
    $file = file($filepath);
    $linenum = is_file($filenumpath) ? 1+(int)trim(file_get_contents($filenumpath)) : 0; // прочитать номер из файла; если файла нет, то номер = 0
    echo $file[$linenum%count($file)]; // вывести строку
    file_put_contents($filenumpath, $linenum); // записать номер в файл
    Ответ написан
    7 комментариев
  • Существуют ли консольные аналоги аиды?

    @res2001
    Developer, ex-admin
    Многое можно выудить используя wmic.
    Например:
    wmic baseboard get product,Manufacturer,version,serialnumber
    Ответ написан
    Комментировать
  • Стоит ли пытаться доказать гуглу что заблокированные "приложения с похожим функционалом" и должны быть такими?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    успешные случаи есть, но оочень растянуто во времени - до полугода

    попробуйте, с четкими ссылками на их правила, может, сами себя убедите что Гугл прав ))
    Ответ написан
    1 комментарий
  • Запрос стал некорректным в чем может быть причина?

    unfilled
    @unfilled
    SELECT `cms`.`vote_values`.`user_id`,`cms`.`vote_values`.`username`,`ip`, count(*) as cnt, 
    count(CASE WHEN `user_vote`=5 THEN 1 ELSE NULL END) as cnt5,
    count(CASE WHEN `user_vote`=4 THEN 1 ELSE NULL END) as cnt4,
    count(CASE WHEN `user_vote`=3 THEN 1 ELSE NULL END) as cnt3,
    count(CASE WHEN `user_vote`=2 THEN 1 ELSE NULL END) as cnt2, 
    count(CASE WHEN `user_vote`=1 THEN 1 ELSE NULL END) as cnt1,
    `user_posts`,DATE_FORMAT(FROM_UNIXTIME(`user_regdate`), '%e %b %Y') AS 'date_formatted',`user_avatar`,`user_email`
    FROM `cms`.`vote_values` left join `test`.`phpbb_users` 
    on `cms`.`vote_values`.`user_id`= `test`.`phpbb_users`.`user_id`
    where `vote_id`=5 GROUP BY `cms`.`vote_values`.`user_id`   ORDER BY `vote_values`.`ip` ASC
    Ответ написан
    Комментировать
  • Кто сталкивался с биткоин вымогателями бд?

    sim3x
    @sim3x
    Вас взломали и у вас нет квалификации в расследовании взлома?
    Делаем образ выключенной системы снаружи и бекапим его себе (зачем? Возможно найдете того кто сможет расследовать)
    Берем список софта и убираем из него все, что не требуется для работы сервиса
    - пхпмайадмин, фтп, как раз примеры такого софта

    Сносим ОС (считайте что скомпроментирован рут и все тулзы ОС)
    И ставим по хорошему мануалу с изрядной долей паранои (чаще всего одна статья не поможет - делайте свои заметки при установке)
    Максимально изолируем все от всего
    Наружу смотрит только вебсервер
    ссш по портпиннингу (оно делается в полпинка, как на стороне клиента так и на стороне сервера)
    Ваши цмс и скрипты должны обновляться регулярно
    Следите за логами - часто взлом происходит в течении нескольких дней и простой греп по логам покажет, кого вам нужно забанить по ип и где поставить капчу

    То что у вас есть бекапы делает вашу ситуацию в разы лучше
    Ответ написан
    Комментировать
  • Opencart 2 как настроить порядок выполнения модулей?

    zoozag
    @zoozag
    Opencart
    1. Если речь про расширения ocmod, удалите лишний код в модулях, которые оперируют с теми же участками кода.
    2. Если речь про модули, они подгружаются так:
    $modules = $this->model_design_layout->getLayoutModules($layout_id, 'content_bottom');
    
    		foreach ($modules as $module) {
    // Подгружаются модули
    }

    Грузите свой модуль вручную после этого цикла. Но другие модули скорее всего непосредственно контроллер хедера модифицируют по первому варианту.
    Ответ написан
    1 комментарий
  • Почему перестало работать после замены sql запроса хотя запрос рабочий?

    @BorisKorobkov Куратор тега PHP
    Web developer
    Комментировать
  • Почему перестало работать после замены sql запроса хотя запрос рабочий?

    SagePtr
    @SagePtr
    Еда - это святое
    Полагаю, функция mysqli_query предназначена для выполнения одного запроса за раз (хотя это не указано в документации, как ни странно, но неявно вытекает из существования функции mysqli_multi_query). Вы же в эту функцию передаёте два. Попробуйте двумя разными вызовами оба запроса выполнить.
    Ответ написан
    Комментировать
  • Как соединить все строки ссылающиеся на запись в другой таблице в одну строку?

    402d
    @402d
    начинал с бейсика на УКНЦ в 1988
    функции concat() group_concat()
    blog.nagaychenko.com/2010/06/15/%D1%80%D0%B0%D0%B1...
    Ответ написан
    Комментировать
  • Какой самый лучший freeware Файловый Менеджер?

    @kr_ilya
    Я использую Total Commander, как по мне, в нём файлами оперировать удобнее, да и функций больше
    Ответ написан
    5 комментариев
  • Как убрать подчеркивание у части текста внутри ссылки?

    andykov
    @andykov
    Shit happens
    span {
      display: inline-block;
    }
    Ответ написан
    Комментировать
  • Где почитать о том что значит *= в css?

    HamSter007
    @HamSter007
    HTML/CSS верстальщик
    www.w3schools.com
    htmlbook.ru

    Это означает, что html тег с атрибутом data-useragent который включает значение Android ( пример: <html data-useragent='Android-1' ... >, <html data-useragent='1-Android' ... >, <html data-useragent='kjgg Android hjhgg' ...> ...) будет с фоном цвета silver.
    Ответ написан
    Комментировать
  • Где почитать о том что значит *= в css?

    UnluckySerivelha
    @UnluckySerivelha
    Ответ написан
    Комментировать
  • Где почитать о том что значит *= в css?

    iiiBird
    @iiiBird Куратор тега CSS
    Пока ты спишь - твой конкурент совершенствуется
    Комментировать
  • Какую IDE выбрать для разработки под Android?

    sim3x
    @sim3x
    IDEA - основной продукт, все фичи сначала обкатываются на соседних продуктах, а потом приходят в основной
    Если вам требуется весь зоопарк иде в одной, тогда ето ваш выбор

    Если только андроид и фичи посвежее - Андроид Студия
    Ответ написан
    Комментировать
  • Как автоматизировать, чтобы расставлять цвета в зависимости от содержаний ячейки?

    @kalapanga
    Это делается условным форматированием. Выделить столбец В. Далее Главная - Условное форматирование - Создать правило... и т.д. Правило будет типа если $A1="да" то формат серая заливка
    Ответ написан
    1 комментарий
  • Агрессивное собирание инфы о пользователе через браузерный js?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Сбор инфы - только для троллинга ЦА к покупке вашего продукта (Или нет?!)
    Не нужно тратить время на тех, кто пришёл просто, чтобы потролить вас.

    Как делаю я:
    вешаю краткое назначение продукта и текст:
    "Мы продаём только тем, кому это нужно. Всем остальным - просьба не беспокоить.
    Если Вы заинтересованы и Вам это реально нужно - заполните следующие поля формы:"
    и тут форма на 2 поля и кнопка "Без вопросов".

    Всё остальное - нах не сдалось!
    Задача, не насобирать бесполезной инфы, а сразу получить АДЕКВАТНЫХ ЦЕЛЕВЫХ клиентов, которые купят с вероятностью более 80% ваш РЕАЛЬНО НУЖНЫЙ ПРОДУКТ/УСЛУГУ!
    (Или я что-то путаю?!)

    PS: мне вообще не интересно его: имя, ник, пол, возраст, друзья и кол-во ласт, если он вдруг пингвин) Купил? Отлично! -> Я - в прибыли!
    Ответ написан
    1 комментарий
  • Плавный display none?

    profesor08
    @profesor08 Куратор тега CSS
    Сначала анимируешь исчезновение блока, потом задаешь ему display:none;
    Чтоб показать блок, делаешь все наоборот. Задаешь ему display:block, а потом анимируешь его появление.
    Тут нет ничего сложного или каких-то скрытых знаний, все просто и в лоб.
    Ответ написан
    3 комментария