2

私は現在、このプロセスを使用して、ユーザーが入力したコメントをサニタイズ/フィルターします->
これはスラッシュを削除するために使用されます...そして

 if (get_magic_quotes_gpc()) {
        function stripslashes_deep($value)
        {
            $value = is_array($value) ?
                        array_map('stripslashes_deep', $value) :
                        stripslashes($value);

            return $value;
        }

        $_POST = array_map('stripslashes_deep', $_POST);
        $_GET = array_map('stripslashes_deep', $_GET);
        $_COOKIE = array_map('stripslashes_deep', $_COOKIE);
        $_REQUEST = array_map('stripslashes_deep', $_REQUEST);
    }

次に、コメントはこの関数を通過してデータをサニタイズします...

   function my_strip_tags($str) {
                $strs=explode('<',$str);
                $res=$strs[0];
                for($i=1;$i<count($strs);$i++)
                {
                    if(!strpos($strs[$i],'>'))
                        $res = $res.'&lt;'.$strs[$i];
                    else
                        $res = $res.'<'.$strs[$i];
                }
             return strip_tags($res);   
    }

この後、プリペアドステートメントを使用してデータベースに直接入ります。

function add_comment($comment,$type,$update_id,$user_id){
            $query="INSERT INTO comment_updates (updateid,userid,comment) VALUES(?,?,?)";
                if($stmt=$this->conn->prepare($query)) {
                $stmt->bind_param('sss',$update_id,$user_id,$comment);
                $stmt->execute();
                    if($this->conn->affected_rows==1){
                    $stmt->close();
                    return true;
                    }
            }
        }

これが十分に安全かどうか、または他のより良い選択肢があるかどうかを知りたかっただけです...ありがとう

4

5 に答える 5

5

データベースにデータを格納することを考えるときに最も重要なことは、データをエスケープすることです。mysql_real_escape_string、またはmysqli_real_escape_string、またはを使用して、使用PDO::quoteしている DB (または oracle/pg/... の他の関数)に応じて

別の解決策は、準備されたステートメントを使用することです(mysqli::prepareand/or PDO::prepare-- これらは古い拡張機能ではサポートされていませんmysql_*)。これにより、場所でのデータのエスケープが処理されます;-)


HTML 出力について考えるとき、次の 2 つの解決策があります。

  • HTML を受け入れ、HTMLPurifierなどのライブラリを使用してフィルタリング/クリーンアップします。許可されるタグと属性を正確に指定できるようになり、出力としてクリーンで有効な HTML が得られます。
  • あなたがやっているように、HTMLを削除してみてください-常にうまくいくとは限りません(特別なケースを忘れたらどうなりますか?)
  • htmlentitiesまたはhtmlspecialchars:を使用して HTML をエスケープします。

最初または最後の解決策のいずれかを使用します。あなたの方が「危険」だと感じます -- しかし、それはただの感覚です ^^ (一般的な考え方は「車輪を再発明するな」です)

于 2009-09-18T19:35:42.997 に答える
3

独自の HTML サニタイザーを作成しないでください。XSS ホールを作成します。

自分で書くつもりなら、少なくともそれに対してha.ckers.org xss Smoketestsを実行してください。

これらのテストと、フィルターの htmlpurifier の比較の間に、html のサニタイズがいかに複雑であるか、そしてなぜプロに任せるべきかを理解できるはずです。

于 2009-09-18T19:47:20.640 に答える
0

魔法の引用符の処理は問題ありませんが、引用符を使用してgetパラメーターを作成する場合は、キーもストリップスラッシュする必要があります。:)

ストリップタグに関しては、実際のHTMLフィルターライブラリを使用したほうがよいでしょう。htmlには非常に多くの紆余曲折があり、一度作成したものを信頼して忘れてはいけません。人々はそれらのHTMLフィルターを作るのに時間を費やすので、あなたの利益のために彼らの仕事を使ってください。

「DBにまっすぐに」に関しては、バインドされたパラメーターで、確かに、それは素晴らしいことです。バインドされたパラメータには何でも安全に入れることができます。引用符付きの文字列で、結果をエスケープしていることを願っています。

于 2009-09-18T19:32:52.940 に答える
0

データベースに入れるときにすべての文字をエスケープします。<sometag>取得して表示するときは、コードとして扱われる代わりに表示されるように、HTML フォーマットをエスケープするようにしてください。

于 2009-09-18T19:43:54.423 に答える
0

PHP には、ほとんど知られていませんが、強力なサニテーション機能が組み込まれています。それらを使用することをお勧めします:

PHP での入力フィルタリング

filter_inputfilter_var

于 2009-09-19T00:54:45.020 に答える