我正在制作一个允许用户在数据库中存储用户偏好的网站,包括链接。
但是我已经意识到,如果用户输入javascript: // Malicious code here
,他们可以在页面上执行任何javascript,包括获得会话ID的能力。
(链接显示给其他用户,因此我想防止这种情况发生)
我已经尝试了以下方法来防止这种情况,但它们都不起作用:
htmlentities()
htmlspecialchars()
strip_tags()
addslashes()
快速示例:
$link = // queried from the database.
$title = // queried from the database.
echo '<a href="'. $link .'">'. $title .'</a>';
如果你知道我怎么能解决这个问题,我将非常感激。
可以用FILTER_VALIDATE_URL
测试链接
下面是一个例子
if(!filter_var($url, FILTER_VALIDATE_URL))
{
echo "URL is not valid";
}
else
{
echo "URL is valid";
}
您应该按协议将url列入白名单。有太多的方法来混淆javascript:
通过不同的情况下,插入null, bom,空格字符等一个简单的测试,以可靠地识别所有javascript:
url。
如果你想只允许带有协议
的url- http
- https
- mailto
- 电话
,那么您可以根据
之类的正则表达式测试您的输入。/'A(?:https?:'/'/|mailto:|tel:|[^:]*(?:'/|'z))/i
,它将传递任何具有上述协议之一的URL,以及任何在第一个/
之前没有冒号的相对(或协议相对)URL。
您需要测试链接,可能使用正则表达式,可能是'^https?://'