Php Mysql PDO 在创建 table 时防止 sql 注入

Php Mysql PDO prevent sql injection while creating table

我必须在 mysql 中动态创建 table。列名将在运行时从客户端提供。并且还说不要直接将用户输入添加到查询中。

create table test(dynamic_colname1 string, dynamic_colname2 int......)

那么语法是什么?

在 Whosebug Using PDO to CREATE TABLE 中提出了一个问题,但在该问题中,列是硬编码的,在我的例子中它们不是。

您不能安全地将用户输入(或任何其他不受信任的来源)直接连接到 SQL 查询中。这就是 SQL 注入漏洞的定义。

您也不能将查询参数用于列名或其他语法。

但您可以尝试filter 不受信任的输入使其成为受信任的。这是一个演示:

$data = [];
$data['table']='mytable';
$data['column']='user_name';
$data['datatype']='tinyint(1)';

$rules = [
  'table' => [
    'filter' => FILTER_SANITIZE_SPECIAL_CHARS,
    'flags' => FILTER_FLAG_STRIP_LOW|FILTER_FLAG_STRIP_HIGH|FILTER_FLAG_STRIP_BACKTICK
  ],
  'column' => [
    'filter' => FILTER_SANITIZE_SPECIAL_CHARS,
    'flags' => FILTER_FLAG_STRIP_LOW|FILTER_FLAG_STRIP_HIGH|FILTER_FLAG_STRIP_BACKTICK
  ],
  'datatype' => [
    'filter' => FILTER_VALIDATE_REGEXP,
    'options' => [
      'regexp' => '/^(?:tinyint(?:\([[:digit:]]+\))|smallint(?:\([[:digit:]]+\))|int(?:\([[:digit]]+\)))|bigint(?:\([[:digit:]]+\))$/'
    ]
  ]
];


$inputs = filter_var_array($data, $rules);

$table = $inputs['table'];
$column = $inputs['column'];
$datatype = $inputs['datatype'];

$sql = "CREATE TABLE `$table` ( `$column` $datatype )";

我将把它作为练习留给你,以这个例子为基础

  • 识别除了我放入数据类型正则表达式中的整数之外的其他数据类型。
  • 处理多列的多个用户输入。
  • 如果您需要它来读取 $_GET 以供用户输入,请使用 filter_input_array() 而不是 filter_var_array()