РНР+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 для юзеров.
Только что начал размышлять о безопасной реализации работы с базами данных различных типов и сразу пришел к выводу, что даже грамотные программисты могут допустить серьезные ошибки, т.е. оставить дырки, через которые даже не очень грамотные люди способны принести много вреда.
Наверняка человеку, который даже только начал изучать РНР и 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 для юзеров.