Комментарии

Защита от злоумышленников в CMS Joomla
( 0 Голосов )

Пользуясь классом JDatabaseQuery для составления запросов, не следует забывать и о защите от внесения злоумышленниками злонамеренного кода. Так, если значение, применяемое в операторе WHERE или ORDER BY, происходит из ненадежного источника, например, HTML-формы или URL (злоумышленники могут воспользоваться и тем и другим для внесения злонамеренного кода), это значение следует подвергнуть дополнительной обработке, прежде чем использовать его в запросе. И если значение в операторе WHERE должно быть целым, его следует непременно привести к целому с помощью оператора (int). В приведенном ниже примере заранее известно, что значение переменной $catid должно быть целым, и для этого принимаются специальные меры.

$query->where('a.catid = ' . (int)   $catid);

Если же значение является текстом, для заключения его в кавычки и "экранирования" любых специальных символов следует воспользоваться методом quote () из класса JDatabase. Экранирование текста означает проверку в нем наличия символов, имеющих специальное значение в конкретном языке программирования (в данном случае SQL). Когда значение экранируется, любые специальные символы отображаются таким образом, что они теряют свое специальное значение в данном языке программирования. Например, в SQL для этой цели служит обратная косая черта (\), помещаемая перед символами одиночных или двойных кавычек. Это дает возможность отобразить сами кавычки, но в то же время уведомить базу данных не интерпретировать их как специальный символ. Экранирование текстовых значений не дает злоумышленнику возможность воспользоваться кавычками или другими специальными символами с целью исказить смысл запроса и внести в него свой собственный запрос SQL. Как было показано в предыдущих главах, экранировать текст можно и по отношению к языку HTML или JavaScript.

Допустим, в операторе WHERE используется переменная $created_by, которая происходит из ненадежного источника. В таком случае в коде можно принять следующие меры защиты:

$query->where('a.created_by_alias  = ' . $db->quote($created_by));

Если злоумышленник попытается ввести злонамеренный код в переменной $created_ by, он будет обезврежен в методе quote (), обезопасив тем самым запрос. А если переменная используется в операторе WHERE вместе с метасимволом, необходимо принять меры к тому, чтобы правильно расположить кавычки. Допустим, в запрос требуется ввести следующий оператор WHERE:

WHERE a.title LIKE '%abc%'

где значение 'abc1 берется из введенной пользователем переменной $ search. В таком случае знаки процентов следует передать в качестве аргумента методу quote (), как показано ниже.

$query->where('a.title  LIKE ' . $db->quote('%' . $search . '%'));

Таким образом, кавычки отделяются от знаков процентов, а значение переменной $search все равно экранируется.

В тех случаях, когда ненадежные данные передаются оператору ORDER BY, необходимо убедиться в том, что передаваемые значения являются действительными именами столбцов. В противном случае в коде запроса SQL возникнет ошибка, способная раскрыть информацию о веб-сайте потенциальным злоумышленникам. Один из способов борьбы с подобными нарушениями защиты обсуждался в главе 10 и состоит в том, чтобы создать сначала массив действительных имен столбцов, а затем проверить введенные данные по этому списку имен.


Понравился материал? Пригодилась информация? Плюсани в социалки!


 
Похожие новости
Добавить комментарий


Защитный код