所以我相当偏执,并使用PDO的mysql_real_escape_string().我实际上不在PDO中使用预处理语句,所以我必须清理输入.
在我自己的服务器上托管时,我会在本地机器上创建一个非特权用户,这样MysqL_real_escape_string()就不会失败并清空我的变量(嘿,现在已经消毒了!).我意识到这是一个非常失败的解决方案,因为如果数据库没有匹配的字符集,那么根本没有消毒点,但它适用于临时.
现在在我的新主机上,我无法为数据库创建一个unpassworded,nonrivileged用户…并且MysqL_real_escape_string()失败,因为本地计算机上没有MysqL服务器.我无法编辑PHP.ini来设置默认数据库的hostname / user / pass.
我能做什么?
在我写这篇文章时头脑风暴,我想知道PHP是否允许运行时更改配置…也许…… hrm.
编辑:嗯…… ini_set()? :o
解决方法:
MysqL_real_escape_string()需要一个现有的,经典的MysqL_connect()数据库连接(它可以从中获取字符集信息)是完全安全的. PDO连接将是独立的,可能具有不同的字符集设置,最终导致less security:
A MysqL connection is required before using MysqL_real_escape_string() otherwise an error of level E_WARNING is generated, and FALSE is returned. If link_identifier isn’t defined, the last MysqL connection is used.
一直使用PDO,别无选择.
如果您不想使用预准备语句,PDO::quote
应该是正确的函数:
Returns a quoted string that is theoretically safe to pass into an sql statement.
但请注意,即使该函数的手册页也建议使用预准备语句.