Php 将html数据从数据库输出到浏览器时的最佳实践

Php 将html数据从数据库输出到浏览器时的最佳实践,php,html,security,xss,htmlspecialchars,Php,Html,Security,Xss,Htmlspecialchars,我将html数据存储在数据库中 html数据非常简单,由wysiwyg编辑器生成 在我将html数据存储在数据库中并通过HTMLPurifier运行它之前,删除任何不好的地方 当我将数据输出回浏览器时,因为它是html数据,显然我不能使用php的htmlspecialchars() 就XSS攻击而言,我想知道这是否有任何问题。在保存到数据库之前通过HTMLPurifier传递数据是否足够?是否有我遗漏的东西/我应该采取的其他步骤 (提前)谢谢你的帮助 我从来没有遇到过主流richtext编辑器的

我将html数据存储在数据库中

html数据非常简单,由wysiwyg编辑器生成

在我将html数据存储在数据库中并通过HTMLPurifier运行它之前,删除任何不好的地方

当我将数据输出回浏览器时,因为它是html数据,显然我不能使用php的htmlspecialchars()

就XSS攻击而言,我想知道这是否有任何问题。在保存到数据库之前通过HTMLPurifier传递数据是否足够?是否有我遗漏的东西/我应该采取的其他步骤


(提前)谢谢你的帮助

我从来没有遇到过主流richtext编辑器的问题

当人们能够使用web表单将原始html嵌入到您的页面中时,就会出现XSS,您稍后会输出这些表单的输入(因此,在向屏幕写入时始终对用户输入进行编码)


这在(好的)文本编辑器中是不可能发生的。如果用户键入html代码(例如<或>),文本编辑器将对其进行编码。它只会创建自己的标签。

我从来没有遇到过主流richtext编辑器的问题

当人们能够使用web表单将原始html嵌入到您的页面中时,就会出现XSS,您稍后会输出这些表单的输入(因此,在向屏幕写入时始终对用户输入进行编码)


这在(好的)文本编辑器中是不可能发生的。如果用户键入html代码(例如<或>),文本编辑器将对其进行编码。它将创建的唯一标记是它自己的标记。

有一个函数,可以将字符编码为它们的html等价物。例如,
有一个函数,它将字符编码为它们的html等价物。例如,你所做的是正确的。当然,你也可以考虑过滤。您提到您正在使用HTMLPurifier-这很好。只是永远不要尝试自己使用消毒剂,这种方法有很多陷阱。

你所做的是正确的。当然,你也可以考虑过滤。您提到您正在使用HTMLPurifier-这很好。只是永远不要尝试自己使用消毒剂,这种方法有很多陷阱。

不正确。通常会有一个AJAX调用或表单提交将html发送到服务器。攻击者可以轻松修改html以包含任意javascript代码。如果您不在服务器端对此进行筛选,则会出现存储XSS问题。不是这样。通常会有一个AJAX调用或表单提交将html发送到服务器。攻击者可以轻松修改html以包含任意javascript代码。如果不在服务器端对此进行过滤,则会出现存储的XSS问题。HTMLSpecialChars在这种情况下不起作用,因为OP希望html呈现而不是显示为文本。另外,不要建议编写html过滤器/净化器,尤其是仅客户端和基于黑名单的过滤器/净化器;有几种方法可以避开这种过滤器。试试这个备忘单-HTMLSpecialChars在这种情况下不起作用,因为OP希望html呈现而不是显示为文本。另外,不要建议编写html过滤器/净化器,尤其是仅客户端和基于黑名单的过滤器/净化器;有几种方法可以避开这种过滤器。试试这张备忘单-
    <script language="javascript" type="text/javascript">

    function Button1_onclick() {
        //get text
        var text = document.getElementById("txtIn").value;
        //wype it
        text = wype(text);
        //give it back
        document.getElementById("txtOut").value = text;
    }

    function wype(text) {
        text = script(text);
        text = regex(text);
        return text
    }


    function script(text) {
        var re1 = new RegExp('<script.*?>.*?</scri'+'pt>', 'g');
        text = text.replace(re1, '');
        return text
    }

    function regex(text) {
        var tags = ["html", "body", "head", "!doctype", "script", "embed", "object", "frameset", "frame", "iframe", "meta", "link", "div", "title", "w", "m", "o", "xml"];
        for (var x = 0; x < tags.length; x++) {
            var tag = tags[x];
            var re = new RegExp('<' + tag + '[^><]*>|<.' + tag + '[^><]*>', 'g');
            text = text.replace(re, '');
        }
        return text;
    }
</script>