我想将用户的个人网址作为纯文本存储,并使用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>
- 我的意思是...那简直太荒谬了,一定有更好的方法
mysql_*
函数,它们已被弃用。改用PDO或者mysqli。如果不确定该使用哪个,请阅读这篇SO文章。 - Matt