PHP安全性 - 结合strip_tags()的功能; &安培;用htmlspecialchars();

时间:2012-11-01 17:45:11

标签: php html security xss

我希望我的论坛用户能够插入链接和其他允许的标签。例如,我想在帖子中显示以下HTML作为作者的意图(即作为一个有效的链接):

<a href="http://www.example.com" rel="nofollow">A page</a>

但是,我希望保持一定程度的安全性并且已经在strip_tags()和htmlspecialchars()上阅读。我一开始以为我可以使用strip_tags,例如:

<?php $link_string = strip_tags($link_string, '<a>'); ?>

但是如果我理解正确的话,strip_tags并没有像htmlspecialchars那样保护我。例如,使用特殊字符的错误HTML代码可能会让我感到脆弱。链接标记的样式和onmouseover属性也是如此。

什么是 简单 解决方案,以便在清除可能有害的字符和代码时允许帖子中的上述链接?无论如何,我可以将这两个PHP函数结合起来以 简单 方式执行此操作吗?

2 个答案:

答案 0 :(得分:1)

您几乎需要使用功能齐全的HTML解析器和清理程序。整个工作流程如下:

  1. 用户输入他们的HTML
  2. 您使用解析器解析它
  3. 通过仅保留您想要的内容(<a>标记,但要警惕onclick属性以及类似内容来消毒所解析的内容。

  4. 您可以查看HTML Purifier,如果它不符合您的需求,HTML Purifier网站会有comparison of other PHP sanitizers。我相信默认的HTML Purifier配置会保留链接。


    强制性参考:please refrain from using regex to parse HTML

答案 1 :(得分:0)

我建议使用stripslashes(),如果这是一个数据库,也是mysql_real_escape_string()。

// without SQL.
       function safeData($data) {
        $returnData = stripslashes(strip_tags(htmlspecialchars(trim($data))));
        return $returnData; 
    }

// with SQL.
       function safeDataMySQL($data) {
        $returnData = mysql_real_escape_string(stripslashes(strip_tags(htmlspecialchars(trim($data)))));
        return $returnData; 
    }