Для работы с 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\')--А это значит, что все кто попытается сделать такую штуку, получат вполне верное сообщение об ошибке...
Продолжение следует... поставьте РВ себе на службу.