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