За последние 24 часа нас посетил 17521 программист и 1313 роботов. Сейчас ищут 1132 программиста ...

Замена строк в запросе к БД

Тема в разделе "Регулярные выражения", создана пользователем danies, 21 апр 2015.

  1. danies

    danies Новичок

    С нами с:
    21 июл 2014
    Сообщения:
    38
    Симпатии:
    0
    Такая задача. У меня каждый запрос к мускулю фильтруется функцией, которая вырезает плохие слова и помещает значения в mysql_real_escape_string для экранизации символов. Так вот, я это сделал весьма печальным и кривым способом, разбивая строку на массив и добавляя уйму исключений..и пришла мысль альтернативы.

    Чтобы знать, какие именно строки экранировать, можно обособлять эти места любым символом(предположим,#!#). Функция должна искать все совпадения и заменять на соответствующую строку. То есть:

    Код (PHP):
    1. $string=preg_replace('/#!#(.*)#!#/is',mysql_real_escape_string('$1'),$str);
    Соответственно этот вариант не работает, тк он не отправляет запоминание, а просто строку "$1".
    Второй вариант:

    Код (PHP):
    1. $result_id = preg_match_all("/#!#([^(#!#)]*)#!#/is", $str_, $id);
    2.                     
    3. for($i=0; $i<$result_id; $i++){                                    
    4.     $string_=preg_replace('/#!#([^(#!#)]*)#!#/is',mysql_real_escape_string($id[0][$i]),$str_);    
    5.     $string_=str_replace("#!#","",$string_);                    
    6. }
    В этом случае обособляются переменные, которые нужно обработать, далее ищем кол-во совпадений по ним, заменяем их на экранированный вариант и вставляем обратно,убирая потом лишние знаки.

    Но это слишком кривой(?) метод. Да и то, в нем тоже есть 1 проблема: почему-то наотрез отказывается экранировать символ \.

    Как пример:
    Код (PHP):
    1. name='#!#\'"#!#' //Строка в запросе
    2. #!#\'"#!# // найденный фрагмент в этой строке по регулярке
    3. SELECT * FROM users WHERE name='\\'\"' //Вот что выводит..то есть 1 слеш так и остается сам по себе, из-за этого в свою очередь появляется кавычка , которая портит результат
    Можно как-то сделать задуманное мной проще?
     
  2. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    Модификатор e, стоит о нем прочитать но также и задуматься - чтобы дырку не сделать - ибо в строке может прийти код на выполнение, а так как вы его будете обрабатывать нужно учитывать каждый шаг. Вообщем осторожнее с ним...
     
  3. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    в первую очередь тебе стоит о нем почитать. он носит статус депрекейтед уже давно :D
     
  4. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    не проще ли использовать PDO?
     
  5. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    Автору, чихать на это. Если ты глазами еще не увидел.