感谢您提出有趣的问题。干得好:
它逃脱了危险人物,
您的概念完全 实际上“危险人物”是神话,没有神话。和MysqL_real_escape_string转义,但只是一个 字符串定界符 。从这个定义中,您可以得出它的局限性-仅适用于 string 。
但是,它仍然容易受到其他攻击的攻击,这些攻击可能包含安全字符,但可能有害于显示数据或在某些情况下恶意修改或删除数据。
至于显示数据,我认为它在与PDO有关的问题中是 ,因为
转义用户输入
^^^另一个需要注意的错觉!
。从前一个定义中可以了解到,您必须转义字符串,而不是“用户输入”。因此,再次:
明白了吗? 现在,我希望您了解转义的局限性以及“危险人物”的误解。
据我了解,使用PDO /预备语句更安全
因此,您可以看到转义仅涵盖一个问题。(但是,当然,如果将数字视为字符串(用引号引起来),则 在适用 时也可以使其安全)
而准备好的语句涵盖了-嗯-全部2个问题!很大;-)
对于其他两个问题,请参阅我的早期答案:在PHP中,在向数据库提交字符串时,我应该使用htmlspecialchars()还是使用正则表达式来处理非法字符?
现在,函数名称有所不同,因此我的MysqL_query,MysqL_fetch_array,MysqL_num_rows等不再起作用。
那是 另一种 一种自然灾害,一场灾难:
即使使用旧的MysqL驱动程序, 在其代码中 !必须将它们放在某种库函数中以供日常使用!(这并不是一个魔术,只是为了使代码更短,更少重复,防错,更一致和可读性更高)。
现在再次提出您的问题。
但是通过使用它们是否可以消除使用MysqL_real_escape_string之类的东西的需要?
是。
如果我没记错的话,你必须在PDO:PARAM_STR之后给出一个长度
您可以,但不必。
现在,这一切安全吗?
希望我对此事有所了解。
顺便说一句,对于长插入,您可以使用我有一天写的函数,使用PDO插入/更新帮助器函数
但是,我目前不使用准备好的语句,因为我喜欢使用自制的占位符,而不要使用上面提到 的库 。因此,要对付下面的riha发布的代码,该代码将短于这两行:
$sql = 'SELECT * FROM `users` WHERE `name`=?s AND `type`=?s AND `active`=?i';
$data = $db->getRow($sql,$_GET['name'],'admin',1);
但是,当然,您也可以使用准备好的语句使用相同的代码。
* (yes I am aware of the Schiflett's scaring tales)