Perl: экранирование строк SQL без подключения к базе данных - PullRequest
3 голосов
/ 14 февраля 2012

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

Как можно безопасно экранировать строку для вставки в запрос MySQL.Решение не должно быть портативным.

Ответы [ 2 ]

2 голосов
/ 14 февраля 2012

К сожалению, функция цитирования, используемая DBD :: mysql и клиентской библиотекой MySQL в целом, требует активного дескриптора базы данных .Согласно документации, «это необходимо, потому что экранирование зависит от набора символов, используемого сервером».

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

Кодируются следующие символы: «\», «'», «» », NUL (ASCII 0),« \ n »,« \ r »и Control + ZСтрого говоря, MySQL требует только экранирования от обратной косой черты и символа кавычек, используемых для цитирования строки в запросе.

Это говорит о том, что вы, вероятно, можете избежать использования функции цитирования, которая выполняет либо

s/([\\"'])/\\$1/g;

или

s/([\\"'\0\n\r\cZ])/\\$1/g;

хотя я все равно был бы настороже.

0 голосов
/ 14 февраля 2012

Вы можете просто проверить наличие специальных символов в переменных, которые вы добавляете в строку запроса, которые необходимы для выполнения SQL-инъекций, таких как ";"или скобки и заменить их или выбросить?!?

...