15

現時点では、前述の問題を阻止するために「壁にすべてを投げて、何がくっつくかを確認する」方法を適用しています。以下は、私がまとめた関数です。

function madSafety($string)
{

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

}

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

皆さんはどのような方法を採用しており、どの程度成功していますか? ありがとう

4

4 に答える 4

36

あなたが本当に理解していない多くのことをするだけでは、あなたを助けるつもりはありません。インジェクション攻撃とは何か、正確にどのように、どこで何をすべきかを理解する必要があります。

箇条書き:

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

参照:PHPでユーザー入力をサニタイズするための最良の方法は何ですか?

于 2009-02-20T10:52:58.240 に答える
10

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

于 2009-02-20T10:21:00.627 に答える
3

しないでください!を使用mysql_real_escape_stringするだけで SQL インジェクションから保護できstropslashesますが、後で実行すると SQL インジェクションに対して脆弱になります。本当に欲しい場合は、次のように前に置きます。

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

stripslashesあなたがやっているなら、本当に役に立ちませんmysql_real_escape_string

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

注意すべき重要なことは、文字列の直接の用途に応じて、異なる方法で文字列をエスケープする必要があるということです。

MYSQL リクエストを実行しているときは、mysql_real_escape_string. Web ページを出力するときは、 を使用しますhtmlentities。Web リンクを作成するには、urlencode…を使用します。</p>

vartec が指摘したように、プレースホルダーを使用できる場合は必ず使用してください。

于 2009-02-20T10:16:23.833 に答える
1

この話題は大間違い!

ユーザーの入力をフィルタリングしないでください。彼が入力した情報です。パスワードを次のようにしたい場合、あなたはどうしますか?'"'>s3cr3t<script>alert()</script>

文字をフィルタリングしてパスワードを変更したままにしておくと、最初のログインでさえ成功できませんか? これは悪いです。

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

Web は、ユーザーが入力した情報を表す方法の 1 つにすぎないことを思い出してください。一部のデスクトップソフトウェアがそれを行う場合、そのようなストリッピングを受け入れますか? あなたの答えが NO であることを願っています。

異なるコンテキストでは、異なる文字をエスケープする必要があることに注意してください。たとえば、ユーザーの名をツールチップとして表示する必要がある場合は、次のように使用します。

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

しかし、ユーザーが自分の名前を次のように設定した場合、'"><script>window.document.location.href="http://google.com"</script>あなたはどうしますか? 引用符を削除しますか?これはとても間違っているでしょう!この無意味なことをする代わりに、データを永続化するときではなく、データをレンダリングするときに引用符をエスケープすることを検討してください!

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

繰り返しになりますが、使用しているコンテキストに応じてデータをエスケープすることを検討してください!

PSこれらの否定的な投票にどのように反応するかはよくわかりません。皆さん、私の返事を実際に読んでいますか?

于 2013-11-01T13:01:06.230 に答える