将 mysql_real_escape_string 与 PDO 一起使用(不连接到 localhost 服务器)
Posted
技术标签:
【中文标题】将 mysql_real_escape_string 与 PDO 一起使用(不连接到 localhost 服务器)【英文标题】:Using mysql_real_escape_string with PDO (no connection to localhost server) 【发布时间】: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 查询中(当然是在经过清理之后)。我意识到,准备它们不会那么难。 【参考方案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 完成这项肮脏的工作。
【讨论】:
以上是关于将 mysql_real_escape_string 与 PDO 一起使用(不连接到 localhost 服务器)的主要内容,如果未能解决你的问题,请参考以下文章