Php 如果我';我在使用HTMLPurifier?
我一直在“喷洒”Php 如果我';我在使用HTMLPurifier?,php,html,security,xss,htmlpurifier,Php,Html,Security,Xss,Htmlpurifier,我一直在“喷洒” htmlentities($user_input, ENT_QUOTES, 'UTF-8') 在我的整个视图中,无论何处,我都会回显用户有机会在我的应用程序中输入的数据 这非常乏味,我想知道在我的控制器中使用HTMLPurifier是否可以安全地替代在视图的每个echo中使用htmlentities 例如,我注意到HTMLPurifier一个人会尝试关闭一个打开的,而不是将其删除,因此如果某个smartass以Johnny的身份输入他的名字,并且我在视图中对其进行了echo处
htmlentities($user_input, ENT_QUOTES, 'UTF-8')
在我的整个视图中,无论何处,我都会回显用户有机会在我的应用程序中输入的数据
这非常乏味,我想知道在我的控制器中使用HTMLPurifier是否可以安全地替代在视图的每个echo
中使用htmlentities
例如,我注意到HTMLPurifier一个人会尝试关闭一个打开的
,而不是将其删除,因此如果某个smartass以Johnny
的身份输入他的名字,并且我在视图中对其进行了echo
处理,则会破坏我的整个布局
但是如果我单独使用htmlentities
,我会
Johnny<div>
约翰尼
我的布局也保留了下来
所以我想知道这是不是HTMLPurifier配置的问题,或者最好的做法是将其与htmlentities
结合使用
我知道HTMLPurifier还有其他的函数来重新遵从和有效的HTML,但我最关心的是XSS
你怎么看?如果你担心XSS,那么就使用(没有理由使用全面的
htmlentities
),你就是黄金:
echo htmlspecialchars($user_input);
HTMLPurifier只有在您希望允许一些HTML功能的同时仍然阻止XSS时才有意义。但是,与其他任何代码一样,它也有可能在某个时候不能像广告中所宣传的那样工作。就我个人而言,我不会去那里
更新:
是的,htmlspecialchars
支持附加标志(包括ENT\u引号
)。但是,只有在以下情况下才需要使用entu QUOTES
:
- 您正在输出HTML属性的值和
- 您已将值括在单引号内
entu引号
:
<p><?php echo htmlspecialchars($input); ?></p>
或在此:
<p id="<?php echo htmlspecialchars($input); ?>"></p>
不同的目的。HP用于清理HTML,这样用户就可以实际提交HTML,作为实际的HTML使用 如果您希望使用文本,而不希望将其用作HTML,那么通常
htmlspecialchars
。它特别适合可能以某种方式在标记属性中结束的文本字符串
如果您只想显示文本,那么您甚至应该更喜欢组合:
htmlspecialchars(strip_tags($input), ENT_QUOTES, "UTF-8")
(显然,HP是没有意义的。
strip_tags()
本身就足以防止XSS,只要内容只在文本节点中输出,而不是在任何属性中输出。)如果您希望用户能够编写HTML,那么HTMLPurifier似乎是一个很好的解决方案——但从您编写的内容来看,似乎您不希望也不需要用户输入HTML,在这种情况下,它根本不是解决方案(正如您所提到的,它允许例如div元素)
另一方面,HtmlEntities会逃避用户输入,因此这是大多数XSS和阻止HTML的方法。但是,请注意,htmlEntities不会保护您免受所有XSS攻击。例如,如果您在HTML属性周围使用单引号,并允许将用户输入插入属性值,则恶意用户可以通过传递“单引号”字符来攻击您,从而转义您的引号。要避免这种情况,您需要使用ENT_QUOTES选项。PHP.net上的其他人提到,还需要特别注意注释中的双破折号。是否有
htmlspecialchars
上的标志?我想知道增加安全性是否需要entu QUOTES
,使用htmlentities
是否会影响性能为什么每个人都这么支持htmlspecialchars
?这是不可测量的<代码>ENT_QUOTES仅当内容最终出现在属性上下文中的标记中时才有必要再次引用。是的,在这种情况下,某些用户数据可能在我的应用程序的属性中,也可能在jQuery字符串中,如果需要的话。另外,如果其中任何一个最终出现在JS上下文中,则使用json\u encode
。(有时也可以选择。不是为你。)thx philipp-我的应用程序不是为用户提交HTML而设计的,因此你是正确的HTMLPurifier似乎不是应该做的不是设计的并不意味着HTML不会被提交(恶意)。关于“喷洒”:使其成为一个短包装函数HTML(“文本”)
或只是h()
。安全性最好通过简单性而不是语法开销来实现。+1计划为此创建一个助手函数,并从视图中调用它,而不是在每个echo上使用上面的完整语法
htmlspecialchars(strip_tags($input), ENT_QUOTES, "UTF-8")