2

所以我相当偏执并使用mysql_real_escape_string()PDO。我实际上不在 PDO 中使用准备好的语句,所以我必须清理输入。

在我自己的服务器上托管时,我会在本地机器上创建一个非特权用户,这样mysql_real_escape_string()就不会失败并清空我的变量(嘿,现在清理!)。我意识到这是一个非常失败的解决方案,因为如果数据库没有匹配的字符集,那么根本没有必要进行消毒,但它在过渡期间有效。

现在在我的新主机上,我无法为数据库创建一个无密码、无特权的用户......并且mysql_real_escape_string()由于本地计算机上没有 mysql 服务器而失败。我无法编辑 php.ini 来设置默认数据库的主机名/用户/密码。

我能做些什么?

在我写这篇文章时进行头脑风暴,我想知道 php 是否允许运行时更改配置......也许...... hrm。 编辑:嗯... ini_set()?:O

4

2 回答 2

16

像这样混合两个数据库库是一个坏主意,并且可能不安全。

mysql_real_escape_string()需要一个现有的经典mysql_connect()数据库连接(它可以从中获取字符集信息)才能完全安全。PDO 连接将是独立的,可能具有不同的字符集设置,最终导致安全性降低

在使用 mysql_real_escape_string() 之前需要 MySQL 连接,否则会生成 E_WARNING 级别的错误,并返回 FALSE。如果未定义 link_identifier,则使用最后一个 MySQL 连接。

一路使用PDO,别无选择。

如果你不想使用准备好的语句,PDO::quote应该是正确的函数:

返回理论上可以安全地传递给 SQL 语句的带引号的字符串。

但是请注意,即使该函数的手册页也建议使用准备好的语句。

于 2011-05-31T18:26:24.753 回答
7

使用 PDO 的用处是不用担心逃逸的东西。

我建议您使用准备并让 PDO 完成这项肮脏的工作。

于 2011-05-31T18:24:54.933 回答