sql >> データベース >  >> RDS >> Mysql

$ _SESSIONはSQLインジェクトから安全ですか?

    入力が数値であるかどうかを実際にテストする必要はありません。MySQLでは、たとえば'123abc' 数値コンテキスト(整数列idと比較されるような) )暗黙的に数字のみを取得し、残りを無視します。 'abc'のような数値以外の文字列 先頭の数字がないため、単純に整数値0になります。

    重要なのは、クエリパラメータを使用する場合、値はSQLインジェクションから安全であるということです。入力が$_SESSIONからのものか、別のソースからのものかは関係ありません。 $ _SESSIONは、SQLインジェクションに関して安全でも危険でもありません。重要なのは、クエリにデータを渡す方法です。

    また、コードを簡略化して、パラメータープレースホルダーのリストをフォーマットします。

    $placeholders = implode(',', array_fill(1, count((array)$_SESSION['story']), '?'));
    

    そして、bindParam()を忘れて、配列をexecute()に渡すだけです。 。

    //Collect all data needed
    $storyQuery = openConnection() -> prepare("SELECT * FROM `stories` 
        WHERE `id` IN ({$placeholders})");
    $storyQuery -> execute((array)$_SESSION['story']);
    $story = $storyQuery -> fetchAll();
    

    コメントを再確認してください:

    PDOでは、:idなどの名前付きパラメーターを使用できます。 、または常に?である位置パラメータを使用できます (ただし、特定のクエリでこれら2つのタイプを混在させないでください。どちらか一方を使用してください)。

    配列をexecute()に渡す 配列要素をパラメーターに自動的にバインドします。単純な配列(つまり、整数でインデックス付けされている)は、位置パラメーターに簡単にバインドできます。

    名前付きパラメーターを使用する場合は、配列のキーがパラメーター名と一致する連想配列を渡す必要があります。配列キーには、オプションで:のプレフィックスを付けることができます。 ただし、必須ではありません。

    PDOを初めて使用する場合は、ドキュメント を読むことをお勧めします。 。コード例とすべてがあります!



    1. Mysql-インデックスを使用しないように選択します

    2. Laravel4の挿入クエリストアドプロシージャでパラメータを渡す

    3. PHPでMySQLを検索する

    4. SQLクエリからElasticSearchクエリへの自動変換