当前位置:  开发笔记 > 编程语言 > 正文

允许用户在PHP中提交HTML

如何解决《允许用户在PHP中提交HTML》经验,为你挑选了2个好方法。

我想允许很多用户提交用户配置文件的html,我目前试图过滤掉我不想要的内容,但我现在想要更改并使用白名单方法.

这是我目前的非白名单方法

function FilterHTML($string) {
    if (get_magic_quotes_gpc()) {
        $string = stripslashes($string);
    }
    $string = html_entity_decode($string, ENT_QUOTES, "ISO-8859-1");
    // convert decimal
    $string = preg_replace('/&#(\d+)/me', "chr(\\1)", $string); // decimal notation
    // convert hex
    $string = preg_replace('/&#x([a-f0-9]+)/mei', "chr(0x\\1)", $string); // hex notation
    //$string = html_entity_decode($string, ENT_COMPAT, "UTF-8");
    $string = preg_replace('#(&\#*\w+)[\x00-\x20]+;#U', "$1;", $string);
    $string = preg_replace('#(<[^>]+[\s\r\n\"\'])(on|xmlns)[^>]*>#iU', "$1>", $string);
    //$string = preg_replace('#(&\#x*)([0-9A-F]+);*#iu', "$1$2;", $string); //bad line
    $string = preg_replace('#/*\*()[^>]*\*/#i', "", $string); // REMOVE /**/
    $string = preg_replace('#([a-z]*)[\x00-\x20]*([\`\'\"]*)[\\x00-\x20]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iU', '...', $string); //JAVASCRIPT
    $string = preg_replace('#([a-z]*)([\'\"]*)[\x00-\x20]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iU', '...', $string); //VBSCRIPT
    $string = preg_replace('#([a-z]*)[\x00-\x20]*([\\\]*)[\\x00-\x20]*@([\\\]*)[\x00-\x20]*i([\\\]*)[\x00-\x20]*m([\\\]*)[\x00-\x20]*p([\\\]*)[\x00-\x20]*o([\\\]*)[\x00-\x20]*r([\\\]*)[\x00-\x20]*t#iU', '...', $string); //@IMPORT
    $string = preg_replace('#([a-z]*)[\x00-\x20]*e[\x00-\x20]*x[\x00-\x20]*p[\x00-\x20]*r[\x00-\x20]*e[\x00-\x20]*s[\x00-\x20]*s[\x00-\x20]*i[\x00-\x20]*o[\x00-\x20]*n#iU', '...', $string); //EXPRESSION
    $string = preg_replace('#]*>#i', "", $string);
    $string = preg_replace('#]*)?>#i', '', $string); // strip out tables
    $string = preg_replace('/(potspace|pot space|rateuser|marquee)/i', '...', $string); // filter some words
    //$string = str_replace('left:0px; top: 0px;','',$string);
    do {
        $oldstring = $string;
        //bgsound|
        $string = preg_replace('#]*>#i', "...", $string);
    } while ($oldstring != $string);
    return addslashes($string);
}

上面的工作非常好,经过2年的使用后我从来没有遇到过任何问题,但是对于白名单方法,有什么类似于stackoverflows的C#方法,但在PHP中? http://refactormycode.com/codes/333-sanitize-html



1> raspi..:

HTML Purifier是一个用PHP编写的符合标准的HTML过滤器库.HTML Purifier不仅会删除所有恶意代码(更好地称为XSS),并且具有经过全面审核,安全且允许的白名单,还可以确保您的文档符合标准,只有通过全面了解W3C的规范才能实现.



2> Havenard..:

使用DOMDocument正确分析它可能更安全,使用removeChild()删除不允许的标记,然后获得结果.使用正则表达式过滤东西并不总是安全的,特别是如果事情开始变得如此复杂.黑客可以找到一种方法来欺骗你的过滤器,论坛和社交网络确实很清楚.

例如,浏览器在<.之后忽略空格.你的正则表达式过滤器<脚本,但如果我使用

有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有