環境
OS:CentOS 7.3
PHP:7.1.21
mariadb:10.1.22
概要
PDOで PDO::ATTR_EMULATE_PREPARES を false
にすると、
(機能のひとつとして)セミコロンでつなげたSQL(複文)を禁止できるようですが、
コメント(--) の部分は複文として検知してくれないようです。
※ 以下、query() メソッド使用。
$sql .= "select * from table1;\n";
$sql .= "select * from table2;\n";
//検知してくれる OK
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'select * from table2' at line 2
$sql .= "select * from table1;\n";
$sql .= "-- select * from table2;\n";
//検知しなかった???
$sql .= "select * from table1;\n";
$sql .= "-- select * from table2;\n";
$sql .= "select * from table3;\n";
//これは検知するけど3行目なんだ・・・
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'select * from table3' at line 3
まとめ
複文禁止といっても「有効なSQLの複文」を禁止するみたいで、
コメント行は有効なSQLでないということなのでしょう。
コメント(--) を使ったSQLインジェクションがありますが、
PDO::ATTR_EMULATE_PREPARES の設定だけでは不十分ということですね。
コメント使用の攻撃に対しては、
プリペアドステートメントを併用して防ぎましょう。