gpt4 book ai didi

PHP PDO : Protect dynamic identifiers against SQL injection

转载 作者:行者123 更新时间:2023-11-30 23:46:06 26 4
gpt4 key购买 nike

目前我正在研究一个简单工具的概念,以执行一些用 PHP 编写的“维护”数据库操作(删除/截断/复制表等)。

这必然要求 SQL 语句中的标识符是动态用户输入。虽然准备好的语句非常适合将 SQL 语句与用户输入的任何比较值分开,但它们并不意味着用于表名或列名等标识符。 (这意味着,我 can't use 准备语句来准备标识符。)

保护动态标识符的一种常见方法是白名单,但这需要静态和已知的数据库结构。例如,我想执行一个命令,如 Copy table A and name it B。这里有趣的部分是 B

假设用户已通过身份验证并被允许执行此操作,我该如何保护它免受 SQL 注入(inject)攻击?这可能吗?

我找到了 an approach这建议在任何标识符中简单地引用重音符 (`),如下所示:

$table_name        = 'origin_table'; // can be checked against existing tables
$copy_table_name = 'user_input';
$quoted_table_name = '`' . str_replace( '`', '``', $copy_table_name ) . '`';
$sql_statement = "CREATE TABLE {$quoted_table_name} LIKE {$table_name}";

这是否足以防止可能的 SQL 注入(inject)?

更新

PDO::quote()(在答案中提到)不是一个选项。它不会转义重音符 (`):

$user_input = 'table`; TRUNCATE TABLE users --';
var_dump( $pdo->quote( $user_input ) );
//string(33) "'table`; TRUNCATE TABLE users --'"

更新 2PostgreSQL 扩展有一个函数正是为了这个目的:https://secure.php.net/manual/en/function.pg-escape-identifier.php

最佳答案

你总是想转义 ` 标识符,甚至是表名和字段名,因为明天它们可能会成为保留字并破坏你的查询。只要您使用准备好的语句(PDO、mysqli 或其他)就可以了。请注意,PDO 不允许转义表名或字段名。

你只需要细化你的过滤机制,比如什么表名等等是允许的还是不允许的。

顺便说一句:不要像你想做的那样去做:“CREATE TABLE {$quoted_table_name} LIKE {$table_name}”;.. 用户准备的带有占位符的语句(?,或 :name 等)

编辑:由于您需要保护标识符,我看到了 2 种方法:

  1. 用 (`) 将它们包围起来
  2. 过滤和转义传入值(mysql_real_escape_string 或更好)。过滤将包括去除任何不必要的字符(您可能希望只允许字母 [a-z]+ 或带数字的字母。

关于PHP PDO : Protect dynamic identifiers against SQL injection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35770942/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com