如何清理用户提交的网址?

时间:2012-08-02 15:34:33

标签: php regex security url

我想将用户的个人网址存储为纯文本,由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">';

现在的问题是,网址链接是否足够安全,或者是否有任何其他潜在的意外我应该警惕?

修改

我已经阅读了一些关于filter_var()的内容,它似乎在很多方面完全失败了。它不会使用unicode字符验证国际域,然后以下字符串再次成功通过测试:

http://example.com/"><script>alert(document.cookie)</script>
  • 我的意思是共同的...那只是荒谬的,必须有更好的方式

2 个答案:

答案 0 :(得分:10)

尝试使用filter_var()

filter_var('http://example.com', FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED)

答案 1 :(得分:-2)

这就是我要去做的事情。它看起来最好的方法是用http:

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

所以,即使脚本到达那里,我也不在乎。然后实际转换字符:

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

就是这样。没有在灌木丛周围跳动,也应该是utf-8 compat。

相关问题