4

クエリ文字列に直接値を配置する代わりにパラメータを使用することは、SQLインジェクション攻撃を防ぐために行われるため、常に行う必要があります。

... WHERE p.name > :name ...
->setParameter('name', 'edouardo')

これは、このようなパラメーターを使用すると、SQLインジェクションから常に保護されることを意味しますか?フォーム(FOSの登録フォーム)を使用しているときに、<b>eduardo</b>代わりに配置しました。これは、タグを使用してデータベースに永続化されました。パラメータを使用することでSQLインジェクションが妨げられる理由がよくわかりません...

タグがこのようにデータベースに永続化されるのはなぜですか?Symfonyの検証コンポーネントを使用してタグを削除する方法はありますか?

Symfonyのデータベースにデータを永続化する前に使用すべき一般的なヒントや方法はありますか?

4

2 に答える 2

10

SQLインジェクションとは何かを読むことから始めます。

SQLインジェクション攻撃は、SQLに入力された値がクエリを変更したときに発生します。その結果、クエリは意図された他の何かを実行します。

例として、 edouardo'OR' 1'=' 1を値として使用すると、次のようになります。

WHERE p.name > 'edouardo' OR '1'='1'

(したがって、条件は常に真です)。

「<b>eduardo</b>」は完全に有効な値です。場合によっては、送信済みとして保存する必要があります(コンテンツ管理システムなど)。もちろん、データベースからHTMLを取得して直接出力すると、HTMLが破損する可能性があります。これは、テンプレートエンジンで解決する必要があります(小枝は自動的にエスケープします)。

フォームからエンティティにデータを渡す前にデータを処理する場合は、データトランスフォーマーを使用します。

于 2012-07-18T11:54:28.187 に答える
6

要求を作成するときに連結の代わりにパラメーターを使用する場合、プログラムはSQLキーワードと値を区別することができます。したがって、悪意のあるSQLコードを含む可能性のある値を安全にエスケープできるため、この悪意のあるものは実行されませんが、必要に応じてフィールドに格納されます。

HTMLコードインジェクションは別の問題であり、データベースとは何の関係もありません。この問題は、 eduardo<b>eduardo</b>の代わりに表示される自動出力エスケープを使用して値を表示するときに解決されます。このように、悪意のあるjs / htmlコードは解釈されず、表示されます。

于 2012-07-18T11:51:52.640 に答える