首页 >数据库 >mysql教程 >如何在准备好的语句中安全地使用动态表和字段名称?

如何在准备好的语句中安全地使用动态表和字段名称?

Susan Sarandon
Susan Sarandon原创
2024-12-08 17:10:12556浏览

How Can I Safely Use Dynamic Table and Field Names in Prepared Statements?

使用准备好的语句绑定标识符和关键字

问题:

创建动态查询使用准备好的语句,但尝试绑定表名、字段名或语法关键字会导致一个空数组。

代码:

function search_db($db, $searchTerm, $searchBy, $searchTable){
    try{
        $stmt = $db->prepare('
            SELECT 
                * 
            FROM 
                ?
            WHERE 
                ? LIKE ?
        ');
        $stmt->bindParam(1, $searchTable);
        $stmt->bindParam(2, $searchBy);
        $stmt->bindValue(3, '%'. $searchTerm.'%');
        $stmt->execute();
    } catch(Exception $e) {
        return array();
    }
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

预期结果:
来自数据库的结果数组。

实际结果:
空数组。

原因:
准备好的语句只能绑定数据文字,不能绑定标识符(例如表或字段名称)或语法关键字。

解决方案:

要使用动态标识符或关键字,请按照以下步骤操作步骤:

  1. 格式标识符:

    • 将标识符括在反引号中:“identifier”。
    • 转义内的反引号通过将它们加倍来获得标识符: “标识符”。
  2. 白名单动态值:

    • 创建允许的标识符或关键字列表。
    • 使用前对照白名单检查动态值

修改代码:

$field = "`" . str_replace("`", "``", $field) . "`";
$table = "`" . str_replace("`", "``", $table) . "`";
$sql = "SELECT * FROM $table WHERE $field = ?";

关键字:

如果必要时,还可以将动态关键字列入白名单并验证动态关键字。通过遵循这些准则,您可以安全地在准备好的语句中包含动态标识符和关键字。

以上是如何在准备好的语句中安全地使用动态表和字段名称?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn