1

少し検索していたところ、PHP で次のような行が見つかりました。

$mots = mysql_real_escape_string(stripslashes(strip_tags(htmlspecialchars($_POST['mots']))));

$_POST エントリを可能な限り適切に保護するには、これが実際にどれだけ必要なのか疑問に思っていました。

ありがとう

4

3 に答える 3

0

ユーザーデータのサニタイズ

データをサニタイズする際に必要なこと (具体的には、この場合はユーザー入力データ) は、以下を含む (ただしこれらに限定されません) 多数の基準によって異なります。

  1. 期待されるデータのタイプ (例: stringinteger)binary
  2. データを保存する場所 (例database: text file)
  3. データの使用方法 (例: displayed back to usersserver side calculations)
  4. さて、あなたは要点を理解します...

期待されるデータ型

ユーザー入力のサニタイズに関しては、予想されるデータ型が非常に重要であり、サニタイズが非常に簡単または複雑になる可能性があります。

一般的に予想される入力タイプは次のとおりです。

  1. 文章
  2. 整数
  3. 小数
  4. バイナリ

入力が単にintegerまたはdecimal数値である場合は、入力が期待されるデータ型に変換されていることを確認するだけで簡単にサニタイズできます。

text予想される入力の場合、特定の文字/文字列をエスケープまたは削除XSSして、 や などを防ぐことができSQL injectionます。

データが入力された場合binary、データが安全であることを確認し、悪意のあるコードのスキャンを実行し、ファイルに正しいユーザー権限を設定して、サーバーでコードが実行されないようにする必要があります。同様に、text特定の文字をエスケープする必要がある場合もあります。

ストレージの場所

保管場所も必要なサニタイズに影響を与えます。 databasevsの例を見てみましょうfile:

データベースにデータを入力するときは、特定の文字をエスケープしてSQL injections、逆にしようとする人からシステムを保護する必要があります。使用していないデータベースを使用していない場合は、SQL特に保護するSQL injection必要はありません。

ただし、データベースに保存していないからといって安心できるわけではありません。ファイルに保存すると、悪意のあるコードがアップロードされる可能性もあるため、情報を保存するためにアップロードまたは作成されたファイルがexecutableサーバーに存在しないようにするための手順を実行する必要があります。(これは、ファイルのアップロードを明確に許可しているようなコードに限定されません:

<input type="file" name="uploadFile">

たとえば、次のような場合にも適用されます。

file_put_contents($uploaded_data);

データの使用

ユーザーがデータを入力できるようにする目的は、ユーザー入力に適用する必要がある保護を決定する上でも役割を果たします。入力はさまざまな理由で使用できますが、主な (または最も一般的な) 理由は次のとおりです。

  1. ユーザーに表示する (例: forum posts、)commentsimages
  2. 現場での計算に使用(例calorie countersinsurance quotes

データがユーザーに表示される場合は、次のような攻撃からの保護とXSS、サイトの視覚的な損傷を防ぐことを考慮する必要があります。どちらも、次のようなタグを挿入することで実行できます。<script>...</script>

一方、データが現在の形式でユーザーに表示されない場合XSSなどは、多少無関係になる可能性があります。

サニタイズ/フォーマットする場合

データのサニタイズは、危険なコードの影響を受ける可能性のあるサーバー側で何かを行う前に処理する必要があります (たとえば、データベースに挿入する前)。

データを使用する直前にサニタイズすることを選択したり、スクリプトを開始するとすぐにコードをサニタイズしたりすることを好む場合があります。ただし、これは主に個人の好みと問題のシステムの使用例に依存します。

ただし、次のような関数をいつ実行するか (つまりhtmlspecialchars、データベースにアップロードする前とユーザーに表示する前)については、しばしば議論があります。これも個人の好みとデータの使用方法に依存しますが、どちらの方法にも長所と短所があります。詳しくは説明しません。

ただし、ユーザー データをraw(ただし安全に) データベースに保存する場合は、時間の経過とともにデータをサニタイズする方法を自由に変更できます。などの関数を使用した後にデータの保存を開始した場合と同様htmlspecialcharsstip_tags、入力から一部のデータを削除/変更していて、後でデータを失ったことに気付くためだけに許可/含めたいと決定する可能性があります。例えば:

strip_tagsはデフォルトで入力からすべてのタグを削除しますが、これは現時点では良いアイデアのように思えますが、さらに下に行くと、<b>またはのようなタグを実際に許可することを決定するかもしれません<i> が、それらは既に入力されている入力には存在しなくなります救われました。

もちろん、フォーマットにyour own mark upor (または同様のもの) を使用している場合は、データベースに保存する前に etc を使用することは完全に合理的です。同様に、プレーン テキストのみを保存する場合は、プレーンでないものをすべて削除することも合理的です。繰り返しますが、それはユースケースに依存します...bbstrip_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 &pound;
                    $_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: &lt;b&gt;Some user input&lt;/b&gt;

echo strip_tags(htmlspecialchars());
    //Output: &lt;b&gt;Some user input&lt;/b&gt;

上記のコード例では、およびシンボルがそれぞれに変換され、削除されないhtmlspecialchars前に実行すると、基本的には役に立たないことがわかります。ただし、最初に実行すると、必要に応じてタグが削除され、その他のその他の.strip_tags<>html codesstrip_tagsspecial chars

于 2013-09-15T15:14:30.723 に答える