web-dev-qa-db-ja.com

Laravel雄弁:SQLインジェクション防止は自動的に行われますか?

コード例を考えると(Messageは雄弁なモデルです。):

public function submit(Request $request){
    $this->validate($request, [
        'name' => "required",
        "email" => "required"
    ]);

    //database connection
    $message = new Message;
    $message->name = $request->input("name");
    $message->email = $request->input("email");

    $message->save();
}

Eloquentはパラメーター化されたクエリ(PDOなど)またはその他のメカニズムを使用してSQLインジェクションを防ぎますか?

14
Zirou Qiu

はい、でも...

はい、それは SQLインジェクション$someModelInstance->save()のような組み込みのORM機能に依存するときに防止します。 the docs から:

Laravelのデータベースクエリビルダーは、データベースクエリを作成および実行するための便利で流暢なインターフェイスを提供します。アプリケーションでほとんどのデータベース操作を実行するために使用でき、サポートされているすべてのデータベースシステムで動作します。

Laravelクエリビルダーは、PDOパラメータバインディングを使用して、SQLインジェクション攻撃からアプリケーションを保護します。バインディングとして渡される文字列をクリーンアップする必要はありません。

生のSQLステートメントを作成してそれらを実行するか、生の式を使用すると、あなたはnotが自動的に保護されることに注意してください。 ドキュメントの詳細

生のステートメントは文字列としてクエリに挿入されるため、SQLインジェクションの脆弱性が発生しないように細心の注意を払う必要があります。

生のSQLステートメントまたは式を作成するときは、常にパラメーター化クエリを使用する必要があります。 Laravel/Eloquentでこれを行う方法については、上記の最後のリンク(およびドキュメントのその他の部分、welなど)を参照してください。

25
elixenide