Php 正确使用时,htmlspecialchars是否足以保护所有XS?

Php 正确使用时,htmlspecialchars是否足以保护所有XS?,php,html,security,xss,Php,Html,Security,Xss,如果下列陈述属实 所有文档都提供HTTP头内容类型:text/html;字符集=UTF-8 所有HTML属性都用单引号或双引号括起来 文档中没有标记 是否存在htmlspecialchars($input,ENT_QUOTES,'UTF-8')(将&,“,”,转换为相应的命名HTML实体)的情况在web服务器上生成HTML时,不足以防止跨站点脚本编写?据我所知,是的。我无法想象它不会避免xss的情况。如果您希望完全安全,请使用strip_tags()假设您不使用较旧的PHP版本(5.2左右)

如果下列陈述属实

  • 所有文档都提供HTTP头
    内容类型:text/html;字符集=UTF-8
  • 所有HTML属性都用单引号或双引号括起来
  • 文档中没有
    标记

是否存在
htmlspecialchars($input,ENT_QUOTES,'UTF-8')
(将
&
转换为相应的命名HTML实体)的情况在web服务器上生成HTML时,不足以防止跨站点脚本编写?

据我所知,是的。我无法想象它不会避免xss的情况。如果您希望完全安全,请使用strip_tags()

假设您不使用较旧的PHP版本(5.2左右),htmlspecialchars是“安全的”(以及@Royal Bg提到的后台代码)

在较旧的PHP版本中,存在格式错误的UTF-8字符,使此函数易受攻击()

我的2美分:总是通过告诉允许的内容来清理/检查您的输入,而不是逃避所有内容/编码所有内容

i、 e.如果有人必须输入电话号码,我可以想象以下字符是允许的:0123456789()+-。和一个空格,但所有其他字符都被忽略/删除

这同样适用于地址等。在地址中为点/块/心等指定UTF-8字符的人一定患有精神病…

htmlspecialchars()
足以阻止文档创建时HTML注入您所述的限制(即不注入标记内容/无引号属性)

但是,还有其他类型的注入可能导致XSS和:

文档中没有标记

此条件不包括JS注入的所有情况。例如,您可能有一个事件处理程序属性(需要在HTML转义中进行JS转义):


显示一些后端。如果所有的打印都像
echo htmlspecialchars($input,entu QUOTES,'UTF-8')
那样,那么如果您将输入放在
eval()之类的函数中,可能就够了
你可能还有其他安全风险,这只是关于HTML输出。
eval
不受信任的输入也很危险,但超出了这个问题的范围。如果你有一个论坛,明确允许任何形式的自由文本怎么办?这就是为什么我提到“而不仅仅是转义”的原因“…当然,自由格式文本是非常有效的。但是你会如何处理自由格式文本?我无法想象你只是在页面上输出自由格式文本…如果你这样做,它将是一个“受信任的”您允许这样做的源。我只是转义自由格式文本。验证可以确保您获得有效值。始终对所有内容应用正确的转义,您就没事了。清除,或数据的重新格式化和更改,只有在将各种输入带入标准格式时才真正有用,比如从电话号码中删除所有非数字BER并将数字格式化为您最喜欢的标准格式。从随机文本中剥离随机字符通常对自由格式文本毫无帮助。然后,我们都同意,只有在上下文已知的情况下,剥离才是正常的。即使上下文已知(即“在此处填写您最喜欢的javascript代码”)转义是一个must,
$xss
的示例值是什么,它会导致
这里曾经有来自@bobince的响应,但是它消失了-它是
”;你的代码在这里()//
htmlspecialchars
之后使用
strip\u标签有什么好处?
<div onmouseover="alert('<?php echo htmlspecialchars($xss) ?>')"> // bad!
<a href="javascript:alert('<?php echo htmlspecialchars($xss) ?>')"> // bad!