这个查询注入证明吗?

发布于 2024-09-14 06:25:44 字数 204 浏览 7 评论 0原文

我正在使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

荭秂 2024-09-21 06:25:44

是的。强制转换为 int 可防止所有令人讨厌的 SQL 注入可能性。

如果变量是字符串,则应使用 准备好的语句 来传递它。

$sql = 'SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour';
$sth = $dbh->prepare($sql);
$sth->execute(array(':calories' => 150, ':colour' => 'red'));
$red = $sth->fetchAll();

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.

$sql = 'SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour';
$sth = $dbh->prepare($sql);
$sth->execute(array(':calories' => 150, ':colour' => 'red'));
$red = $sth->fetchAll();
琴流音 2024-09-21 06:25:44

由于您已经在使用 PDO,更好的方法是使用:

这要好得多:

$dbh->prepare("SELECT * FROM recipes WHERE id = ?");
$dbh->bindParam(1, (int) $id);
// more code.....

Since you are already using PDO, a better approach will be to use:

This is much better:

$dbh->prepare("SELECT * FROM recipes WHERE id = ?");
$dbh->bindParam(1, (int) $id);
// more code.....
已下线请稍等 2024-09-21 06:25:44

您必须在查询中转义表名和字段名:

$dbh->query("SELECT * FROM `recipes` WHERE `id=`'".(int)$id."'");

You must escape table and field names in query:

$dbh->query("SELECT * FROM `recipes` WHERE `id=`'".(int)$id."'");
扎心 2024-09-21 06:25:44

由于您专门将 $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 at PDO::quote.

老旧海报 2024-09-21 06:25:44

是的,如果参数预期为整数,则绑定到整数足以防止 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.

临走之时 2024-09-21 06:25:44

但要小心,在 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文