Ano*_*ous 11 php regex security url
我想将用户的个人网址存储为纯文本,由htmlspecialchars()编码.
然后我会检索这些数据并生成并显示一个链接,如下所示:
echo '<a href="'.$retrieved_string.'" target="_blank">';
Run Code Online (Sandbox Code Playgroud)
然而,即使使用编码的特殊字符和引号,由于可能插入的javascript,错误链接的示例,href可能不安全:
javascript:alert(document.cookie);
Run Code Online (Sandbox Code Playgroud)
所以我想的是剥离潜在的'javascript'标签(当然我在进行特殊字符编码之前),如下所示:
preg_replace('/^javascript:?/', '', $submitted_and_trimmed_input);
Run Code Online (Sandbox Code Playgroud)
所以让我们完全总结一下:
$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">';
Run Code Online (Sandbox Code Playgroud)
现在的问题是,网址链接是否足够安全,或者是否有其他潜在的意外我应该警惕?
编辑:
我已经阅读了一些关于filter_var()的内容,它似乎在很多方面完全失败了.它不会使用unicode字符验证国际域,然后以下字符串再次成功通过测试:
http://example.com/"><script>alert(document.cookie)</script>
Run Code Online (Sandbox Code Playgroud)
Joh*_*nde 10
尝试使用 filter_var()
filter_var('http://example.com', FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED)
Run Code Online (Sandbox Code Playgroud)
Ano*_*ous -1
这就是我要做的。在我看来最好的方法是在它前面加上 http:
$link=preg_replace('/^(http(s)?)?:?\/*/u','http$2://',trim($_POST['website']));
Run Code Online (Sandbox Code Playgroud)
所以即使剧本到了,我也不在乎。然后实际转换字符:
$link= htmlspecialchars($link, 11,'UTF-8',true);
Run Code Online (Sandbox Code Playgroud)
就是这样。不拐弯抹角,也应该兼容 utf-8。
归档时间: |
|
查看次数: |
21111 次 |
最近记录: |