Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 输出某些内容而不首先逃逸有多危险_Php_Html_Content Management System_Xss - Fatal编程技术网

Php 输出某些内容而不首先逃逸有多危险

Php 输出某些内容而不首先逃逸有多危险,php,html,content-management-system,xss,Php,Html,Content Management System,Xss,根据我在构建定制cms时提出的关于转义内容的问题,我想了解不从db转义内容有多危险——假设数据在插入db之前已经过过滤/验证 我知道逃避输出是一种最佳做法,但我不确定有人向要显示的页面内容“注入”值有多容易,甚至有多可能 例如,假设使用简单的echo语句显示带有HTML标记的内容: <p>hello</p> 你好 诚然,就内容写作而言,它不会赢得任何奖项;) 我的问题是,如果在插入db之前进行过滤/验证,是否有人会出于恶意修改它?如果从数据库中提取单词hello并显示

根据我在构建定制cms时提出的关于转义内容的问题,我想了解不从db转义内容有多危险——假设数据在插入db之前已经过过滤/验证

我知道逃避输出是一种最佳做法,但我不确定有人向要显示的页面内容“注入”值有多容易,甚至有多可能

例如,假设使用简单的echo语句显示带有HTML标记的内容:

<p>hello</p>
你好

诚然,就内容写作而言,它不会赢得任何奖项;)


我的问题是,如果在插入db之前进行过滤/验证,是否有人会出于恶意修改它?

如果从数据库中提取单词hello并显示它,则不会发生任何事情。如果内容包含
标记,则这是危险的,因为用户的cookie可能会被盗并被用来劫持他们的会话。

例如,这可能与一些其他漏洞(如sql注入)有关。然后,有人可以在添加到db之前进行ommit筛选/验证,并显示他可以显示的任何内容。

如果您不退出HTML输出,只需将脚本插入到页面的HTML代码中,即可在访问您页面的每个客户端的浏览器中运行。它被称为

例如:

<p>hello</p><script>alert('I could run any other Javascript code here!');</script>
hello

alert('我可以在这里运行任何其他Javascript代码!');
alert()
的位置上,基本上可以使用任何东西:访问cookie、操作DOM、与其他服务器通信等等

嗯,这是一种插入脚本的非常简单的方法,
strip_标记
可以防止这种情况。但是还有数百种更为复杂的技巧,
strip\u标签
根本无法抵御

如果您确实想存储和输出HTML,可以采用以下解决方案:

黑客们有一个巨大的XSS向量库隐藏在网络的深处 HTML规范。HTML净化器是有效的,因为它 将整个文档分解为标记,并删除非白名单 元素,检查标签的良好格式和嵌套,以及 根据其RFC验证所有属性。HTML净化器的 广泛的知识补充了全面的算法, 确保格式丰富的文档通过非压缩文件

总是为了合适的语境而逃避;不管是JSON、XML/HTML、CSV还是SQL(尽管您应该为SQL使用占位符,为JSON使用库),等等

为什么??因为它是一致的。保持一致性也是懒惰的一种表现形式:您不需要考虑数据是否“对HTML安全”,因为这不重要。懒惰(以一种好的方式)是一种有价值的编程特性。(在这种情况下,它还懒于避免因未来的变化而不得不修复“bug”。)


不要忽略转义“因为它永远不会包含需要转义的数据”。。因为,有一天,在许多情况下,这种假设将是错误的。

这取决于你如何筛选/验证。但我可以肯定的是,我总是会逃跑。可能是谷歌的“跨站点脚本”/“XSS”。显示的数据来自哪里?你是如何过滤HTML的?您如何确保不能插入脚本?要做到这一点,有成千上万的技巧,因此仅删掉
和内联事件处理程序是不够的。感谢各位,让我们假设内容是使用表单添加到数据库中的,并从数据库中提取出来用于输出。主要表单字段经过过滤和验证,以确保只包含文本值,但是内容字段本身(包含各种标记HTML和JavaScript)保持非常开放,可能只使用了一个简单的strip标记函数。我想知道是否有人可以用变量的值覆盖变量的值。我的理解不是很好,所以我想知道是否有人可以更改echo$page->content这样的内容,以便它输出phpinfo()?您知道这是否可行吗?感谢您抽出时间提供帮助,我假设只有当攻击者能够访问表单并将内容添加到数据库中时,这才会起作用?在您看来,将CSRF令牌添加到表单中,再加上可靠的ACL安排,是否会使风险大大降低?我正在考虑网站管理员添加新内容。@notQuiteAnExpert更多的是处理表单的脚本,而不是表单本身-这些脚本应该仔细检查权限。如果只有少数人可以访问(当然,进入管理系统并不容易),那么就有CSRF保护,这不是一个巨大的风险,但仍然是一个风险。再次感谢,因此,您是否认为一种合理合理的方法是,仅当用户经过身份验证且用户有权访问表单时才显示表单,然后检查表单何时发布,如果用户有权添加/更新/删除相关字段,然后处理结果?我希望在允许管理员灵活处理内容字段中的脚本标记和自定义属性的同时,尽可能降低风险?@notQuiteAnExpert如果管理员可以通过web界面添加脚本标记和自定义属性,您将永远不会真正安全。但是如果这是一个要求(你不能说你不会实现它),我会说所描述的方法(加上CSRF、会话固定等保护)将“足够好”。谢谢你,我认为在所有数据库更新中使用准备好的语句是一条路,只有添加新内容的管理员才能使用这些表单。有什么想法吗?再次提前表示感谢。感谢您抽出时间来帮助我,我喜欢这样做,因为我可以很懒;)感谢我的建议,我认为主要是网站管理员添加内容,并为添加cu提供尽可能多的灵活性