2009-08-21 8 views
1

PHPでは、PHPページを壊す可能性のある潜在的に有害な文字のリストは何ですか?また、正規表現を使用して、私のすべてのユーザー入力から悪い文字列を除外する方法はありますか?例えば正規表現を作成してPHPで不正な文字パターンを取り除く

...電子メールは、私が下の行使用する有効であるかどうかを確認する:電子メールの特定のパターンのための

preg_match("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$",$email); 

この上記のチェックを。

正規表現を使用して電子メールが有効かどうかを確認する場合と同様に、入力に1つの式を使用して入力に無効な文字パターンが含まれているかどうかを確認するにはどうすればよいですか?私は$_GETまたは$_POSTを受け入れるPHPページの一番上にこの行を置いて、ハッカーのような入力がページをクラッシュさせないようにしたいと思います。

希望はこれが理にかなっています。 ありがとうございます PG

+2

無関係ますが、電子メールを検証するための正規表現が不完全であること:

詳細については、ドキュメントを読んでください。それは、John + [email protected] – VoteyDisciple

+1

+1のVoteyDiscipleのコメントに完全に有効な電子メールアドレスを許可しません。このような不完全な電子メール検証スキームは、私が今までに見つけた最も迷惑な設計決定のいくつかです。 –

+0

あなたは正しいです!フィードバックいただきありがとうございます。問題を解決するためにこれをどのように変更しますか? – pppglowacki

答えて

4

入力が本質的に無効である、または必ずしも悪意を持っていることがないため、説明するように入力をフィルタリングする「唯一の」方法はありません。それは全くあなたのものです入力が重要です。

たとえば、テキストが$_GET['field']にあり、SQLクエリを作成しようとしているとします。あなたはそのようエスケープ(もちろんMySQL用)mysql_real_escape_string()を使用して値を必要とする:

$sql = "INSERT INTO some_table (some_field) VALUES ('" . mysql_real_escape_string($_GET['field']) . "')"; 

このエスケープを使用すると、SQLクエリで使用している入力に適用することが絶対的に不可欠です。ここに示すように適用されると、ハッカーからの悪意のある入力さえもデータベースに悪影響を及ぼすことはありません。

しかし、この機能は、あなたのページの一部のHTML出力に$_GET['field]が含まれている場合は、役に立たなくて、完全にが間違っています。を使用してください。その場合、関数htmlspecialchars()が便利です。

echo "<p>Your comments were: " . htmlspecialchars($_GET['field']) . "</p>"; 

これらの例はどちらも「ハッカーのような入力」からはかなり安全です。悪意のあるデータをデータベースやHTMLに挿入することはありません。しかし、エスケープの2つの形式は完全に異なる機能であり、それぞれがその使用に適していることに注意してください。

これとは対照的に、これらの2つの用途の入力を同時に検証しようとした場合を想像してください。 <または>文字は、クロスサイトスクリプティングのような悪意のあるHTML攻撃の一部である可能性があるため、許可することはできませんでした。だから、「私は1 <と思う」と書いておきたい訪問者は、邪魔されるだろう。同様に、あなたは悪意のあるSQLインジェクション攻撃の恐怖のために引用符を許可することができなかったので、貧しい "Miles O'Brien"は決してあなたのフォームに記入することができませんでした!

適切な入力エスケープは、さまざまなコンテキストで使用すると非常に簡単です(入力の検証よりも簡単です)。しかし、結果はずっと優れています。

+1

+1。ドメイン固有のエスケープは、「特殊」文字を扱う正しい方法です。 「サニタイズ」と「検証」はそうではありません。 – bobince

0

入力を消去する方がはるかに良い方法があります。組み込み関数strip_tagsは高速になります。

関連する問題