phpにおける特殊文字のエスケープ


Webアプリケーションのセキュリティの基礎は、出力をエスケープしたり、特殊な文字を符号化したりして、本来の意味が変わらないことを保証することです.たとえば、O'ReillyはMySQLデータベースに転送する前にO'Reillyに変換する必要があります.単一引用符の前の反スラッシュは、単一引用符がデータ自体の一部であり、その本義ではないことを表します.私が指す出力エスケープは具体的に3つのステップに分けられます:l出力l出力エスケープlがエスケープされたデータとエスケープされていないデータを区別してフィルタされたデータだけをエスケープする必要があります.エスケープは、多くの一般的なセキュリティ・ホールを防止しますが、入力フィルタに代わるものではありません.汚染されたデータは、まずフィルタリングされ、その後、エスケープされなければならない.出力をエスケープするときは、出力を認識する必要があります.通常、これは入力を認識するよりもずっと簡単です.それはあなたが行った動作に依存しているからです.たとえば、クライアントの出力を認識すると、echoprintprintfはアプリケーションの開発者として、外部システムに出力される場所を知る必要があります.出力を構成します.フィルタリングのように、エスケーププロセスは状況によって異なる.フィルタリングは、異なるタイプのデータ処理方法に対しても異なり、エスケープもあなたが異なるシステムに情報を送信することによって異なる方法を採用します.一般的な出力ターゲットについて(クライアント、データベース、URLを含む)のエスケープには、PHPに内蔵された関数があります.独自のアルゴリズムを書く場合は、万全を期すことが重要です.外部システムで特殊文字の信頼性と完全なリスト、およびそれらの表現方法を見つける必要があります.このようなデータは、翻訳ではなく残されています.最も一般的な出力先はクライアントであり、html lenを使用します.tities()は,データの送信前にエスケープを行うのが最良の方法である.他の文字列関数と同様に、入力は文字列であり、加工して出力します.ただしhtmlentities()関数を使用する最善の方法は、引用符のエスケープ方法(第2のパラメータ)と文字セットの2つのオプションパラメータを指定することです.(第3パラメータ).引用符のエスケープ方法はENT_QUOTESとして指定する必要があります.これは、単一引用符と二重引用符を同時にエスケープすることを目的としています.これが最も徹底しており、文字セットパラメータはページで使用される文字セットに一致する必要があります.データがエスケープされたかどうかを区別するために、ネーミングメカニズムを定義することをお勧めします.クライアントに出力されるエスケープデータについては、$htmlを使用します.配列は格納され、このデータはまず空の配列に初期化され、すべてのフィルタされたデータとエスケープされたデータが保存されます.
<?php
$html = array( );
$html['username'] = htmlentities($clean['username'], ENT_QUOTES, 'UTF-8');
echo "<p>Welcome back, {$html['username']}.</p>";
?>

ヒントhtmlspecialchars()関数はhtmlentities()関数とほぼ同じであり、それらのパラメータ定義は完全に同じであるが、htmlentities()の転義がより徹底しているにすぎない.$html['username']でusernameをクライアントに出力すると、ブラウザで特殊な文字が誤って解釈されないことを確認できます.usernameにアルファベットと数字しか含まれていない場合、実際にはエスケープは必要ありませんが、これは深い防犯の原則を体現しています.任意の出力をエスケープするのは非常に良い習慣であり、ソフトウェアのセキュリティを劇的に向上させることができます.もう1つの一般的な出力ターゲットはデータベースです.可能であれば、SQL文のデータをPHP組み込み関数で変換する必要があります.MySQLユーザーの場合、最も良いエスケープ関数はmysql_です.real_escape_string( ).使用するデータベースにPHP内蔵エスケープ関数がない場合は、addslashes()が最後の選択です.次の例では、MySQLデータベースの正しいエスケープテクニックを説明します.
<?php
$mysql = array( );
$mysql['username'] = mysql_real_escape_string($clean['username']);
$sql = "SELECT *
FROM profile
WHERE username = '{$mysql['username']}'";
$result = mysql_query($sql);
?>