mysql_real_escape_string() と mysql_escape_string() はアプリのセキュリティに十分ですか?
これらの関数は SQL インジェクションやその他の攻撃に対してある程度の保護を提供できますが、
SQL インジェクション
Mysql_real_escape_string() は、クエリ内で PHP 変数を不適切に処理した場合でも、アプリケーションを SQL インジェクションにさらす可能性があります。次の例を考えてみましょう:
$sql = "SELECT number FROM PhoneNumbers WHERE " . mysql_real_escape_string($field) . " = " . mysql_real_escape_string($value);
mysql_real_escape_string() はテーブル名、列名、または LIMIT フィールドを保護するように設計されていないため、このクエリは攻撃者によって操作されて未承認の SQL ステートメントを実行する可能性があります。
Like 攻撃
Mysql_real_escape_string() は、LIKE エクスプロイトを防ぐには不十分です。攻撃者は、「%%」などの悪意のある値を入力してすべてのレコードを返し、機密情報を侵害する可能性があります。
Charset Exploits
特定のブラウザは charset に対して脆弱である可能性があります。これを悪用すると、攻撃者がエスケープ メカニズムをバイパスして任意の 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())) { }
プリペアド ステートメントは、次のようなプロアクティブな防御メカニズムを提供します。基盤となるデータベース サーバーのセキュリティ機能を活用します。これらは本質的に既知の攻撃と未知の攻撃の両方に対して耐性があり、データの整合性を確保します。
以上が`mysql_real_escape_string()` と `mysql_escape_string()` の使用はアプリケーションを保護するのに十分ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。