2009-02-20 7 views
15

現時点では、私は「壁にすべてを投げ、前述の問題を止める方法を見ます」を適用します。以下は、私が一緒に石畳を結んだ機能です:mysqlインジェクションとクロスサイトスクリプティングを防御する最良の方法

function madSafety($string) 
{ 

$string = mysql_real_escape_string($string); 
$string = stripslashes($string); 
$string = strip_tags($string); 
return $string; 

} 

しかし、私はこれを行うより良い方法があると確信しています。私はFILTER_ SANITIZE_STRINGを使用していますが、これは完全に安全ではないようです。

私はあなたにどのメソッドを採用していますか、どれくらい成功しているのかと聞いていますね。ありがとう

+0

dupe:http://stackoverflow.com/questions/129677/whats-the-best-method-for-sanitizing-user-input-with-php – troelskn

+0

このアプローチは非常に多くの面で間違っています!私は以下の回答を掲示して、それぞれの回答を評価した。 –

答えて

33

あなたが本当に理解していないたくさんのことをやっているだけで、あなたを助けるつもりはありません。あなたは注射の攻撃が何であるか、そしてどこで何をすべきかを正確に理解する必要があります。箇条書きで

  • Disable magic quotes。彼らは不十分な解決策であり、問​​題を混乱させます。
  • 文字列をSQLに直接埋め込まないでください。バインドされたパラメータを使用するか、エスケープする(mysql_real_escape_stringを使用)。
  • データベースからデータを取得するときにunescape(例:stripslashes)を実行しないでください。
  • 文字列をhtmlに埋め込むと(たとえば、echoの場合)、デフォルトの文字列(htmlentitiesを使用してENT_QUOTESを使用)をエスケープする必要があります。
  • html文字列をhtmlに埋め込む必要がある場合は、文字列のソースを考慮する必要があります。信頼できない場合は、フィルターを通す必要があります。 strip_tagsは理論的には使用すべきものですが、欠陥があります。代わりにHtmlPurifierを使用してください。

も参照してください:What's the best method for sanitizing user input with PHP?

+0

優秀 - これは私が書いていたレスポンスよりもはるかに優れていて、今放棄されています。 +1 –

+0

私たち全員に本当に素晴らしいリマインダ:) +1 – itsols

2

を実行しないでください! mysql_real_escape_stringを使用するとSQLインジェクションからあなたを守ることができます。 の後にはSQLインジェクションに脆弱です。あなたがmysql_real_escape_stringを行っている場合は本当に便利ではありません

function madSafety($string) 
{ 
    $string = stripslashes($string); 
    $string = strip_tags($string); 
    $string = mysql_real_escape_string($string); 
    return $string; 
} 

stripslashes:あなたは本当にそれをしたい場合は、のように前を置きます。

strip_tagsは、SQLではなくHTML/XMLインジェクションから保護します。

重要な注意点は、文字列を別の方法でにエスケープする必要があることです。

MYSQLリクエストを実行するときにmysql_real_escape_stringを使用してください。 Webページを出力するときは、htmlentitiesを使用してください。ウェブリンクを作成するにはurlencodeを使用してください。

vartecに記載されているように、是非プレースホルダを使用できます。

+5

実際、mysql_real_escape_stringは完全に安全ではありません。 http://ilia.ws/archives/103-mysql_real_escape_string-versus-Prepared-Statements.html –

9

SQLインジェクションに対する最良の方法は、変数をバインドして文字列に「注入」するのではなく、 http://www.php.net/manual/en/mysqli-stmt.bind-param.php

+0

許容タグを慎重に検討してください。タグにはJSが埋め込まれている可能性があります。 –

+0

また、http://isisblogs.poly.edu/2008/08/16/php-strip_tags-not-a-complete-protection-against-xss/ –

+0

strip_tagsには誤りがあります。エスケープ文字列、または本当に必要な場合htmlpurifierを使用するには – troelskn

0

このトピックはとても間違っています!

ユーザーの入力をフィルタリングしないでください。彼によって入力された情報です。 '"'>s3cr3t<script>alert()</script>

文字をフィルタリングしてパスワードを変更したままにしておくと、最初のログインでもうまくいかない場合がありますか?これは悪いです。

適切な解決策は、準備された文またはmysql_real_escape_string()を使用してSQLインジェクションを回避し、文字コードのコンテキストエスケープを使用してHTMLコードが乱されないようにすることです。

ウェブは、ユーザーが入力した情報を表現する方法の1つに過ぎないことをお伝えします。デスクトップソフトウェアによってはそのようなストリッピングを許可しますか?私はあなたの答えがNOであり、これが正しい方法ではない理由を理解することを願っています。

異なるコンテキストで異なる文字をエスケープする必要があることに注意してください。ユーザーはあなたが何を行うつもりされている'"><script>window.document.location.href="http://google.com"</script>ようになり、彼の最初の名前を設定している場合、しかし、

<span title="{$user->firstName}">{$user->firstName}</span> 

:あなたがツールチップとしてユーザの名を表示する必要がある場合たとえば、あなたはのようなものを使用しますか?引用符を削除しますか?これは間違っているだろう!これを非意味にするのではなく、データを表現している間に引用符をエスケープすることを考えてください。

値自体をレンダリングする際に考慮する必要があるもう1つのコンテキスト。以前に使用されたhtmlコードを考えて、ユーザーのファーストネームが<textarea>であると想像してください。これは、このtextarea要素に続くすべてのhtmlコードをラップして、ページ全体を分割します。

もう一度 - 使用しているコンテキストに応じてデータをエスケープすることを検討してください。

P.Sこれらの否定的な投票にどのように反応するかはわかりません。私の返信を実際に読んでいるのですか?

+0

私のコメントを削除する代わりに、私が言っていたことを理解しようとしてください。ユーザーがタグを削除しないようなタグを持つユーザー名を持っていた場合、私はユーザー名を完全に拒否し、より少ないユーザー名を思いつくように強制します。パスワードは異なっていますが、ユーザ名には「

関連する問題