Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помогите, пожалуйста, написать выражение для проверки SQL-запроса

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Необходимо проверить, что обращение идет только к разрешенной таблице
combatlynx
Отправлено: 12 Апреля, 2016 - 17:40:54
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Апр. 2016  


Помог: 0 раз(а)




Физический смысл: если в запросе, приведенном ниже, идет обращение к таблице, отличной от SD, то нужно забраковать такой запрос.
select sd.id, (select sum(val) from SD where id=1) - (select sum(val) from SD where id=2) res
from SD, SD a, (select * from SD) ab, SD b left join (SD c join SD d on c.id=d.up) e on e.t=b.t
where (select max(id) from SD where id=a.up)=0 and sd.id=a.up and a.t=ab.id and b.up=a.t
order by sd.id, sd.up

Попытался описать своими словами последовательность поиска:
1) from или join
2.1) любое количество пробельных символов и скобок, затем слово не SD до следующего вхождения SELECT, ORDER, GROUP, JOIN
2.2) или любой текст или символы до первой "," до следующего вхождения SELECT, ORDER, GROUP, JOIN, после которой идет любое количество пробельных символов и скобок, затем слово не SD
 
 Top
combatlynx
Отправлено: 18 Апреля, 2016 - 12:50:53
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Апр. 2016  


Помог: 0 раз(а)




Написал такое вот выражение:

CODE (htmlphp):
скопировать код в буфер обмена
  1. (from|join)[\s(]*([\s(])\b(?!sd\b)|from[^,]*([\s(]*,[\s(]*\b(sd\b)|[\s(]*,[\s(]*\b(sd[\s]*[\w]*\b))*[\s(]*,[\s(]*\b(?!sd\b|select\b)


Натравливаю на запрос:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT sd.id, res1 (SELECT sum(val) FROM   SD WHERE id=1) - (SELECT sum(val) FROM SD WHERE id=2) res
  2. FROM SD, SD фф, sd 'sfg', sdf, (SELECT AS, cb FROM SD, sd, sdf) ab,     SD b LEFT JOIN (SD c JOIN SD d ON c.id=d.up) e ON e.t=b.t
  3. WHERE (SELECT max(id) FROM SD WHERE id=a.up)=0 AND sd.id=a.up AND a.t=ab.id AND b.up=a.t
  4. ORDER BY sd.id, sd.up
  5.  

Осталось решить две проблемы: кириллические буквы в именах таблиц и упоминание алиасов в апострофах/кавычках (см. скриншот): фрагменты "SD фф, sd 'sfg'" не дает обнаружить идущий за ним недопустимый "sdf"
[img]https://yadi.sk/i/x3WMjEmZr5pjQ[/img]
Прикреплено изображение (Нажмите для увеличения)
regexp.png

(Отредактировано автором: 18 Апреля, 2016 - 12:51:47)

 
 Top
Vitaly
Отправлено: 18 Апреля, 2016 - 14:36:13
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Апр. 2016  


Помог: 0 раз(а)




combatlynx, попробуйте следующее выражение
CODE (htmlphp):
скопировать код в буфер обмена
  1. (from|join)[\s(]*([\s(])\b(?!sd\b)|from[^,]*([\s(]*,[\s(]*\b(sd\b)|[\s(]*,[\s(]*\b(sd[\s]*'?\w*\b'?))*[\s(]*,[\s(]*\b(?!sd\b|select\b)

А чтобы "палить" кириллические буквы использйте модификатор для юникода /u:

PHP:
скопировать код в буфер обмена
  1. $re = "/(from|join)[\\s(]*([\\s(])\\b(?!sd\\b)|from[^,]*([\\s(]*,[\\s(]*\\b(sd\\b)|[\\s(]*,[\\s(]*\\b(sd[\\s]*'?\\w*\\b'?))*[\\s(]*,[\\s(]*\\b(?!sd\\b|select\\b)/iu";
  2. $str = "..<<select>>.."
  3. preg_match_all($re, $str, $matches);



Ах, про кавычки то и забыл. Тогда вот так:
CODE (htmlphp):
скопировать код в буфер обмена
  1. (from|join)[\s(]*([\s(])\b(?!sd\b)|from[^,]*([\s(]*,[\s(]*\b(sd\b)|[\s(]*,[\s(]*\b(sd[\s]*(?<quotGrp>['"]?)\w*\b(?P=quotGrp)))*[\s(]*,[\s(]*\b(?!sd\b|select\b)


PHP:
скопировать код в буфер обмена
  1. $re = "/(from|join)[\\s(]*([\\s(])\\b(?!sd\\b)|from[^,]*([\\s(]*,[\\s(]*\\b(sd\\b)|[\\s(]*,[\\s(]*\\b(sd[\\s]*(?<quotGrp>['\"]?)\\w*\\b(?P=quotGrp)))*[\\s(]*,[\\s(]*\\b(?!sd\\b|select\\b)/iu";
  2. $str = "..<<select>>.."
  3. preg_match_all($re, $str, $matches);


Подмигивание

(Отредактировано автором: 18 Апреля, 2016 - 14:53:11)

 
 Top
Folod
Отправлено: 20 Апреля, 2016 - 23:25:12
Post Id



Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Апр. 2016  


Помог: 0 раз(а)




спасибо, тот же вопрос интересовал !
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB