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:”链接注入的主要内容,如果未能解决你的问题,请参考以下文章

mybatis是如何防止SQL注入的

php如何防止sql注入

php中防止SQL注入,该如何解决?

php如何防止sql注入?

PHP怎么防止sql注入

php如何防止sql注入