PHP阻止“javascript:”链接注入

时间:2014-06-29 23:14:16

标签: javascript php security javascript-injection

我正在创建一个允许用户在数据库中存储用户首选项的网站,包括链接。

但我已经意识到,如果用户输入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>';

如果你知道如何解决这个问题,那将会非常受欢迎。

3 个答案:

答案 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:网址。

如果您只想允许带协议的网址

  1. HTTP
  2. HTTPS
  3. 的mailto
  4. 电话
  5. 然后你可以针对像

    这样的正则表达式来测试你的输入
    /\A(?:https?:\/\/|mailto:|tel:|[^:]*(?:\/|\z))/i
    

    将传递任何具有上述协议之一的URL,以及在第一个/之前没有冒号的任何相对(或协议相关)URL。

答案 2 :(得分:1)

您可能需要使用正则表达式测试链接,可能是'^https?://'