mysql - 转义要在 Perl 中引用的字符串

标签 mysql regex perl escaping taint

我正在编写一个快速的 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/

相关文章:

mysql - 错误 1129 : Host '' blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'

mysql - 对于 GPS 坐标,我应该在数据库中存储多少位有效数字?

java - 在Java中从结构化原始文件创建json文件的最简单方法?

python - 按行分块大字符串的最佳方法

perl - 如何在Perl中捕获完整的命令行?

java - 我如何在 intelliJ Idea 中连接 mysql 服务器

php - 连接和搜索具有一对多关系的多个 MySQL 表

java - Java 中点分隔字符串的模式匹配

perl - 如何将 Perl 拆分命令与空白修剪结合起来?

mysql - 500 内部服务器错误 perl/数据库