mysql_real_escape_string() と mysql_escape_string() はアプリのセキュリティに十分ですか?
これらの関数は SQL インジェクションやその他の攻撃に対してある程度の保護を提供できますが、 、特定の脆弱性に対処できません。
SQLクエリ内で PHP 変数を不適切に処理すると、Injection
Mysql_real_escape_string() によってアプリケーションが SQL インジェクションにさらされる可能性があります。次の例を考えてみましょう:
$sql = "SELECT number FROM PhoneNumbers WHERE " . mysql_real_escape_string($field) . " = " . mysql_real_escape_string($value);
mysql_real_escape_string() はテーブル名、列名、または LIMIT フィールドを保護するように設計されていないため、このクエリは攻撃者によって操作されて未承認の SQL ステートメントを実行する可能性があります。
同様の攻撃
Mysql_real_escape_string() は LIKE エクスプロイトを防ぐには不十分です。攻撃者は「%%」などの悪意のある値を入力してすべてのレコードを返し、機密情報を侵害する可能性があります。
文字セットの悪用
特定のブラウザは文字セットに対して脆弱である可能性があります。これを悪用すると、攻撃者がエスケープ メカニズムをバイパスして任意の SQL を実行する悪意のある文字を挿入できるようになります。コマンド.
プリペアド ステートメント: 包括的なソリューション
アプリケーションを効果的に保護するには、mysql_real_escape_string() の代わりにプリペアド ステートメントを使用することをお勧めします。プリペアド ステートメントは、ユーザーが指定した値をパラメータとしてバインドすることにより、SQL クエリを実行します。これにより、手動でエスケープする必要がなくなり、承認された SQL のみが実行されるようになります。
PHP でプリペアド ステートメントを使用する例を次に示します。
$pdo = new PDO($dsn); $column = 'url'; $value = 'http://www.example.com/'; $limit = 1; // Validate the search parameter column. $validColumns = array('url', 'last_fetched'); if (!in_array($column, $validColumns)) { $column = 'id'; } $statement = $pdo->prepare('SELECT url FROM GrabbedURLs ' . 'WHERE ' . $column . '=? ' . 'LIMIT ' . intval($limit)); $statement->execute(array($value)); while (($data = $statement->fetch())) { }
プリペアド ステートメントは、基盤となるデータベース サーバーのセキュリティ機能を活用することで、プロアクティブな防御メカニズムを提供します。これらは本質的に既知の攻撃と未知の攻撃の両方に対して耐性があり、データの整合性を確保します。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3