2011-02-23 31 views
2

我将html数据存储在数据库中。将数据从数据库输出到浏览器时的最佳实践

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

在我将html数据存储在数据库中之前,我通过HTMLPurifier运行它,以消除任何不良情况。

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

我想知道在XSS攻击方面是否有任何问题。是否足够保存到数据库之前通过HTMLPurifier传递数据?有什么我失踪/我应该采取的其他步骤?

(提前)感谢您的帮助。

回答

0

我从来没有与主流richtext编辑有问题。

XSS发生在人们能够使用Web表单将您的页面嵌入到您的页面中时,这是您在稍后的日期输出的输入(因此在写入屏幕时总是对用户输入进行编码)。

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

+1

不正确。通常会有一个AJAX调用或一个表单提交将html发送到服务器。攻击者可以轻松修改html以包含任意的javascript代码。如果您不在服务器端进行过滤,则存在存储的XSS问题。 – 2011-02-26 18:13:37

-1

有一个功能htmlspecialchars,它将字符编码到他们的html等价物。例如<变为&lt;

此外,您可能想要清除任何可疑标记。我前一段时间写了一个简短的js函数来做这个项目(绝不是全包的!)你可能想要根据你的需要来编辑它,或者根据你的需要编辑它...

<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> 
+0

在这种情况下,HTMLSpecialChars不起作用,因为OP希望html呈现而不是以文本形式显示。另外,不建议编写一个html过滤器/纯化器,尤其是那些仅基于客户端和黑名单的html过滤器/纯化器;有几种方法可以逃避这样的过滤器。试试这个备忘单 - http://ha.ckers.org/xss.html – 2011-02-26 18:25:50

1

你在做什么是正确的。您也可以考虑在确保方式上进行过滤。你提到你正在使用HTMLPurifier - 这很棒。只是不要试图自己实施一种消毒剂,这种方法存在很多缺陷。