12

我想将用户的个人网址存储为纯文本,由 htmlspecialchars() 编码。

然后我会检索这些数据并生成并显示一个链接,如下所示:

echo '<a href="'.$retrieved_string.'" target="_blank">';

然而,即使使用编码的特殊字符和引号,href 也可能不安全,因为可能插入了 javascript,错误链接的示例:

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 回答