ユーザーからのコメントをサニタイズ/フィルタリングする最良の方法は?

StackOverflow https://stackoverflow.com/questions/1446431

  •  22-07-2019
  •  | 
  •  

質問

現在、このプロセスを使用して、ユーザーが入力したコメントをサニタイズ/フィルタリングします-<!> gt;
これはスラッシュを取り除くために使用されます...および

 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;
                    }
            }
        }

これが十分に安全かどうか、または他の優れた代替品かどうかを知りたいだけです...ありがとう

役に立ちましたか?

解決

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

独自のコードを作成する場合は、少なくとも ha.ckers.org xss smoketestsを実行しますそれに対して

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

他のヒント

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

別の解決策は、準備済みステートメントを使用することです( mysqli::prepare および/または PDO::prepare -これらは、古いmysql_*拡張機能)、あなたの場所でのデータのエスケープを処理します;-)


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

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

最初の解決策または最後の解決策のいずれかを使用します。あなたはもっと<!> quot;危険な<!> quot;を感じます。 -しかし、それはただの感覚です^^ (一般的な考えは<!> quot;車輪を再発明しないでください<!> quot;)

引用符でgetパラメーターを作成する場合、キーも削除する必要がありますが、魔法の引用符の処理は問題ありません。 :)

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

<!> quot; DB <!> quot;へのストレートに関しては、バインドされたパラメーターで、確かに素晴らしいです。バインドされたパラメーターには何でも安全に入力できます。引用符付きの文字列では、結果をエスケープしていることを願っています。

データベースに配置するときにすべての文字をエスケープします。取得して表示するときは、コードとして扱われる代わりに表示されるように、<sometag>などのhtml形式をエスケープしてください。

PHPにはほとんど知られていませんが、強力な組み込みの衛生機能があります。使用することをお勧めします:

PHPの入力フィルタリング

filter_input および filter_var

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top