我正在编写一个快速的 Perl 脚本,它接受用户输入并将其用作 MySQL 正则表达式。我想确保我可以在没有任何 Bobby tables 的情况下通过它废话。特别是,我想允许各种特殊字符,同时拒绝任何可能超出引号本身的内容。
代码是这样的:
my $myRegex = join(' ', @ARGV);
# ...other code...
sendToSQL("select blah from foo where bar regexp '$myRegex'");
特别是,我需要保留 \(...\)
和 \.
之类的结构——我无法将它们更改为 \\\(...\\\)
和 \\.
。感觉这很简单,它应该已经存在了——我不想在这里重新发明轮子。
该脚本仅通过 SSH 接收来自受信任用户(三个用户之一,包括我自己)的输入,因此“原则上”我可以不加检查地传递字符串。但是,如果它发现了诚实的错误,而不是无意中将部分命令泄露给 SQL 而导致奇怪的结果,我会感觉好多了。 (这不是安全问题本身:有权访问该脚本的用户已经可以直接运行 mySQL。)
编辑:提议的副本与我的问题仅略有相关,当然不是它的副本。我没有使用 DBI,我担心的不是注入(inject)攻击——我担心的是用户不会无意中造成数据库副作用,而不是敌对方在其上运行恶意代码。 (为了使用脚本,您需要已经可以直接访问 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);
请注意,正则表达式的开销很大,因此这仍然会对服务器产生不利影响。
关于mysql - 转义要在 Perl 中引用的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35072829/