регулярное выражение: пытается улучшить это регулярное выражение - PullRequest
0 голосов
/ 12 декабря 2011

Я использую это регулярное выражение:

[']?[%]?[^"]#([^#]*)#[%]?[']?

в этом тексте:

insert into table (id,name,age) values ('#var1#' ,#var2#,'#var3#', 3, 'name') where id = '#id#' like "" 
and test=<cfqueryparam value="#id#">

По какой-то причине он ловит запятую между #var2# и '#var3#', но когда явключай [^,] он начинает делать странные вещи.Может ли кто-нибудь помочь мне с этим.

Когда я читаю свое регулярное выражение сейчас, оно должно найти что-нибудь, что:

  • может иметь одну кавычку
  • может иметьПроцент
  • не имеет двойной кавычки
  • , затем имеет хеш (#)
  • , за которым не следует хеш, но все остальные символы
  • затем имеет хеш, за которым следует процент или кавычка

Так почему же, когда я добавляю "без запятой" перед ним, разрывается регулярное выражение ??


Обновленный вопрос:

хорошо, попробую объяснить: запрос может выглядеть следующим образом:

SELECT  e.*, m.man_id, m.man_title, c.cat_id, c.cat_name
FROM    ec_products e, ec_categories c, ec_manufacturers m
WHERE   c.cat_id = e.prod_category AND
        e.prod_manufacturer = m.man_id AND
        e.prod_title LIKE <cfqueryparam value="%#attributes.keyword#%"> and
test='#var1#'
ORDER BY e.prod_title  

Теперь я хочу, чтобы каждое значение находилось в диапазоне ##, но не в значениях, окруженных тегом queryparam,Так что в примере я хочу #var1#, но не #attributes.keyword#.Причина этого заключается в том, что все параметры в запросе, которые не окружены тегом, небезопасны и могут вызвать внедрение SQL.Мое текущее регулярное выражение -

(?!")'?%?#(?!\d)[\w.\(\)]+#%?'?(?!")

, и оно почти там.Он находит attributes.keyword из-за %.Я просто хочу все, что имеет ##, но не заключено в двойные кавычки, поэтому не "##".Это даст мне все небезопасные параметры в sql, такие как '#var#', или #aNumber#, или '%##', или '%##%', или '##%, но НЕ такие вещи, как

<cfqueryparam value="#variable#">

.Надеюсь, вы понимаете мои намерения?

Ответы [ 3 ]

2 голосов
/ 12 декабря 2011

Я думаю, вы, возможно, неправильно поняли [^"].Это не означает «не имеет двойных кавычек», а означает «один символ, который не является двойными кавычками».Точно так же [^,] означает «один символ, который не является запятой».Таким образом, ваше регулярное выражение:

[']?[%]?[^"]#([^#]*)#[%]?[']?

будет соответствовать - например - этому:

2#,'#

, которое состоит из нулевых одинарных кавычек, нулевых знаков процента, одного символа, который естьне двойные кавычки (а именно 2), один хеш-знак, два символа, которые не являются хэш-знаками (а именно ,'), один хеш-знак, ноль процентов и нольапостроф.,' - это то, что будет заключено в скобки.


Обновление для обновленного вопроса:

Я не думаю, что то, что вы описываете, возможноиспользуя просто регулярное выражение ColdFusion, потому что для этого потребуется "lookbehind" (чтобы гарантировать, что не предшествует двойная кавычка), что, по-видимому, ColdFusion regexx (поиск) не поддерживает.Однако:

  • Этот ответ StackOverflow дает способ использования регулярных выражений Java в ColdFusion.Если вы используете эту технику, то вы можете использовать регулярное выражение Java
    '?%?(?<!")(?<!"')(?<!"%)(?<!"'%)#(?!\d)[\w.()]+#(?!%?'?")%?'?
    , чтобы гарантировать отсутствие предшествующих двойных кавычек.
  • Вы никогда не упоминали, как на самом деле используете это регулярное выражение.Будет ли это работать для вас, чтобы соответствовать
    .'?%?#(?!\d)[\w.()]+#%?'?(?!")
    (то есть, чтобы соответствовать не только интересующему разделу, но и предыдущему символу), а затем отдельно подтверждает, что подобранная подстрока не начинается с двойной-quote?

Я также вынужден упомянуть, поскольку похоже, что вы пытаетесь использовать сопоставление с образцом на основе регулярных выражений, чтобы помочь обнаружить и адресовать точки возможного внедрения SQL, что этоплохая идея;вы никогда не сможете сделать это идеально, поэтому, если что-нибудь, я думаю, это в конечном итоге увеличит ваш риск внедрения SQL (увеличивая вашу зависимость от ошибочной методологии).

1 голос
/ 12 декабря 2011

Сохранение вашей группы захвата из начального регулярного выражения, вот пересмотренное выражение.

'?%?(?!")#([^#]+)#%?'?
0 голосов
/ 12 декабря 2011

На основании предоставленной вами информации это должно быть правильно.

'?%?(?!")#[^#]+#%?'?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...