РНР+MSSQL ? Безопасность : 0,1

antonio

Moderator
Команда форума
РНР+MSSQL ? Безопасность : 0,1

Только что начал размышлять о безопасной реализации работы с базами данных различных типов и сразу пришел к выводу, что даже грамотные программисты могут допустить серьезные ошибки, т.е. оставить дырки, через которые даже не очень грамотные люди способны принести много вреда.
Наверняка человеку, который даже только начал изучать РНР и MySql знаком принцип построения query по параметрам из get, например получаем через get id=7 и делаем безобидный селект

$result=mysql_query("select * from mytable where id=$id",$dbconnection);

для MySql обидного ниче нет, но вот если не контролировать пришедшее значение id, то для MsSql можно понастроить даже на базе такого безобидного запроса много всяких бяк! Дело в том, что через query для mssql можно выполнять сразу несколько операторов вплоть до transact sql языка

Всем известно, что через get большинство спец символов не проходят в явном виде, для их передачи надо пользоваться rawurlencode, а теперь перепишем наш оператор и обратимся к mssql и добавим даже order by, казалось бы в этом случае, даже если не контролировать $id - самое страшное, что случиться - это пустой резалт и ругань РНР по поводу выполнения квери, если таковая еще отслеживается.

$result=mssql_query("select * from mytable where id=$id order by id asc",$dbconnection);

Но! В MSSQL есть возможность задания комментария от начала и до конца строки, который выглядит так --

теперь, давайте передадим $id гетом таким образом

http://www.mysite.ru/showlist.php?id=8 create table test(t int) --
%0D%0A - это \r\n
%20 - это пробел
%28 - это (
%29 - это )
Все дело в том, что концом оператора в transact sql для mssql считается перевод строки, таким образом, наша безобидная кверя вдруг превратиласьпосле всех подстановок уже в весьма обидную:

select * from mytable where id=8
create table test(t int)
--order by id asc

(Наш ордер бай превратился в комментарий, че тока не бывает!)

которая и выполнится, как показала практика люди считают, что раз sql сервер с веба не виден, значит не надо заботиться о серьезной настройке прав для пользователя, который используется РНР для доступа к серверу, и подобные квери срабатывают.

Понятно, что можно сотворить и более неприятные пакости, так что думайте, латайте дыры, стройте permissions для юзеров.
 

si

Administrator
$id = (int) $id; и вся проблемма :)

А еще полезно проверять все, что приходит от usera на допустимость значений.
 

lexa1111

Guest
в случае с int просто - это известный прикол.
а если запрос вот такой
$result=mssql_query("select * from mytable where name=%like(myname)% order by name",$dbconnection);
то есть myname стринг... как тоды быть ...я понимаю надо парсить но как ?
Могет у когонить есть пример?
 

lexa1111

Guest
Понятно что парсить то...
Но какие символы являются опасными???
Может ктонить поделится своей процедуркой для такого рода вещей..
 
Сверху