我知道在 Perl 中清理 sql 字符串的正确方法是使用准备好的语句,但是,这个特殊的 Perl 脚本正在生成稍后在不同环境中执行的语句,而不是 Perl。它没有要连接的数据库。
如何安全地转义字符串以插入 MySQL 查询。该解决方案不必是可移植的。
不幸的是,DBD::mysql 和一般的 MySQL 客户端库使用的引用函数需要一个活动的数据库句柄。根据文档,“这是必需的,因为转义取决于服务器使用的字符集”。
我可以想到一些 hacky 解决方案,但没有一个是真正令人满意的,所以让我们从文档中解决这个问题:
编码的字符有“\”、“'”、“"”、NUL (ASCII 0)、“\n”、“\r”和 Control+Z。严格来说,MySQL 只需要反斜杠和引号字符引用查询中的字符串进行转义。
这表明您可能可以使用引用函数来逃避
s/([\\"'])/\\$1/g;
或者
s/([\\"'\0\n\r\cZ])/\\$1/g;
尽管我仍然会保持警惕。
您可以只检查添加到查询字符串中的变量中的特殊字符,这些字符是执行 SQL 注入所需的,例如“;” 或括号并替换它们或将它们扔掉?!?