ホームページ >データベース >mysql チュートリアル >PDO プリペアドステートメントで ORDER BY パラメーターを安全に使用するにはどうすればよいですか?

PDO プリペアドステートメントで ORDER BY パラメーターを安全に使用するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-26 01:12:10794ブラウズ

How Can I Securely Use ORDER BY Parameters with PDO Prepared Statements?

PDO 準備済みステートメント: ORDER BY パラメーターの設定

準備済み PDO ステートメントを使用する場合、 ORDER BY 句。ステートメントはエラーなしで実行されますが、結果が返されない場合があります。

この問題を解決するには、次のコードに示すように、ORDER BY 引数を SQL ステートメントに直接挿入する必要があります。

$order = 'columnName';
$direction = 'ASC';

$stmt = $db->prepare("SELECT * from table WHERE column = :my_param ORDER BY $order $direction");

すべての演算子と識別子がハードコーディングされ、動的に生成されないようにすることが重要です。このアプローチは、インジェクション攻撃の防止に役立ちます。

コードのセキュリティを強化するもう 1 つの方法は、以下に示すようなホワイトリスト ヘルパー関数を使用することです。

function white_list($value, $allowed_values, $error_message) {
    if (!in_array($value, $allowed_values)) {
        throw new Exception($error_message);
    } else {
        return $value;
    }
}

この関数を使用すると、入力された値が有効な値の事前定義されたリストに存在することを確認し、存在しない場合はエラーを発生させることができます。

このアプローチを利用すると、準備した値がステートメントは安全であり、ORDER BY パラメータを正しく処理できます:

$order = white_list($order, ["name", "price", "qty"], "Invalid field name");
$direction = white_list($direction, ["ASC", "DESC"], "Invalid ORDER BY direction");

$sql = "SELECT field from table WHERE column = ? ORDER BY $order $direction";
$stmt = $db->prepare($sql);
$stmt->execute([$is_live]);

以上がPDO プリペアドステートメントで ORDER BY パラメーターを安全に使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。