web-dev-qa-db-ja.com

php / codeigniterでの入力/出力のサニタイズ

私はWebアプリケーションのセキュリティについて学びながら、進歩を遂げてきました。現在、入力と出力をサニタイズするための戦略を完成させようとしています。

背景:ユーザーはサイトにレビューを送信でき、それらのレビューは特定のビューに表示されます。

1)投稿データ。データを投稿するとき($ this-> input-> post( 'review')を使用)、XSSフィルターを使用することに不安があります。これは、ユーザーデータを削除し、取得できないため、探しています。入力を検証する別の方法。

フォーム検証のために、Codeigniterは " se PHP 1つのパラメーターを許可する関数 を使用する"ことを許可します。それで、strip_tags、htmlentities、htmlspecialcharsなどを使用できます。

質問:これらの関数のどれを使用して、ユーザー入力を検証することをお勧めしますか? (または、XSSの方が優れていると思われる場合)

2)データベースクエリ。私はクエリにCIのアクティブレコードを使用しているため、自動的にエスケープされます(私がこれを考えて処理したことを知っているので)

3)データ出力。出力が表示されるビューがいくつかあります。出力をエスケープする必要があることを知っています。通常は次のようになります。

<?php echo $review; ?>

質問:以下のように、単純にPHP関数を出力に追加しますか、それとも出力が実行されないようにするために何か他にすべきことがありますか?

<?php echo htmlentities($review, ENT_QUOTES); ?>
5
chowwy

OWASPが利用できるリソースを読むことをお勧めします。これは完全に標準的な主題であり、多くのことが書かれています。

サーバーで入力検証を行っていることを確認してください。クライアントがバイパスされる可能性があるため、入力検証を実行するクライアントを信頼しないでください。

入力検証:実行する入力検証の性質は、フィールドの可能な値のタイプと予想される範囲によって異なります。通常、許可される文字のホワイトリストを作成し、入力にそれらの文字のみが含まれていることを確認することになります。または、有効な入力を特徴付ける正規表現を記述し、正規表現と照合します。これは、その入力の値のタイプと予想される範囲に依存する必要があるため、入力ごとに異なる可能性があります。

入力検証と出力エスケープを組み合わせる必要があります。出力エスケープの適切な形式は、データが出力に挿入される場所によって異なります。たとえば、タグ間でHTMLドキュメントにデータを挿入する場合は、htmlspecialcharsを使用してデータをエスケープしてから、HTMLドキュメントに挿入します(クロスサイトスクリプティングを防止するため)。一方、URLを挿入する場合は、ホワイトリストに登録されているプロトコルのセットの1つを使用していることも確認する必要があります(例:http:、https :; javascript:ではありません)。

4
D.W.

_#1_については、ポストされた値をいつでも取得して、後で関数を適用できます。あなたが使用できる2つの可能性があります(しかし確かにもっとあります):

  1. PHP組み込み filters を使用します。ほとんどの場合、文字列を確実に保護する_FILTER_SANITIZE_STRING_です。
  2. HTML Purifier を使用できます。ユーザーのデータを削除せずにXSSを保護します。

今、それは本当にあなたがそれらの提出されたデータをどうするかによります。 IDをIntegerとして検証するだけの場合は、検証フラグを指定した_filter_var_で十分です。ユーザーがレビューのためにhtmlを送信したくない場合は、サーバー側(データベースに追加する前)または htmlspecialchars() を使用します。ビュー側(文字列を表示する場合、別名_#3_)。

_#2_:正しくやりました。追加するものはありません;)

_#3_:@ D.Wと同様。完全に答えました。htmlspecialchars()はHTML出力に最適であり、出力場所(url、json、xml/htmlなど)に関して出力内容を適応させる必要があります。

2
Cyril N.