2009-03-18 8 views
34

filter_varはデータのフィルタリングに適していますか?どのような種類の不良データがフィルタリングされますか?私はmysql_real_escape_stringを使用しますが、filter_varを追加すると役に立ちますか?filter_varは良い方法ですか?

+1

なぜこれが下降したのかわからない – Ross

+2

XSSとSQLインジェクションが何であるか、そしてなぜそれらを防ぐためにミラクル機能を要求するのではなく、なぜ可能かを理解してください。 – Gumbo

+2

何を手伝ってくれますか?あなたはfilter_varが達成することを望んでいることを何をしようとしていますか? – jmucchiello

答えて

23

可能であれば、準備されたステートメントを使用して防御してください。そうでない場合は、文字列にはmysql_real_escape_string、整数の場合は(int)、整数の場合はint(int)、浮動小数点数の場合はfloat(float)、LIKE文で使用する文字列の場合はaddcslashes($ input、 '%_')を使用します。 RLIKE文の中で使用される文字列をエスケープしようとすると、さらに複雑になります。

$escaped = htmlspecialchars($input, ENT_QUOTES, $your_charset); 

A:それは、その場合には、最も手頃な価格のソリューションである、欲しい

は、フィルタリングHTMLコンテンツでは、最高のは、($ allowable_tagsを介さずに)strip_tagsだろう、しかし...あなたは/好きではないことより信頼性の高いソリューションは、次のようなライブラリを使用することです。HTML Purifier

フィルタ関数はOKですが、フィルタのバリデータはフィルタよりも多くあります。あなたのニーズに応じて、それらのいくつかが役に立つかもしれません。

+4

htmlspecialchars()は、テキストをHTMLに出力するための適切な処理です。正当な '<'文字をテキストに使用する場合、strip_tags()はコンテンツを失い、適切に '&'を表示しません。 – bobince

1

本当にあなたがしようとしていることに依存しています。具体的なことを知らずには本当に答えられません。考えられるフィルターとその効果は、次のとおりです。Types of filters

+0

基本的に、ユーザーの入力から生じるxssまたはmysqlの攻撃をフィルタリングして検証します。 – mikelbring

+0

XSSとSQLインジェクションの方法が多すぎます(http://ha.ckers.org/xss.html)。すべてがアプリケーションによってユーザーデータの処理方法に依存します。 – Gumbo

17

filter_varFILTER_* constantsと組み合わせて調整します。 validation(データのチェックは安全です)ではなく、sanitisationのデータ(実際には安全にするためにデータを調整する*)を探しているようです。

さまざまなフィルタは、さまざまなタスクに役立ちます。 mysql_real_escape_stringはSQLインジェクションを防ぐためにデータをサニタイズしても問題ありませんが、HTMLを含む可能性のあるデータを出力するのは良くありません。 - 、(削除しない)HTMLコードを表示するXSS攻撃を阻止し、HTMLエンティティにシンボルを変換するのに有用な

  • FILTER_SANITIZE_SPECIAL_CHARS:ここで私は日常的なタスクのために使用したいフィルタののカップルです。
  • FILTER_SANITIZE_STRINGSTRIP_LOW/HIGHフラグ - 実際にはHTMLを削除します(strip_tags参照)。
  • FILTER_SANITIZE_URL - URLを安全にする*。
  • FILTER_SANITIZE_EMAIL - 電子メールアドレスを安全にすることができますが、アドレスを保存する前に検証の同僚を使用することをお勧めします。

私が緩く安全な使用*、私はあなたがあまりにも確認することはできません意見です。

-5

ちょっと小さなテストに基づいて、filter_varの定数は信頼できないという結論に至りました。例えば

filter_var('[email protected]', FILTER_VALIDATE_EMAIL); // valid 
filter_var('http://.', FILTER_VALIDATE_URL); // valid 
filter_var('[email protected]', FILTER_SANITIZE_EMAIL); // [email protected] 
filter_var('http://.', FILTER_SANITIZE_URL); // http://. 

は、これらは明らかに無効な値ですが、filter_varの定数を渡します。 filter_varを信用しないでください。

+4

サニタイズは、検証と同じではありません。 –

+0

@Mathew、あなたは正しいと思いますが、私が指摘した 'filter_var'の問題とは何が関係しているのか分かりません。それは、私が提供した入力を正確にフィルタリングしたり、適切にサニタイズしたりすることはありません。 – eyelidlessness

+13

http://tools.ietf.org/html/rfc822で見ることができる限り、電子メールアドレスは正しく定式化されています。特に、 'c'は新しいTLDとして登録され、' b- 'はそのドメイン(' --'は有効な文字です)に登録されます。そこに問題はないと思う。 '!def!xyz%abc + tag @ [127.0.0.1]'は有効なアドレスではありませんか? (私は思っていません - それは不思議ではありません) ドメイン名の例はすばやく表示されませんでしたが、 'dig。'は妥当な応答を示し、 'stackoverflow.com.' 'stackoverflow.com'と同じipを返します(最初のurlの末尾のドット)。私はこの中で 'filter_var'とPHPに同意します。 – Iiridayn

2

すべては、有効なURLまたは有効なメールの意味によります。

たとえば、[email protected] - よく、トップレベルドメインをフィルタリングして.cを除外できますが、トップレベルドメインのリストは定数ではありません。さらに、すべての文字が有効です。これは奇妙に見えますが、ほぼ確実に有効ではありませんが、多くの正規表現フィルタもそれを検証します。

メールで[email protected]またはURL http://.を表示またはリンクで使用すると、どこにもいなくても害はありません。

私は問題の一部があなたのフィルタをどの程度緩めているのかという疑問だと思います。大きな懸念がXSSまたはSQLインジェクションである場合、または危険な入力を防止する場合、値が有用であるかどうかは関係ありませんので、この種のフィルタがトリックを行う可能性があります。

値が安全であるだけでなく使用可能であることを確認したい場合は、それはより厄介な獣です。

関連する問題