ユーザーからのコメントをサニタイズ/フィルタリングする最良の方法は?
質問
現在、このプロセスを使用して、ユーザーが入力したコメントをサニタイズ/フィルタリングします-<!> 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.'<'.$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形式をエスケープしてください。