【问题标题】:PHP Security - Combining functionality of strip_tags(); & htmlspecialchars();PHP 安全性 - 结合 strip_tags() 的功能; & htmlspecialchars();
【发布时间】:2012-10-22 08:54:46
【问题描述】:

我希望我的论坛用户能够插入链接和其他允许的标签。例如,我希望帖子中的以下 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 代码会使我容易受到攻击。 link 标签的 style 和 onmouseover 属性也是如此。

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

【问题讨论】:

    标签: php html security xss


    【解决方案1】:

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

    1. 用户输入他们的 HTML
    2. 你用解析器解析它
    3. 您可以通过仅保留您想要的内容(&lt;a&gt; 标记,但要警惕 onclick 属性等类似内容)来清理已解析的内容。

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


    必填参考:please refrain from using regex to parse HTML

    【讨论】:

    • 当你说要提防那些属性,我该如何执行疲倦?
    • 您只需要检查文档以验证默认配置是否将它们剥离! :-)
    【解决方案2】:

    我建议使用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; 
        }
    

    【讨论】:

    • 虽然这是真的,但问题是关于 XSS 攻击,而不是 SQL 注入。
    • 另外我不推荐使用这些功能,XSS 和 SQL 注入仍然是可能的。
    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 2012-04-26
    相关资源
    最近更新 更多