環境は
PHP version: 7.1.12
MySQL version: 5.7.20
となっております。
sql
1$arrParams=[1,"atype"]; 2$sql='SELECT id, type, category FROM test WHERE id = ? AND category = ?'; 3$stmt=$dbh->prepare($sql); 4$stmt->execute($arrParams); 5
といったものでWHERE部分をバインドしSQLインジェクションを防ぐ対策をすると学びました。
その際
テーブル名やSELECTを指定する部分がもし動的に変化する場合どのような対策を行なうものなのでしょうか?
例1
sql
1$arrParams=[1,"atype"]; 2$selectarray=["id","type","category"]; 3$selectArrayAll=implode(",", $selectarray); 4$sql = 'SELECT '; 5$sql .= $selectArrayAll 6$sql .= FROM test WHERE id = ? AND category = ?'; 7$stmt=$dbh->prepare($sql); 8$stmt->bindValue(1, $category_0, PDO::PARAM_INT); 9$stmt->execute($arrParams);
セレクトの部分が外部より決定する場合
例2
sql
1$arrParams= [1,"atype"]; 2$table = "test"; 3$sql = 'SELECT id, type, category FROM $table WHERE id = ? AND category = ?'; 4$stmt = $dbh->prepare($sql); 5$stmt->bindValue(1, $category_0, PDO::PARAM_INT); 6$stmt->execute($arrParams);
テーブル名が変更になる可能性がある場合
例3
sql
1$selectarray=["id","type","category"]; 2$selectArrayAll=implode(",", $selectarray); 3$table = "test"; 4$sql = 'SELECT '; 5$sql .= $selectArrayAll 6$sql .= FROM $table WHERE id = ? AND category = ?'; 7$stmt=$dbh->prepare($sql); 8$stmt->bindValue(1, $category_0, PDO::PARAM_INT); 9$stmt->execute($arrParams);
例1と例2が組み合わさった場合
上記の3つはどのような対策が考えられるのでしょうか?
御解答お待ちしております。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。