PHP 防止“javascript:”链接注入
Posted
技术标签:
【中文标题】PHP 防止“javascript:”链接注入【英文标题】:PHP prevent "javascript:" link injection 【发布时间】:2014-08-20 06:59:12 【问题描述】:我正在制作一个网站,允许用户将用户偏好存储在数据库中,包括链接。
但我意识到,如果用户输入 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>';
如果您知道我该如何解决这个问题,那将非常感激。
【问题讨论】:
他们不能做任何他们通过打开 Javascript 控制台已经不能做的事情。 除非您向不同的用户显示链接而不是设置链接的用户。 强制链接以http
开头。
@Barmar,用户可以添加指向个人页面的链接,如果任何其他用户访问,他们将运行恶意代码;从而允许他们的帐户被黑客入侵。
看看如果您尝试将javascript:something
放在您的 *** 配置文件中的网站地址中会发生什么。
【参考方案1】:
您需要测试链接,可能使用正则表达式,可能是'^https?://'
【讨论】:
【参考方案2】:您应该按协议将网址列入白名单。有太多方法可以通过改变大小写、插入 NUL、BOM、空格字符等来混淆 javascript:
,以便进行简单的测试以可靠地识别所有 javascript:
URL。
如果您只想允许带有协议的 URL
-
http
https
邮寄给
电话
然后您可以针对像这样的正则表达式测试您的输入
/\A(?:https?:\/\/|mailto:|tel:|[^:]*(?:\/|\z))/i
它将传递具有上述协议之一的任何 URL,以及在第一个 /
之前没有冒号的任何相对(或协议相对)URL。
【讨论】:
【参考方案3】:你可以用FILTER_VALIDATE_URL
测试链接
这是一个例子
if(!filter_var($url, FILTER_VALIDATE_URL))
echo "URL is not valid";
else
echo "URL is valid";
【讨论】:
以上是关于PHP 防止“javascript:”链接注入的主要内容,如果未能解决你的问题,请参考以下文章