2009-04-01 18 views
0

投稿フォームからテキストボックスデータを取得するためのPHPスクリプトを作成しています。これらは単純なテキストボックスであり、私はHTMLタグを受け入れたくありません。私は少なくともstrip_tags()とaddslashes()を使うべきだと思います。他に何か?非正規文字を探すために正規表現を使用する必要がありますが、入力を英数字に制限しても構いません。HTMLフォームのテキストフィールドで何を確認する必要がありますか?

これは実際に処理している人に電子メールを送信する簡単な形式です。 (悲しいことに、データベースはありません)。そしてそれはシンプルなデータです。

編集: また、私が探しているものを具体的に知りたいと思います。合理的な入力フィルタリングについてのコンセンサスは何ですか?

+0

私はCornifyがすごくクールだと思います。 – lynn

+0

あなたは入力として姓と名を使用していますか?そうであれば、正規表現は妥当性を判断する素早い方法になります。有効な文字や数字を確認するだけです。 – Mark

答えて

6

PHP filter functionsを使用してください。

入力の墨塗りや入力の検証(電子メールアドレスなど)に使用できます。

検証には2つの方法があります(これはセキュリティとその他の多くの点にも当てはまります)。

まず、明示的に許可されていないもの以外のものを許可するようにデフォルト設定できます。あるいは、特に許可されているもの以外のすべてを許可しないようにすることもできます。

一般的に言えば、後者のアプローチはより安全であり、魅力的な理由がない場合を除いて使用する必要があります(たとえば、許可されているものを知ることが難しい場合などです。セキュリティ上の脅威とみなされるなど)。

ただし、これは注意して使用する必要があります。人々の名前のために、 'と - のような文字は完全に有効ですが、純粋な実装はそれらを制限するかもしれません。あなたは、一般的に避けたいことです:

  • SQLインジェクション:任意の入力に常に使用mysql_real_escape_string()
  • XSS(クロスサイトスクリプティング):一般に、ユーザー入力からHTMLタグを取り除く必要があります。あなたはもちろんそれらを許可する必要があるでしょう(例えば、リッチテキストエディタボックス)。そのような場合でも、許可するタグのリストを持ち、他のすべてのもの(特にタグ)を取り除く必要があります。
  • あなたは、低い文字(ASCII 20?以下)を取り除く必要があります。
  • 国際化の要件に応じて、上位文字(ASCII 127以上)を取り除きたい場合があります。使用する

良いデフォルト値は次のとおりです。

$var = filter_var($var, FILTER_SANITIZE_STRING); 

が、状況に応じて、右のフィルタを選択します。

+0

ありがとうございます。でも、私が探しているものを具体的に知りたいです。合理的な入力フィルタリングについてのコンセンサスは何ですか?それに応じてオリジナルの質問を編集する。 – lynn

1

これはあまり明確な答えではありませんが非常によくある質問です。 addslashes()のような関数は、実際にはいくつかの設定で良いよりも多くの害を及ぼすことがあります。ユーザーの入力を扱うときに従うべきいくつかの基本的な規則は、何も信頼していないし、あなたが期待している形式でない場合は、エラーを発生させようとしないでください。

英数字のみが必要な場合は、単純な正規表現で処理しますが、もう少し情報が役立ちます。

データで何をやっていますか?ユーザーがフォームを送信したり、フォームを処理したり、後で(コメントエンジンのように)表示するためにDBにデータを格納したりするなど、入力をどのように処理していますか(または計画していますか)。

編集:人間が処理するために電子メールでテキストボックスを送信するのと同じくらい簡単です。私の最大の懸念事項は、XSSとSMTPヘッダーインジェクション(電子メールの送信方法によって異なります)です。試してみて、最も単純な解法を使ってください。英数字のデータを受け取る必要がある場合は、正規表現を使用し、それを受け入れてください。 ENT_QUOTESでhtmlentitiesを使用する方法もあります。

+0

実際に(ugh)それを処理する人に電子メールを送信するシンプルなフォーム。そしてそれはシンプルなデータであり、姓と名義のものです。 (編集の質問です。) – lynn

1

私はHTMLタグを受け入れたくありません。私は、使用strip_tags()は多分

、それだけ少ないよりも、より大きな、より意味するものではありませあなたは、人々が「< 『/』>」文字を入力できるようにしたい場合、私は、少なくともすべきだと思う、と「ARENタグとは関係ありません。

フリーテキストフィールドの入力時には、改行文字以外の制御文字(通常はどこでも望んでいない)よりもはるかにフィルタリングする必要はなく、UTF-8を使用している場合は、無効/冗長シーケンス。 「& LT;」あなたは出力バックページへの値は、あなたが、もちろん「<」ように逃げますはhtmlspecialchars()を使用するように覚えているでしょうとき

はその後、右、画面上の「<」リテラルとして表示されます?フォームの送信、データベース、その他のどこから来たものであっても、テンプレートのHTMLにテキスト値を出力するときはいつでも、htmlspecialchars()を使用する必要があります。

すべての入力を特定の制限付きフォーマットに一致させる非フリーテキストフィールドの場合は、正規表現を使用して一致させることができます。

とaddslashes()です。

ほとんどの場合、addslashes()は間違ったことです。経験則として、これを使わないでください。

addslashes()は実際のSQL文字列リテラルエスケープ形式と一致しないため、SQLエスケープには不十分です。したがって、addslashedのときでも危険な文字列を構築できます。 MySQLを使用している場合は、代わりにmysql_real_escape_string()を使用する必要があります。他のデータベースには、独自のエスケープ機能があります。それらを使用する(または、パラメータ化されたクエリを使用すると、テキストをSQLに手動でエスケープする必要がなくなります)。

出力 - に対処しようとしてどのような場合には(にaddslashes()それがすべてでHTMLの特殊文字で何かをしようとしないので、エスケープHTMLには不十分である。それはそれがために何ではありません。)

、入力フィルタリング段階でエスケープするのは後方です。代わりに、アプリケーションの内部にあるすべての文字列をプレーンテキストとして保持し、アプリケーションの途中でエスケープします:mysql_real_escape_stringがSQLクエリに参加するときに出かけるとき、htmlspecialchars() HTMLページへの出力などがあります。

関連する問題