这个查询注入证明吗?
我正在使用 PDO 与我的数据库对话,我想知道转换这样的类型
$dbh->query("SELECT * FROM recipes WHERE id=".(int)$id);
是否足以防止 sql 注入?在这种情况下 $id 始终是整数。
我还想知道如果变量是字符串,什么是防止在此类语句中注入的好方法。
I am using PDO to talk to my database, and I wonder if casting a type like this
$dbh->query("SELECT * FROM recipes WHERE id=".(int)$id);
is sufficient to prevent sql injection? In this case $id is always an integer.
I also wonder what would be a good way to prevent an injection in this kind of statement if the variable was a string.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
是的。强制转换为 int 可防止所有令人讨厌的 SQL 注入可能性。
如果变量是字符串,则应使用 准备好的语句 来传递它。
Yes. Casting to int prevents all the nasty SQL injection possibilities.
If the variable were a string, you should use prepared statements to pass it.
由于您已经在使用 PDO,更好的方法是使用:
这要好得多:
Since you are already using PDO, a better approach will be to use:
This is much better:
您必须在查询中转义表名和字段名:
You must escape table and field names in query:
由于您专门将
$id
转换为整数,因此它是安全的。对于字符串(或任何其他数据类型),您需要在执行查询之前对其进行转义;看看PDO::quote
。Since you specifically cast
$id
to an integer, it is safe. For a string (or any other data type) you need to escape it before executing the query; have a look atPDO::quote
.是的,如果参数预期为整数,则绑定到整数足以防止 SQL 注入。
您还可以使用自动 SQL 注入工具来检测它。
Yes, bind to a integer is enough to prevent SQL Injection if the parameter is expected as a integer.
You can also use an Automatic SQL Injection Tool to detect it.
但要小心,在 PHP 中
(int)
会将 NULL 转换为 0。因此,如果您的应用程序中与 ID 0 存在显着关联,则可能会无意中触发该值。
Careful though, in PHP
(int)
will convert NULL to 0.Therefore, If you had an significant association with the ID of 0 in your application, this could trigger that value unintentionally.