在PDO::Prepare page它说,
“并通过消除手动引用参数的需要来帮助防止SQL注入攻击”
知道这一点,有没有像mysql_real_escape_string()这样的PHP函数来处理PDO的转义?或者PDO是否会为我解决所有问题?
EDIT
我现在意识到我问了一个错误的问题 . 我的问题确实是,“PDO为我做了什么?”我现在用这些答案意识到它实际上只是消除了逃避引号的需要 . 但我仍然需要对传递给execute函数的值执行任何其他PHP清理调用 . 比如htmlentities(),strip_tags()等...
PDO不会逃避变量 . 变量和SQL命令通过MySQL连接独立传输 . 和 SQL tokenizer (parser) never looks at the values . 值只是逐字复制到数据库存储中,不会造成任何伤害 . 这就是为什么不需要用准备好的语句来编组数据的原因 .
请注意,这主要是速度优势 . 使用mysql_real_escape_string(),您首先在PHP中编组变量,然后将低效的SQL命令发送到服务器,这需要将实际的SQL命令与值再次隔离开来 . 这就是为什么人们经常说安全优势只是隐含的,而不是使用PDO的主要原因 .
如果你连接SQL命令并且实际上没有使用准备好的语句(不好!),那么是的,PDO仍然有一个转义函数:$pdo->quote($string)
这里很少有人了解逃生是什么以及何时使用它 .转义本身不会产生任何数据"safe" . 它只是逃避分隔符,区分分隔符和数据的一部分 . field = 'it's me' 将导致错误,而 field = 'it\'s me' 则不会 . 逃避变得毫无用处 .
field = 'it's me'
field = 'it\'s me'
你是否使用占位符引用?不,因此,没有逃避是明智的 .
当您使用绑定时,它的工作方式非常不同 .它不会将整个查询发送到服务器,而是将准备好的查询与绑定数据分开发送 . 所以它不能干涉 . 因此无法注射 .
是和否:
嵌入到语句字符串中的文字需要像往常一样进行转义 .
绑定到预准备语句的值由库处理 .
如果准备语句并使用bindParam或bindValue来提供变量,则无需转义变量 . 请注意,这些函数假定变量包含字符串,因此如果要使用布尔值或浮点数,请使用第三个参数bindValue .
你不必担心它 . 在将数据传递到数据库之前,PDO不要求您转义数据 .
Edit: 为了清楚起见,我的意思是说,只要你将变量传递给你的参数(例如,表格字段的值),你就不需要传递变量,因为其中一个变量很有意义 . PDO的主要优点是你多次(如果有的话)你要传递你自己定义的字符串 .
此外,请确保您仍然清理您的数据类型 . 例如,如果您预期的话,请确保它小于或大于x,等等 .
5 回答
PDO不会逃避变量 . 变量和SQL命令通过MySQL连接独立传输 . 和 SQL tokenizer (parser) never looks at the values . 值只是逐字复制到数据库存储中,不会造成任何伤害 . 这就是为什么不需要用准备好的语句来编组数据的原因 .
请注意,这主要是速度优势 . 使用mysql_real_escape_string(),您首先在PHP中编组变量,然后将低效的SQL命令发送到服务器,这需要将实际的SQL命令与值再次隔离开来 . 这就是为什么人们经常说安全优势只是隐含的,而不是使用PDO的主要原因 .
如果你连接SQL命令并且实际上没有使用准备好的语句(不好!),那么是的,PDO仍然有一个转义函数:$pdo->quote($string)
这里很少有人了解逃生是什么以及何时使用它 .
转义本身不会产生任何数据"safe" . 它只是逃避分隔符,区分分隔符和数据的一部分 .
field = 'it's me'
将导致错误,而field = 'it\'s me'
则不会 . 逃避变得毫无用处 .你是否使用占位符引用?不,因此,没有逃避是明智的 .
当您使用绑定时,它的工作方式非常不同 .
它不会将整个查询发送到服务器,而是将准备好的查询与绑定数据分开发送 . 所以它不能干涉 . 因此无法注射 .
是和否:
嵌入到语句字符串中的文字需要像往常一样进行转义 .
绑定到预准备语句的值由库处理 .
如果准备语句并使用bindParam或bindValue来提供变量,则无需转义变量 . 请注意,这些函数假定变量包含字符串,因此如果要使用布尔值或浮点数,请使用第三个参数bindValue .
你不必担心它 . 在将数据传递到数据库之前,PDO不要求您转义数据 .
Edit: 为了清楚起见,我的意思是说,只要你将变量传递给你的参数(例如,表格字段的值),你就不需要传递变量,因为其中一个变量很有意义 . PDO的主要优点是你多次(如果有的话)你要传递你自己定义的字符串 .
此外,请确保您仍然清理您的数据类型 . 例如,如果您预期的话,请确保它小于或大于x,等等 .