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

PHP:SQLインジェクション防止のためにSELECTを調整した後、whileループが機能しない

    列名とテーブル名はバインドできません。データのみをバインドできます。テーブルを指定してから、'%calendar weekday%'にバインドする必要があります 。

    $stmt = $conn->prepare("SELECT " . $selectLang . " FROM `TranslationsMain` WHERE `location` LIKE ? ORDER BY `sortOrder`, " . $selectedLang);
    $stmt->bind_param('s', $calendar_weekday);
    

    動的なテーブル/列名を使用する場合は、それらのアイテムの最小限のホワイトリストを実行する必要があります。特定のデータベーステーブルに有効な列をデータベースに問い合わせることで、動的ホワイトリストを作成できます。例:

    SELECT `COLUMN_NAME` 
    FROM `INFORMATION_SCHEMA`.`COLUMNS` 
    WHERE `TABLE_SCHEMA` = `database_name`
    AND `TABLE_NAME` = `table_name`
    

    このすべての情報を配列に配置してから、クエリで使用されるテーブル/列の名前が配列に含まれていることを確認できます。テーブル名と列名については特に考慮し、これらの名前にキー/予約語が使用されていないことを確認する必要があります。

    最後に、動的クエリの値を呼び出すときは、検証済みのテーブル/列名の前後にバッククォートを使用します。これにより、キー/予約語リストへの潜在的な変更がすべてカバーされ、保護の追加レイヤーが提供されます。




    1. SQLServerで中央値を計算する関数

    2. Doctrine2(Symfony2)でケースごとに注文する方法

    3. 致命的なエラー:stdClass型のオブジェクトを配列として使用できません

    4. Androidルーム+ウィンドウ関数