のコード:) おかげで私と一緒にすべての問題を回避したいと思います。 フレンドリーなコミュニティメンバーは、あなたの操作を分離することを検討する必要があります。
)...入力(filter_input_array()
、strip_tags()
、str_ireplace()
、trim()
などをフィルタリングするための1つの機能/ルーチン/クラス/メソッドを持っています)。フィルタリングを行うためにループを使用する関数を作成することができます。ダブルエンコーディング、ワンタイムストリップスプーフィングなどのトリックは、strip_tags()
のようなものを一回使用すると敗北することがあります。
私のSanitizer
クラスのstrip_tags()
ラッパーメソッドがあります。 古い値と新しい値を比較して、等しいかどうかを確認します。等しくない場合は、strip_tags()
を使用し続けます。ただし、このメソッドを実行する前に予備INPUT_POST/$ _POSTチェックがかなり行われていますが、 trim()
を使ったこのバージョンの別のバージョンは、実際にはこの前に実行されます。
private function removeHtml(&$value)
{
if (is_scalar($value)) {
do {
$old = $value;
$value = strip_tags($value);
if ($value === $old) {
break;
}
} while(1);
} else if (is_array($value) && !empty($value)) {
foreach ($value as $field => &$string) {
do {
$old = $string;
$string = strip_tags($string);
if ($string === $old) {
break;
}
} while (1);
}
} else {
throw new Exception('The data being HTML sanitized is neither scalar nor in an array.');
}
return;
}
)入力(filter_var_array()
、preg_match()
、mb_strlen
、などを検証するための別のものを持っている...)
次に
、あなたのデータはコンテキストを切り替える必要があるとき...
A)データベースの場合は、プリペアドステートメント(PDO
、好ましくは)を使用します。
B)/復帰ブラウザにユーザ入力を送信するためには、それに応じてhtmlentities()
又はhtmlspecialchars
で出力をエスケープ。
マジッククォートに関しては、php.ini
でそれを無効にするだけです。
ここでは、それぞれ独自の責任範囲を持つさまざまな構造を使用して、ハンドラファイル内のロジックとデータの流れを管理するだけです。これには、ユーザーにエラーメッセージを提供し(必要な場合)、エラー/例外を処理することが含まれます。
データが直接HTMLフォームからデータベースに送られる場合は、すぐにhtmlentities()
またはhtmlspecialchars
を使用する必要はありません。データをエスケープするポイントは、新しいコンテキスト内で実行可能な命令として解釈されないようにすることです。 SQLクエリエンジンにデータを渡すときに、htmlentities()
またはhtmlspecialchars
が解決できるという危険はありません。そのため、入力をフィルタリングして検証し、prepared statement(PDO
)を使用しています。しかしながら
、データがデータベーステーブルとから取得された後は、直接OK、今htmlentities()
又はhtmlspecialchars
を使用し、ブラウザのを宛てです。そのシナリオを処理するためにfor
またはforeach
ループを使用するfunction
を作成します。ここで
は、あなたがあなた自身の個人的な好みや状況にあなたのコードを調整する必要があります私のEscaper
クラス
public function superHtmlSpecialChars($html)
{
return htmlspecialchars($html, ENT_QUOTES | ENT_HTML5, 'UTF-8', false);
}
public function superHtmlEntities(&$html)
{
$html = htmlentities($html, ENT_QUOTES | ENT_HTML5, 'UTF-8', false);
}
public function htmlSpecialCharsArray(array &$html)
{
foreach ($html as &$value) {
$value = $this->superHtmlSpecialChars($value);
}
unset($value);
}
public function htmlEntitiesArray(array &$html)
{
foreach ($html as &$value) {
$this->superHtmlEntities($value);
}
unset($value);
}
からの抜粋です。
注意、あなたがブラウザに送信する前にデータを処理する予定がある場合、最初の処理を行い、その関数をループあなたのハンディダンディhtmlentities()
またはhtmlspecialchars
で脱出。
できます。
は十分に安全であり、どのような方法でデータをエスケープする必要はありません。エスケープは、SQLクエリを入力データと連結する場合にのみ必要です。これはPrepared Statementを使用する場合と異なります。 –
DBMSは、予期されたデータ型とエンコーディングに基づいて、プリペアドステートメントで提供されるパラメータを自動的にサニタイズします。手動で文字列をエスケープし、それをプリペイドド・ステートメント・パラメーターとして送信すると、実際にはそれは安全性が低くなります。 – apokryfos
時間があれば、データベースインタラクションを処理するために 'PDO'を使う方法を学んでください。 http://php.net/manual/en/book.pdo.php –