在 Perl 中引用的转义字符串



我正在编写一个快速的Perl脚本,它接受用户输入并将其用作MySQL正则表达式。我想确保我可以在没有任何鲍比表废话的情况下通过它。特别是,我想允许使用各种特殊字符,同时拒绝任何可能脱离引号本身的内容。

代码是这样的:

my $myRegex = join(' ', @ARGV);
# ...other code...
sendToSQL("select blah from foo where bar regexp '$myRegex'");

特别是,我需要像(...).这样的结构来保留 - 我不能将它们更改为\(...\)\.。感觉这很简单,它应该已经存在了——我试图不在这里重新发明轮子。

该脚本仅通过 SSH 接收来自受信任用户(三个用户之一,包括我自己)的输入,因此"原则上"我可以不加检查地传递字符串。但是,如果它捕获了诚实的错误,而不是无意中将部分命令泄漏到SQL并产生奇怪的结果,我会感觉好得多。(这本身不是安全问题有权访问脚本的用户已经可以直接运行mySQL。

编辑:建议的副本仅与我的问题略有相关,当然不是重复。我没有使用DBI,我关心的不是注入攻击 - 关注的是用户不会无意中引起数据库副作用,而不是敌对方在其上运行恶意代码。(为了使用该脚本,您需要已经可以直接访问MySQL,在这种情况下,您可以对数据库进行任意更改。

my $sth = $dbh->prepare("select blah from foo where bar regexp ".$dbh->quote($myRegex));
$sth->execute();

my $sth = $dbh->prepare("select blah from foo where bar regexp ?");
$sth->execute($myRegex);

请注意,正则表达式很昂贵,因此这仍然会对服务器产生不利影响。

如果不能选择使用带有绑定占位符的预准备语句,那么您当然需要"转义"SQL 文本中提供的潜在不安全值。

唯一需要转义的字符是反斜杠字符和用于将字符串括起来的引号字符。

您使用单引号将值括起来。 正则表达式中的反斜杠字符需要前面有另一个反斜杠字符。由于您使用单引号将字符串括起来,因此值中的任何单引号都需要在前面加上反斜杠字符。

您可以转义其他字符,例如双引号,但这在您的特定情况下并不是绝对必要的。但是转义双引号字符不会有什么坏处。

编写 sendToSQL 函数的人还应该提供一个相应的escapeForSQL函数作为 DBI "quote" 函数的包装器:

sendToSQL("select blah from foo where bar regexp '" . escapeForSQL($myRegex) . "'");

正确的方法是遵循有关 bobby-tables.com 的建议并在查询中使用占位符。

相关内容

  • 没有找到相关文章

最新更新