12

ユーザーの個人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>
  • 私は一般的なことを意味します...それはただばかげています、より良い方法があるに違いありません
4

2 に答える 2

11

使ってみてくださいfilter_var()

filter_var('http://example.com', FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED)
于 2012-08-02T15:36:04.053 に答える
-2

これが私がやる方法です。私には、httpを前に付けるのが最善の方法だと思います。

$link=preg_replace('/^(http(s)?)?:?\/*/u','http$2://',trim($_POST['website']));

ですから、スクリプトがそこに到達したとしても、私はそれほど気にすることはできませんでした。次に、実際に文字を変換します。

$link= htmlspecialchars($link, 11,'UTF-8',true);

それでおしまい。茂みの周りを叩くことはありません。また、utf-8互換である必要があります。

于 2012-08-02T18:54:48.933 に答える