Help us understand the problem. What is going on with this article?

【PDO】複文禁止オプションの注意点(ATTR_EMULATE_PREPARES)

環境

OS:CentOS 7.3
PHP:7.1.21
mariadb:10.1.22

概要

PDOで PDO::ATTR_EMULATE_PREPARESfalse にすると、
(機能のひとつとして)セミコロンでつなげた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 の設定だけでは不十分ということですね。

コメント使用の攻撃に対しては、
プリペアドステートメントを併用して防ぎましょう。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away