Автор Тема: Как РВ помогают при работе с MsSQL  (Прочитано 5455 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Yukko

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1586
  • +0/-0
  • 0
    • Просмотр профиля
    • http://estrabota.com.ua
Как РВ помогают при работе с MsSQL
« : 20 Сентября 2003, 18:35:02 »
Для работы с MySQL в PHP есть функция addslashes(), которая обрабатывает sql
запрос (другую подобную строку), ставя перед ",\',NULL, \\ обратный слэш \\
НО! Если есть необходимость сделать тоже самое под MsSQL, Oracle (не проверено,
но стоит попробовать, там такие же требования к запросам!) то надо поступать
по-другому, потому чтобы вставить в MsSQL одиночную кавычку, надо ее удвоить, двойная кавычка пишется без экранирования...

MsSQL принимает запросы в виде:

INSERT INTO dbo.USERS (UserName,) VALUES (\'yukko10\')

Т.е. строки обрамляются одиночными кавычками.
Чтобы вместо yukko10 вставить yukko\'s10 надо удвоить кавычку и написать:

INSERT INTO dbo.USERS (UserName,) VALUES (\'yukko\'\'10\')

Лень! Да и к тому же все входящие данные, которые пойдут в БД,
надо обработать на предемет присутсвия одиночной кавычки.
Автоматизируем процесс!
Код:

   $query = "INSERT INTO dbo.USERS (UserName,) VALUES (\'yukko\'10\')";
   $query = preg_replace("/(?<=\')([a-zA-Z0-9 ]+(\')(?:[a-zA-Z0-9 *]?\')*[a-zA-Z0-9 ]+)(?=\'[a-zA-Z0-9 ]+=| *$|)/e","str_replace( \\"\'\\" ,\\"\'\'\\",\'\\\\1\')",$query);
   echo $query;

Выведет:
INSERT INTO dbo.USERS (UserName,) VALUES (\'yukko\'\'10\')

Соответственно на строку
INSERT INTO dbo.USERS (UserName,) VALUES (\'yukko\'\'10\')

Выведет:
INSERT INTO dbo.USERS (UserName,) VALUES (\'yukko\'\'\'\'10\')

Четыре кавычки внутри и по одной снаружи слова yukko\'\'10, чтобы отделить
строку в sql запросе.

Прошу тестировать и присылать ошибки и исправления!

По адресу:
http://detail.phpclub.net/2000-12-05.htm
описаны оч. распространненые грабли, на которые можно наступить при работе с MySQL... с MsSQL точно такая же ситуация, т.е. например у вас в скрипте есть запрос:

SELECT     *
FROM         dbo.USERS
WHERE     (UserName = \'$user\') AND (Password \'$somepass\')

Этим запросом вы проверяете, есть ли пользователь new с паролем somepass  в БД USERS... но значения для Username и Password поступают от пользователя... черезвычайно умный пользователь пишет:
Username <что угодно>
Password \') OR (UserName = \'some_valid_user\')--

Что происходит?
Получается запрос:
SELECT     *
FROM         dbo.USERS
WHERE     (UserName = \'что_угодно\') AND (Password = \'\') OR
                      (UserName = \'some_valid_user\')--\'

Человек получает данные от имени some_valid_user не вводя его пароля... Таким же образом, можно выполнить любой запрос (MsSQL поддерживает вложенные запросы) и например добавить нового пользователя, но данное обсуждение наверное уже должно идти в Технологии, алгоритмы и стандарты, а мы продолжаем про реги :)

Так вот приведенное выше РВ сделает подобное невозможным... хотя позже mssql_query($query); и выведет сообщение об ошибке. решается несколькими путями:
либо теми же регами делаем замену всех select, update, delete, drop, or, and (кроме первого вхождения) и тому подобных слов на пусто, либо делаем
error_reporting (0);
.....
mssql_query($query) or die("Неправильная комбинация Имя/пароль");

Если вы при регистрации сделаете такую же замены при помощи регов, то поверьте, у вас никогда не будет в базе пользователя с таким милозвучным паролем:
\') OR (UserName = \'some_valid_user\')--
А это значит, что все кто попытается сделать такую штуку, получат вполне верное сообщение об ошибке...

Продолжение следует... поставьте РВ себе на службу.
работа в Украине

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Как РВ помогают при работе с MsSQL
« Ответ #1 : 20 Сентября 2003, 19:06:56 »
по поводу удвоения кавычек, глянь в php.ini :
Цитировать
; Use Sybase-style magic quotes (escape \' with \'\' instead of \\\').
magic_quotes_sybase = Off
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Yukko

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1586
  • +0/-0
  • 0
    • Просмотр профиля
    • http://estrabota.com.ua
Как РВ помогают при работе с MsSQL
« Ответ #2 : 20 Сентября 2003, 19:12:04 »
Цитировать
Макс:
по поводу удвоения кавычек

ИМХО, если magic_quotes_sybase = On, MsSQL не пропустит... получится запрос типа
INSERT INTO dbo.USERS (UserName,) VALUES (\'\'yukko\'\'\'\'10\'\')
что недопустимо!
либо я чего-то не понял...
это можно делать с отдельными значениями, например yukko\'s будет преобразовано в yukko\'\'s после вставки в запрос все будет правильно, но я на рег передаю весь запрос и не беспокоюсь про замену \' на \'\' в каждой отдельной строке, если не прав, то поправь...
работа в Украине

Оффлайн Yukko

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1586
  • +0/-0
  • 0
    • Просмотр профиля
    • http://estrabota.com.ua
Как РВ помогают при работе с MsSQL
« Ответ #3 : 20 Сентября 2003, 19:19:30 »
Тем более, что РВ не только в РНР есть... :)
работа в Украине

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Как РВ помогают при работе с MsSQL
« Ответ #4 : 20 Сентября 2003, 19:23:04 »
чесно говоря, идея обрабатывать весь запрос регом мне интуитивно не нравится (пока не могу объяснить почему). Меня всегда устравиала обработка отдельных строк используемых в запросе.

Кстати, обычно в системах регистрации пароли хешируются
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Yukko

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1586
  • +0/-0
  • 0
    • Просмотр профиля
    • http://estrabota.com.ua
Как РВ помогают при работе с MsSQL
« Ответ #5 : 20 Сентября 2003, 19:34:27 »
Цитировать
Макс:
Кстати, обычно в системах регистрации пароли хешируются

А это у кого как... RADIATOR хранит их просто в открытом виде :) ...

Цитировать
Макс:
всегда устравиала

меня уже не устраивает... душа хочет шары.

Цитировать
Макс:
в системах регистрации

А такая фишка с запросом прокатит не только в запросе
SELECT *
FROM dbo.USERS
WHERE (UserName = \'$user\') AND (Password \'$somepass\')

Как только есть намек, что что-то из пользовательского ввода попадает в запрос, то можно начинать пробовать ломать (это не руководство к действию).
работа в Украине

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Как РВ помогают при работе с MsSQL
« Ответ #6 : 21 Сентября 2003, 11:25:12 »
Цитировать
душа хочет шары.

magic_quotes_sybase = On
magic_quotes_gpс = On

и все должно работать на автомате.
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Yukko

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1586
  • +0/-0
  • 0
    • Просмотр профиля
    • http://estrabota.com.ua
Как РВ помогают при работе с MsSQL
« Ответ #7 : 21 Сентября 2003, 13:38:32 »
все правильно :) и все будет работать на автомате... RESPECT!

Но мы сейчас съехали с темы в оффтопик касательно данного форума и часть треда пора переносить в РНР :) Мы рассматриваем РВ в отдельно от языков программирования, я делаю на РНР только проверку, как оно работает :)
[off]Приведенное РВ востребовано и уже используется у меня в компании программистами не на РНР... случаи использования разные бывают[/off]
работа в Украине

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28