我正在创建一个允许用户在数据库中存储用户首选项的网站,包括链接。
但我已经意识到,如果用户输入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>';
如果你知道如何解决这个问题,那将会非常受欢迎。
答案 0 :(得分:3)
您可以使用FILTER_VALIDATE_URL
这是一个例子
if(!filter_var($url, FILTER_VALIDATE_URL))
{
echo "URL is not valid";
}
else
{
echo "URL is valid";
}
答案 1 :(得分:2)
您应该按协议将URL列入白名单。通过改变大小写,插入NUL,BOM,空格字符等来混淆javascript:
的方法太多,无法通过简单的测试来可靠地识别所有javascript:
网址。
如果您只想允许带协议的网址
然后你可以针对像
这样的正则表达式来测试你的输入/\A(?:https?:\/\/|mailto:|tel:|[^:]*(?:\/|\z))/i
将传递任何具有上述协议之一的URL,以及在第一个/
之前没有冒号的任何相对(或协议相关)URL。
答案 2 :(得分:1)
您可能需要使用正则表达式测试链接,可能是'^https?://'