2017-08-23 8 views
0

私は、ページ上に出力されるすべてのユーザ入力、例えばを消毒しています。:データのサニタイズPHP - if文の中にあるユーザ入力をエスケープする必要がありますか?

echo escape($user_input); 

私がページに出力されませんが、内部のステートメントですユーザ入力についての質問を持っている - 彼らはエスケープが必要なのですか?

は、このOKです:

if ($user_input == 'something') { echo escape($another_user_input); } 

またはそれは次のようになります。この単純な例よりfaffを追加し、他のロジック(foreach文など)のための

if (escape($user_input) == 'something') { echo escape($another_user_input); } 

同じ質問。

+1

データベースに挿入する前の2番目の値で、不正なコードから値が消去されます。例、ユーザー名!最初のものはコメントのようなもので、ユーザーの入力を受け取り、それをエスケープして印刷し、htmlspecialcharsを使用します。 –

+0

@ MrPro Wut ?!どうして? – deceze

+0

あなたがあらかじめ定義された文字列と比較しているだけの場合、入力をエスケープするのにはほとんど役に立ちません。 'echo'行をエスケープする必要があります。あなたのページのHTMLを破壊したり悪意のあるスクリプトを挿入したりするものがないことを確認する必要があります。その場合、 'escape'だけでは不十分だと思います。 –

答えて

0

何かをエスケープする必要がある唯一の理由は、別のテキストメディアにデータを補間して、いくつかのルールに従って再解釈するときだけです。

例えば:

echo '<p>' . $somedata . '</p>'; 

これは、プログラムでHTMLパーサーによって解釈されますと$somedataの内側に何があるかに応じて、特定の動作を持つことになりますHTMLを生成しています。

$query = 'SELECT foo FROM bar WHERE baz = ' . $somedata; 

これは、プログラムでSQLパーサによって解釈されますと$somedataの内側に何があるかに応じて、特定の動作を持っていますSQLクエリを生成しています。

HTMLまたはそのクエリが意図したとおりに動作するようにするには、誰でも不要なコマンドを挿入できないようにテキストコマンドを生成することをお勧めします。

if ($somedata == 'something') 

ここでは、何かによって解釈される新しいテキストを作成していません。誰でもここに何かを注入する方法はありません。 PHPが$somedata$somedataの内容に置き換えて、その行を補間されたデータで再解釈するのとは異なります。だから、何とかこれを逃れる必要はありません。

The Great Escapism (Or: What You Need To Know To Work With Text Within Text)も参照してください。

+0

偉大な答えと本当に有用な記事をありがとう - それはより完全に問題を理解するのに役立っています。 – Ryan

関連する問題