Web アプリケーションのセキュリティのもう 1 つの基礎は、出力をエスケープするか特殊文字をエンコードして、元の意味が変更されないようにすることです。たとえば、O'Reilly は、MySQL データベースに送信される前に O'Reilly にエスケープする必要があります。一重引用符の前のバックスラッシュは、一重引用符が本来の意味ではなくデータ自体の一部であることを意味します。私が言及している出力エスケープは 3 つのステップに分かれています。
フィルタリングされたデータのみをエスケープする必要があります。エスケープは多くの一般的なセキュリティ脆弱性を防止しますが、入力フィルタリングに代わるものではありません。汚染されたデータは、まずフィルタリングしてからエスケープする必要があります。
出力をエスケープする場合は、まず出力を識別する必要があります。多くの場合、これは実行するアクションに依存するため、入力を認識するよりもはるかに簡単です。たとえば、クライアントの出力を認識する場合は、コード内で次のステートメントを探すことができます。外部システムが出力する場所。それらは出力を構成します。
フィルタリングと同様に、エスケープ処理も状況に応じて異なります。フィルタリングはデータの種類によって異なり、エスケープ方法は情報の転送先のシステムに応じて異なります。
PHP には、クライアント、データベース、URL などの一般的な出力ターゲットをエスケープするために使用できる組み込み関数があります。独自のアルゴリズムを作成する場合は、確実であることが重要です。外部システム内の特殊文字の信頼できる完全なリストと、データが変換されずに保存されるようにそれらがどのように表現されるかを見つける必要があります。
最も一般的な出力ターゲットは、 htmlentities( を使用するクライアント) です。 ) は、データを送信する前にエスケープする最良の方法です。他の文字列関数と同様に、その入力は文字列であり、処理されて出力されます。ただし、 htmlentities( ) 関数は、引用符をエスケープする方法 (2 番目のパラメーター) と文字セット (3 番目のパラメーター) の 2 つのオプションのパラメーターを指定します。引用符のエスケープ方法は ENT_QUOTES として指定する必要があります。その目的は、単一引用符と二重引用符を同時にエスケープすることです。これは、文字セット パラメータがページで使用される文字セットと一致する必要があります。
データがエスケープされているかどうかを区別するために、やはり名前付けメカニズムを定義することをお勧めします。クライアントにエスケープされたデータ出力の場合、データは最初に空の配列に初期化され、フィルター処理されエスケープされたデータがすべて保存されます。
CODE:
echo print printf <?=
ヒント
) function and htmlentities( ) 関数は基本的に同じであり、パラメータ定義もまったく同じですが、htmlentities() のエスケープがより徹底されている点が異なります。
$html['username'] を介してユーザー名をクライアントに出力することで、特殊文字がブラウザーによって誤って解釈されないようにすることができます。ユーザー名に文字と数字のみが含まれている場合、実際にはエスケープは必要ありませんが、これは多層防御の原則を反映しています。出力をエスケープすることは良い習慣であり、ソフトウェアのセキュリティを大幅に向上させることができます。
もう 1 つの一般的な出力先はデータベースです。可能であれば、PHP の組み込み関数を使用して SQL ステートメント内のデータをエスケープする必要があります。 MySQL ユーザーにとって、最適なエスケープ関数は mysql_real_escape_string( )。使用しているデータベースに PHP の組み込みエスケープ関数がない場合は、addslashes() が最後の手段です。
次の例は、MySQL データベースの正しいエスケープ手法を示しています:
CODE:
<?php $mysql = array( ); $mysql['username'] = mysql_real_escape_string($clean['username']); $sql = "SELECT * FROM profile WHERE username = '{$mysql['username']}'"; $result = mysql_query($sql); ?>
以上就是PHP安全-输出转义的内容,更多相关内容请关注PHP中文网(www.php.cn)!