少し検索していたところ、PHP で次のような行が見つかりました。
$mots = mysql_real_escape_string(stripslashes(strip_tags(htmlspecialchars($_POST['mots']))));
$_POST エントリを可能な限り適切に保護するには、これが実際にどれだけ必要なのか疑問に思っていました。
ありがとう
データをサニタイズする際に必要なこと (具体的には、この場合はユーザー入力データ) は、以下を含む (ただしこれらに限定されません) 多数の基準によって異なります。
string
、integer
)binary
database
: text file
)displayed back to users
、server side calculations
)ユーザー入力のサニタイズに関しては、予想されるデータ型が非常に重要であり、サニタイズが非常に簡単または複雑になる可能性があります。
一般的に予想される入力タイプは次のとおりです。
入力が単にinteger
またはdecimal
数値である場合は、入力が期待されるデータ型に変換されていることを確認するだけで簡単にサニタイズできます。
text
予想される入力の場合、特定の文字/文字列をエスケープまたは削除XSS
して、 や などを防ぐことができSQL injection
ます。
データが入力された場合binary
、データが安全であることを確認し、悪意のあるコードのスキャンを実行し、ファイルに正しいユーザー権限を設定して、サーバーでコードが実行されないようにする必要があります。同様に、text
特定の文字をエスケープする必要がある場合もあります。
保管場所も必要なサニタイズに影響を与えます。 database
vsの例を見てみましょうfile
:
データベースにデータを入力するときは、特定の文字をエスケープしてSQL injections
、逆にしようとする人からシステムを保護する必要があります。使用していないデータベースを使用していない場合は、SQL
特に保護するSQL injection
必要はありません。
ただし、データベースに保存していないからといって安心できるわけではありません。ファイルに保存すると、悪意のあるコードがアップロードされる可能性もあるため、情報を保存するためにアップロードまたは作成されたファイルがexecutable
サーバーに存在しないようにするための手順を実行する必要があります。(これは、ファイルのアップロードを明確に許可しているようなコードに限定されません:
<input type="file" name="uploadFile">
たとえば、次のような場合にも適用されます。
file_put_contents($uploaded_data);
ユーザーがデータを入力できるようにする目的は、ユーザー入力に適用する必要がある保護を決定する上でも役割を果たします。入力はさまざまな理由で使用できますが、主な (または最も一般的な) 理由は次のとおりです。
forum posts
、)comments
images
calorie counters
:insurance quotes
)データがユーザーに表示される場合は、次のような攻撃からの保護とXSS
、サイトの視覚的な損傷を防ぐことを考慮する必要があります。どちらも、次のようなタグを挿入することで実行できます。<script>...</script>
一方、データが現在の形式でユーザーに表示されない場合XSS
などは、多少無関係になる可能性があります。
データのサニタイズは、危険なコードの影響を受ける可能性のあるサーバー側で何かを行う前に処理する必要があります (たとえば、データベースに挿入する前)。
データを使用する直前にサニタイズすることを選択したり、スクリプトを開始するとすぐにコードをサニタイズしたりすることを好む場合があります。ただし、これは主に個人の好みと問題のシステムの使用例に依存します。
ただし、次のような関数をいつ実行するか (つまりhtmlspecialchars
、データベースにアップロードする前とユーザーに表示する前)については、しばしば議論があります。これも個人の好みとデータの使用方法に依存しますが、どちらの方法にも長所と短所があります。詳しくは説明しません。
ただし、ユーザー データをraw
(ただし安全に) データベースに保存する場合は、時間の経過とともにデータをサニタイズする方法を自由に変更できます。などの関数を使用した後にデータの保存を開始した場合と同様htmlspecialchars
にstip_tags
、入力から一部のデータを削除/変更していて、後でデータを失ったことに気付くためだけに許可/含めたいと決定する可能性があります。例えば:
strip_tags
はデフォルトで入力からすべてのタグを削除しますが、これは現時点では良いアイデアのように思えますが、さらに下に行くと、<b>
またはのようなタグを実際に許可することを決定するかもしれません<i>
が、それらは既に入力されている入力には存在しなくなります救われました。
もちろん、フォーマットにyour own mark up
or (または同様のもの) を使用している場合は、データベースに保存する前に etc を使用することは完全に合理的です。同様に、プレーン テキストのみを保存する場合は、プレーンでないものをすべて削除することも合理的です。繰り返しますが、それはユースケースに依存します...bb
strip_tags
各関数の機能の簡単な説明については、コメントを参照してください。
$mots = mysql_real_escape_string( //Escapes certain characters to 'sanitize' for input to database
stripslashes( //Removes any escape slashes added by default in $_POST
strip_tags( //Removes any tags present in the text e.g. <b></b>
htmlspecialchars( //Coverts some charachters like £ to html codes like £
$_POST['mots']
)
)
)
);
コードの最も明白な問題は、関数を適用する順序です。(または文字をエンコードするその他の関数)は常に前に来るstip_tags
必要があります。この理由は簡単です。htmlspecialchars
$_POST['userinput'] = "<b>Some user input</b>"; //Input uploaded from form
echo strip_tags($_POST['userinput']);
//Ouputs: Some user input
echo htmlspecialchars($_POST['userinput'], ENT_QUOTES, 'UTF-8');
//Output: <b>Some user input</b>
echo strip_tags(htmlspecialchars());
//Output: <b>Some user input</b>
上記のコード例では、およびシンボルがそれぞれに変換され、削除されないhtmlspecialchars
前に実行すると、基本的には役に立たないことがわかります。ただし、最初に実行すると、必要に応じてタグが削除され、その他のその他の.strip_tags
<
>
html codes
strip_tags
special chars