Как бороться с SQL-инъекцией в OrientDB с помощью nodejs?
Я использую библиотеку orientjs для выполнения операций в базе данных Orient. Я прочитал в документации, что можно использовать запросы в стиле параметров, как показано ниже:
db.query(
'SELECT name, ba FROM Player '
+ 'WHERE ba >= :ba AND team = ":team"',
{params: {
ba: targetBA,
team: targetTeam }
}, limit: 20
).then(function(hitters){
console.log(hitters)
});
У меня вопрос: достаточно ли этого для предотвращения внедрения SQL? Потому что я не нашел информацию об этом в API NodeJS. В случае с Java существует концепция "Подготовленный запрос", я не уверен, ссылаются ли они на одно и то же.
1 ответ
Кажется, это безопасно, я пытаюсь с этим кодом (ваш взят из вики немного глючит):
var name='admin';
db.open().then(function() {
return db.query(
"SELECT * FROM OUser "
+ "WHERE name = :name",
{params:{
name: name
}
});
}).then(function(res){
console.log(res);
db.close().then(function(){
console.log('closed');
});
});
Прежде всего, запрос разбирается как SELECT * FROM OUser WHERE name = "admin"
(наблюдается с помощью Studio Query Profiler).
Как и ожидалось, я получаю запись администратора.
Поскольку параметры оцениваются непосредственно как String, нет необходимости заключать их в кавычки (например, :name
не ':name'
). Таким образом, нет способа ввести что-то вроде ' OR '1'='1
или любой ; drop something;
Вот тест, который я сделал:
var name='; create class p;';
не возвращает никаких записей;
оценивается по ориентации как:
SELECT * FROM OUser WHERE name = "; create class p;"
var name="' OR '1'='1";
не возвращает никаких записей;
оценивается как:
SELECT * FROM OUser WHERE name = "' OR '1'='1"
var name='" OR "1"="1';
не возвращает никаких записей;
оценивается как:
SELECT * FROM OUser WHERE name = "\" OR \"1\"=\"1"
цитирование имени параметра в запросе:
"WHERE name = ':name'"
оценивается как:
SELECT * FROM OUser WHERE name = ':name'
Не стесняйтесь пробовать больше комбинаций, на мой взгляд, вполне безопасно.