1

Doctrine DBAL関数executeQueryを次のように使用しようとしています:

$conn = DBAL\DriverManager::getConnection($connectionParams, $config);

$sql = "SELECT count(*) FROM clients WHERE client_id = :id";

$results = $conn->executeQuery($sql, ['id' => 'foo'], ['id' => \PDO::PARAM_STR]);

var_dump($results->fetchAll());
var_dump($results->rowCount());

これは正常に動作します:

array (size=1)
  0 => 
    array (size=1)
      'count(*)' => string '1' (length=1)
int 1

ただし、コードは次の行を使用しても機能します (型パラメーターが正しく宣言されていないか、まったく宣言されていません)。

$results = $conn->executeQuery($sql, ['id' => 'foo'], ['id' => \PDO::PARAM_INT]);

$results = $conn->executeQuery($sql, ['id' => 'foo'], ['notatag' => \PDO::PARAM_STR]);

$results = $conn->executeQuery($sql, ['id' => 'foo']);

バインドされた変数データ型の宣言が使用されていないことを示唆しており、これが SQL インジェクションから保護されているかどうかについて懸念が生じています。

ここで何か間違ったことをしていますか?コードが安全であることを確認するにはどうすればよいですか?

4

1 に答える 1

1

DBAL のドキュメントを読み直して、この宝石に出会いました。

(PDO::PARAM* 定数を介して) 整数をパラメーターバインディングメソッドのいずれかに指定せずに文字列を指定した場合、Doctrine DBAL は型抽象化レイヤーに、渡された値を PHP からデータベース表現に変換するように要求します。

したがって、$typesパラメーターを定義しないことで、Doctrine に任せて明示的に型を変換します。

しかし、これはどのように安全ですか?Doctrine は、「クエリにユーザー入力」を含める「正しい」方法を説明する際に、次のように述べています。

パラメータをバインドするだけでなく、変数の型を渡すこともできます。これにより、Doctrine または基盤となるベンダーは、エスケープするだけでなく、値を正しい型にキャストすることもできます。

セキュリティの観点から、$typesパラメーターはオプションであることを示唆しています。

于 2015-03-25T21:13:33.527 に答える