Насколько сильна эта функция для предотвращения внедрения SQL? - PullRequest
0 голосов
/ 31 октября 2018

Я сделал эту простую функцию в 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);
};

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

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

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

Предотвращение SQL-инъекций с использованием PHP

0 голосов
/ 31 октября 2018

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...