所以我对准备好的陈述有几个问题。
第一个是,我的朋友告诉我他们比传统的“从*用户中选择sID ='$ id';”更加安全,数据库中输入的内容不同,并且知道它的值不是一个整体查询所以;'没有结束查询。
其次,如果您使用预准备语句,是否仍然必须转义值?
第三,准备好的陈述在绩效/可靠性方面有很大的不同吗?
答案 0 :(得分:2)
有必要转义查询以区分值和命令:
SELECT * FROM foo WHERE name = 'O'Connor'
解析器不容易理解“O'Connor”中的'
属于值,它会将其视为终止字符串。转义有助于解析器区分:
SELECT * FROM foo WHERE name = 'O\'Connor'
预备语句分两步发送到数据库:首先是命令,然后是值:
command: SELECT * FROM foo WHERE name = ?
value: O'Connor
这使解析器明确无误。因此,您不需要转义该值,因为您需要转义该值的唯一原因不再适用。这也是为什么它更安全,因为你永远无法逃脱价值,并为SQL注入祈祷。
至于速度,单个查询不应该有太大变化。如果您使用不同的值多次重复重复相同的准备好的查询,那么它将有助于提高性能,因为数据库不需要一次又一次地解析整个查询。
如果您想要更深入的介绍:The Great Escapism (Or: What You Need To Know To Work With Text Within Text)
答案 1 :(得分:0)
答案 2 :(得分:0)
答案 3 :(得分:0)
首先,是的,准备好的语句(如参数化语句)在处理参数时更加安全。
那是因为参数与查询本身分开。如果你想知道只传递一个查询有什么问题:
select * from tbl where name = '$username'
只需在网上搜索“Little Bobby Tables”:-)或“SQL注入”。
其次,您不必为了准备语句而逃避值,只是因为删除了SQL注入的危险(参见上一点)。
第三,一般不是。性能归结为针对数据库运行的查询,在常规SQL和预准备语句之间可能不会发生这么大的变化。
答案 4 :(得分:0)
准备好的语句是预编译的,因此查询的结构是安全的,不会被篡改。然后将参数绑定到语句并执行。如果您正在执行相同的查询 - 只是使用不同的参数 - 很多时候准备好的语句实际上是一个巨大的性能提升。如果您使用的是预准备语句,则无需转义值。简而言之,准备好的陈述很棒!