【问题标题】:Using mysql_real_escape_string with PDO (no connection to localhost server)将 mysql_real_escape_string 与 PDO 一起使用(不连接到 localhost 服务器)
【发布时间】:2011-09-05 17:09:53
【问题描述】:

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

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

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

我能做什么?

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

【问题讨论】:

  • 你为什么不想使用准备好的语句?
  • 主要是懒惰。我习惯于将变量直接扔到 SQL 查询中(当然是在经过清理之后)。我意识到,准备它们不会那么难。

标签: php mysql security pdo mysql-real-escape-string


【解决方案1】:

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

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

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

一路使用PDO,别无选择。

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

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

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

【讨论】:

  • 感谢您的警告。我想我应该学会以“正确”的方式去做,没有 PDO::quote,只是把它吸起来,然后学会准备我的陈述。干杯,佩卡!
【解决方案2】:

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

我建议你使用 prepare 并让 PDO 完成这项肮脏的工作。

【讨论】:

    猜你喜欢
    • 2015-07-25
    • 2020-01-21
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多