php mysql自动反转义_关于php:Mysqli查询自动转义

今天我只是在想这个,这真的让我感到惊讶。 为什么没有人为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);

}

"您不想使用这样的情况或某些不允许您这样做的情况"-请显示其中一些情况。

@Saturnix很好,例如,如果您使用的旧版本的mysql无法使用已准备好的语句,还是根本不使用mysql?

从5.1开始,可以使用@php_nub_qq PDO。如果您使用的是PHP <5.1,则可能有许多其他大问题,而不必手动进行mysql_real_escape_string

@mike使用PDO有什么不同?我只是问一个直截了当的问题

您可以将结果集直接注入到对象中。恕我直言,那是PDO在mysql和mysqli上最强大(如果不是最强大)的功能之一

@php_nub_qq我的观点是PDO支持准备好的语句。 (对不起,我错过了您提到mysqli的事实),但是mysqli早于PDO被添加到PHP中,因此在过去几年中,基本上没有理由不使用任何准备好的语句。

@mike只有mysql支持预备语句,pdo模拟其他数据库的预备语句,但实际上不能用作预备语句

@php_nub_qq PDO像mysqli一样支持准备好的语句。如果您谈论的是PDO :: ATTR_EMULATE_PREPARES,则仅在服务器不支持预准备语句时才在客户端模拟预准备语句。

简而言之,答案很简单:转义还不足以实现正确的格式。在准备好的语句中,即使是模拟的语句也可以完成格式化。正确的位置。这就是为什么无论"自动"还是"手动"逃避都可以视为安全的原因。虽然准备好的声明可以

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

事实证明这个功能是愚蠢的。它已在PHP 5.3中弃用,并已从PHP 5.4中删除。有关为何将其删除的说明,请参见该页面。

For example, instead of escaping data before adding it to the query, add raw data to the query method and then inside it...

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

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

在某些情况下,对于某些字符集,addslashes()和正则表达式也会失败。转义功能必须识别字符集。这就是每个数据库API中都有一个特殊功能的原因。

只需使用查询参数。没有理由不这样做。这比使用转义容易。它与逃逸一样安全,甚至更安全。

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

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

...if you're using an older version of mysql where prepared statements are not available...

如果您仍在使用ext / mysql,则它不支持查询参数,但已正式弃用,并将在以后的PHP版本中将其删除。如果仍在使用ext / mysql生成代码,则在这种情况下将无法升级。

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

自2004年5月13日发布PHP 5.0.0起,即可使用Mysqli。

自2005年11月24日发布PHP 5.1.0起,PDO就已经可用。

如果您仍在使用比该版本更早的PHP版本,则升级已经过去了。自2007年12月31日起,PHP 4的生命周期正式终止,甚至一些重要的错误修复程序也于2008年8月8日停止。

新版本的PHP通常比旧版本更快,并且添加了新功能并修复了许多错误-包括严重的安全错误。不要使用十年的PHP版本。

or not using mysql at all?

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

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

pdo simulates prepared statements for other databases but doesn't really work as a prepared statement

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

顺便说一句,有时我也赞成:)

@YourCommonSense,谢谢。 我也多次评价您的好答案。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值