Насколько сильна эта функция для предотвращения sql-инъекций?

Я выполнил эту простую функцию в javascript, чтобы идентифицировать строки с SQL-инъекцией в их значение. Насколько он силен? Какие атаки sql нарушают его?

Спасибо за ваше время!

function hasSQL(value) {
    if (_.isNull(value) || _.isUndefined(value)) {
        return false;
    }

    // sql regex reference: http://www.symantec.com/connect/articles/detection-sql-injection-and-cross-site-scripting-attacks
    const sqlMeta = new RegExp('(\%27)|(\')|(\-\-)|(\%23)|(#)', 'i');
    // eslint-disable-next-line no-control-regex
    const sqlMeta2 = new RegExp('((\%3D)|(=))[^\n]*((\%27)|(\')|(\-\-)|(\%3B)|(;))', 'i');
    const sqlTypical = new RegExp('\w*((\%27)|(\'))((\%6F)|o|(\%4F))((\%72)|r|(\%52))', 'i');
    const sqlUnion = new RegExp('((\%27)|(\'))union', 'i');
    const mssqlExec = new RegExp('/exec(\s|\\+)+(s|x)p\w+', "i");
    const inlineOrBlock = new RegExp('.*;[\\t\\r\\n ]*(and )?[\\t\\r\\n ]*(select|insert|update|delete).*', "ig");

    return sqlMeta.test(value) || sqlMeta2.test(value) || sqlTypical.test(value) ||
        sqlUnion.test(value) || mssqlExec.test(value) || value.match(inlineOrBlock);
};

Я не компетентен ответить на исходный вопрос, но могу ли я спросить, почему вы хотите выполнить эту проверку (в js)?

pintxo 31.10.2018 12:43

Конечно, проверка выполняется на стороне сервера в node.js.

xflofoxx 31.10.2018 12:45

Ваш код не позволит мне вставить foo-- в вашу базу данных или #bobby-tables. Может быть, расскажите нам, какую ситуацию вы действительно хотите предотвратить и почему вы не используете заполнители SQL.

Corion 31.10.2018 12:47

Наше программное обеспечение использует проприетарный ORM, который не использует операторы sql, поэтому мне было интересно, может ли функция этого типа быть альтернативой, даже временной, модификации классов, которые строят sql ORM.

xflofoxx 31.10.2018 12:51

Разве ORM еще не выполняет собственное удаление значений?

Jarede 31.10.2018 15:52

Да, но не проверяет SQL-инъекции, поэтому строковые значения для полей текстового типа, таких как "testName" и password = ''; - // ", выполняются как" UPDATE users set name = 'testName' и password = ' '; - // "может быть опасно ...

xflofoxx 31.10.2018 16:38
6
6
423
2

Ответы 2

Я только бегло посмотрел на этот код. Я не изучал все условия досконально, но вижу по крайней мере одну проблему:

const sqlUnion = new RegExp('((\%27)|(\'))union', 'i');

Это не позволит поймать SQL-инъекцию, в которой есть один или несколько пробелов между ' и union.

Я не предполагаю, что исправление регулярных выражений сделает это безопасным. Я бы посоветовал подход к использованию регулярных выражений принципиально небезопасен. Слишком много крайних случаев, которые могут проскользнуть.

Трудно проверить все эти случаи, и просьба о бесплатном обзоре кода на Stack Overflow не является планом тестирования.

Есть известное решение, которое проще и безопаснее: Используйте параметры запроса.

Вы сказали, что используете ORM, который этого не позволяет. Я бы сказал, что ORM нужно исправить или отказаться от него. Неспособность обеспечить безопасность наиболее общепринятым способом делает ее несостоятельной.

Используйте подготовленные операторы и параметризованные запросы Хотя записи можно очистить с помощью таких методов, как mysqli_real_escape_string, более целесообразно использовать подготовленные или параметризованные предложения.

Пример приведен ниже

Предотвращение внедрения SQL с помощью PHP

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