【问题标题】:MySQL - ORM Idiorm - Prevent SQL injectionsMySQL - ORM Idiorm - 防止 SQL 注入
【发布时间】:2026-02-02 04:50:01
【问题描述】:

我使用 PHP 并使用名为 Idiorm 的 ORM 进行 SQL 调用。

请求可能如下所示:

$person = ORM::for_table('person')->create();
$person->name = $_POST['name'];
$person->age = $_POST['age'];
$person->save();

它工作得很好,但它可能对 SQL 注入不安全?解决此问题的正确/最佳方法是什么?例子?

【问题讨论】:

    标签: php mysql orm sql-injection idiorm


    【解决方案1】:

    来自他们的readme

    特点

    • 建立在 PDO 之上。
    • 始终使用准备好的语句来防止 SQL 注入攻击。

    但是,对于表名it says

    请注意,此方法 *不会转义其查询参数,因此 表名不应直接从用户输入传递。*

    限制、排序和分组也是如此,所以对于那些你需要考虑替代方法的人(例如只让 ascii-7 字符通过)。如果你需要这样做,限制只是整数,所以你可以做ctype_digit检查。对于排序和分组,您可以检查字母数字,假设您的列名中没有其他任何内容。这可以通过ctype_alnum 完成。

    但是你在那里的查询应该没问题,因为它没有那些。

    当然,你不应该只是相信它——测试它。

    【讨论】:

    • 我投了 1 票。如果我需要保护限制、排序和分组,如何以一种好的方式完成?用于 SQL 注入的正则表达式或一些 PHP 函数?
    • @JensTörnell 已添加到答案中
    【解决方案2】:

    我查看了源代码here

    line 1284(save() 方法的一部分)上,它似乎正在准备语句。

    所以在我看来,假设它已经在处理 sql 注入似乎是安全的。

    【讨论】: