Как бороться с 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'


Не стесняйтесь пробовать больше комбинаций, на мой взгляд, вполне безопасно.

Другие вопросы по тегам