Инъекции бывают не только sql
. На поле NoSQL
тоже требуется гигиена. В частности, на поле XPath.
Допустим, данные о пользователях располагаются как-то так:
<?xml version="1.0" encoding="utf-8"?> <users> <user id="1"> <username>user</username> <password>pass</password> <type>admin</type> ... </user> ... </users>
Тут plaintext password лишь для простоты, на самом деле там, разумеется, хэши. Обращение к юзеру через форму приводит к запросу:
FindUserXPath = "//User[UserName/text()='" & Request("Username") & "' and Password/text()='" & Request("Password") & "']"
Атака
Если посетитель заполнил поля формы как-то так:
Username: blah' or 1=1 or 'a'='a Password: blah
То запрос становится таким:
//User[(UserName/text()='blah' or 1=1) or ('a'='a' and Password/text()='blah')]
Всё, первая часть условия истинна, юзер с правами admin
схвачен, атака успешна. Это уязвимость к XPath Injection.
Защита от XPath Injection
Рекомендации вполне обычные — параметризация и динамическое формирование запроса, эскейпинг и санация вводимых пользователем данных. Если бы в приведённом запросе было '
вместо апострофов, инъекции бы не случилось.