Perl:在没有数据库连接的情况下转义 sql 字符串
Posted
技术标签:
【中文标题】Perl:在没有数据库连接的情况下转义 sql 字符串【英文标题】:Perl: escape sql strings without having a db connection 【发布时间】:2012-03-06 00:06:48 【问题描述】:我知道在 Perl 中清理 sql 字符串的正确方法是使用 use a prepared statement,但是,这个特殊的 Perl 脚本正在生成稍后在不同环境中执行的语句,而不是 Perl。它没有要连接的数据库。
如何安全地转义字符串以插入 mysql 查询。解决方案不必是可移植的。
【问题讨论】:
不要转义 SQL。使用占位符和参数绑定,即使您稍后执行。 只要确保你的所有字符串都不包含“Bobby tables”这个词 它们将在什么环境中执行? @BrianRoach 是对的。准备使用占位符并与绑定的参数一起存储以备后用。如果您以某种方式进行序列化以运送到其他系统,则绑定的参数列表将与查询的一部分一样保存。 【参考方案1】:您可以只检查添加到查询字符串中的变量中的特殊字符,这些字符是执行 SQL 注入所需的,例如“;”或括号并替换它们或将它们扔掉?!?
【讨论】:
好句子,但最后需要'and end on the daily wtf'。 也许你可以更准确一点 Konerak 有什么问题? 除非你真的知道你在做什么,或者有一组非常有限的允许字符,否则真的不建议你编写自己的 MySQL 转义函数。你会忘记一些事情,会有一个控制字符允许被攻击者绕过你的报价,你最终会进入上述网站。当这样不小心给出时,这是一个不好的建议。 (最后的?!?
也没有多大用处,但我尝试专注于内容,而不是形式)...
您可以检查要保留的可接受字符,而不是检查要丢弃的特殊字符。例如。 a-zA-Z0-9。当然,取决于数据。
白名单可以接受的情况并不常见,例如,非常有问题的引号字符 (') 是许多人名的一部分。【参考方案2】:
不幸的是,DBD::mysql 和一般的 MySQL 客户端库使用的引用函数需要一个活动的数据库句柄。根据文档,“这是必需的,因为转义取决于服务器使用的字符集”。
我可以想到一些 hacky 解决方案,但没有一个是真正令人满意的,所以让我们从文档中解决这个问题:
编码的字符有“\”、“'”、“"”、NUL (ASCII 0)、“\n”、“\r”和 Control+Z。严格来说,MySQL 只需要反斜杠和引号用于在查询中引用字符串的字符被转义。
这表明您可能可以通过引用函数来逃避
s/([\\"'])/\\$1/g;
或
s/([\\"'\0\n\r\cZ])/\\$1/g;
虽然我还是会保持警惕。
【讨论】:
以上是关于Perl:在没有数据库连接的情况下转义 sql 字符串的主要内容,如果未能解决你的问题,请参考以下文章
在没有 PreparedStatement 的情况下如何正确转义字符串?
带有 sql 连接字符串的 perl 脚本看似故障转移点(。)
如何在没有数据库连接的情况下从 dbplyr 生成 SQL?