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()
。
我必须在 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()
。