ユーザーの個人URLを、htmlspecialchars()でエンコードされたプレーンテキストとして保存したいと思います。
次に、このデータを取得し、次のようにリンクを生成して表示します。
echo '<a href="'.$retrieved_string.'" target="_blank">';
それでも、エンコードされた特別な文字と引用符を使用しても、JavaScriptが挿入されている可能性があるため、hrefは安全ではない可能性があります。
javascript:alert(document.cookie);
したがって、私が考えているのは、次のように、潜在的な「javascript」タグを取り除くことです(もちろん、特別な文字のエンコードを行う前に)。
preg_replace('/^javascript:?/', '', $submitted_and_trimmed_input);
それで、それをまとめてみましょう:
$input=htmlspecialchars(preg_replace('/^javascript:?/', '', trim($_POST['link'])),11,'UTF-8',true);
mysql_query("update users set link='".mysql_real_escape_string($input)."'");
//And retrieving:
$query=mysql_query("select link from users");
$a=mysql_fetch_assoc($query);
echo '<a href="'.$a['link'].'" target="_blank">';
さて、問題は、URLリンクを安全にするのに十分でしょうか、それとも私が注意しなければならない他の潜在的な驚きはありますか?
編集:
filter_var()について少し読んだことがありますが、多くの点で完全に失敗しているようです。Unicode文字を使用して国際ドメインを検証しない場合は、次の文字列がテストに合格します。
http://example.com/"><script>alert(document.cookie)</script>
- 私は一般的なことを意味します...それはただばかげています、より良い方法があるに違いありません