Mysqli查询自动转义


Mysqli query auto-escaping

我今天刚想到这个,真的很惊讶。为什么没有人在php中为mysql查询创建一个自动转义算法?这并不难,有什么好的理由让人们不这么做吗?

旁注:我知道有现成的陈述,但我的问题是,在某些情况下,你不想使用这样的陈述或不允许使用的东西。或者,即使在现成的陈述出现之前,我仍然没有见过这样的做法?

例如,将原始数据添加到查询方法中,然后在其中添加:,而不是在将其添加到查询之前对数据进行转义

public function query($query){
    preg_match_all('''(.+?)''',$query, $m); // just an example
    // perform escaping on matches and build the escaped $query
    parent::query($query);
}

他们做到了:http://www.php.net/magic_quotes

这个功能被证明是愚蠢的。它在PHP 5.3中被弃用,并从PHP 5.4中删除。请参阅该页面以了解删除原因的解释。

例如,与其在将数据添加到查询之前对其进行转义,不如将原始数据添加到该查询方法中,然后在其中…

如果引号出现在查询文本中,但不是作为字符串分隔符,则示例将失败。

SELECT * FROM movie_quotes WHERE text = 'I can''t stand him.';

对于某些字符集,addslashes()和正则表达式也会失败。转义函数必须具有字符集意识。这就是为什么在每个数据库API中都有一个特殊的函数。

只需使用查询参数没有理由不这样做。这比使用转义更容易。它和逃跑一样安全,如果不是更安全的话。

查询参数只能用于,如字符串文字、日期文字和数字文字。参数不能代替动态表名、列名、SQL表达式、关键字等。但转义也是如此。

对于其他情况,请使用白名单

如果您使用的是旧版本的mysql,其中没有现成的语句。。。

如果您仍在使用ext/mysql,它不支持查询参数,但它已被正式弃用,并将在未来的PHP版本中删除。如果您仍在使用ext/mysql生成代码,那么当这种情况发生时,您将无法升级。

因此,您应该切换到ext/mysqli或PDO。

  • Mysqli从2004年07月13日发布的PHP 5.0.0开始就可以使用了。

  • PDO从2005年11月24日发布的PHP 5.1.0开始就可以使用了。

如果您仍在使用比它旧的PHP版本,那么升级的时间已经过去了。自2007年12月31日以来,PHP4已经正式停止使用,甚至关键的错误修复也在2008年8月08日停止。

新版本的PHP通常比旧版本更快,还添加了新功能并修复了许多错误,包括关键安全错误。不要使用已有十年历史的PHP版本。

或者根本不使用mysql?

所有品牌的RDBMS都支持查询参数。

除了PDO驱动程序之外,许多品牌的RDBMS都有自己的PHP扩展,类似于mysqli扩展。例如,Oracle的oci8。这些扩展支持准备好的语句,例如oci8_parse()。

pdo为其他数据库模拟准备好的语句,但实际上并不能作为准备好的

这不是真的。PDO在许多驱动程序中支持真正准备好的语句。还有一些选项可以模拟prepare,因此您可以使用具有位置参数(?)和命名参数(:param)的每个驱动程序,即使RDBMS只支持一种或另一种样式。