0 レビュー
1 回答
PHP Mysql PDOは、テーブルの作成中にSQLインジェクションを防止します
mysqlで動的にテーブルを作成する必要があります。列名は実行時にクライアントから提供されます。また、ユーザー入力をクエリに直接追加しないとも言われています。
create table test(dynamic_colname1 string, dynamic_colname2 int......)
では、構文はどうなりますか?
stackoverflow Using PDO to CREATE TABLE で質問がありますが、その質問の列はハードコーディングされていますが、私の場合はそうではありません。
わからない
0
レビュー
答え :
解決策:
ユーザー入力(またはその他の信頼できないソース)をSQLクエリに直接安全に連結することはできません。これがSQLインジェクションの脆弱性の定義です。
列名やその他の構文にクエリパラメータを使用することもできません。
ただし、信頼できない入力をフィルタリングして信頼できるようにすることはできます。これがデモです:
$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_var_array()
の代わりにfilter_input_array()
を使用してください>ユーザー入力用。
わからない
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。