Security 使用HttpOnly Cookie的XSS保护可以工作吗?

Security 使用HttpOnly Cookie的XSS保护可以工作吗?,security,cookies,xmlhttprequest,httponly,Security,Cookies,Xmlhttprequest,Httponly,我对HttpOnly cookie做了一些研究,并研究了可能存在的问题,即使用XHR请求结合跟踪方法从服务器返回cookie值 对于安全的Web应用程序,我目前有以下设置: 会话cookie在登录时发送,并设置了安全和httpOnly属性 已对整个域禁用跟踪http方法(返回“405方法不允许”) 为了避免跨站点请求伪造,我在表单的隐藏字段中添加了一个随机键。必须在每个POST请求中返回此密钥,请求才能被接受 除此之外,默认情况下,所有HTML都使用白名单进行转义,以选择允许的标记和属性,但

我对HttpOnly cookie做了一些研究,并研究了可能存在的问题,即使用XHR请求结合跟踪方法从服务器返回cookie值

对于安全的Web应用程序,我目前有以下设置:

  • 会话cookie在登录时发送,并设置了安全和httpOnly属性
  • 已对整个域禁用跟踪http方法(返回“405方法不允许”)
为了避免跨站点请求伪造,我在表单的隐藏字段中添加了一个随机键。必须在每个POST请求中返回此密钥,请求才能被接受

除此之外,默认情况下,所有HTML都使用白名单进行转义,以选择允许的标记和属性,但为了说明为什么这还不够:我们以前允许使用span上的style属性(例如,为文本着色),该属性可用于通过以下方式在Internet Explorer中传递javascript:

<span style="width: expression(alert('Example'));"> </span>

然后是最后一个问题:有人能指出这个设置中可能存在的缺陷或建议吗?或者你使用的方法是相同的还是完全不同的

已知问题:

  • 并非所有浏览器都只支持http
  • 过滤css JS表达式是不够的,@import(外部样式表)也可以工作
根据您的帖子(标题有点误导),我假设您理解Httponly属性阻止通过document.cookie访问cookie,并且不做任何其他事情来防止XSS允许的其他恶劣行为,包括模拟用户(即,不需要窃取cookie,可以使用检索到的CSRF令牌),在浏览器上检查易受攻击的插件以安装恶意软件,安装javascript键盘记录器,扫描内部网络等,重写页面等

正如您所说,仅列出每个标记的标记和属性是不够的。您必须对属性值应用更严格的验证,可能是通过白名单正则表达式

<>一个不完整的列表,考虑两个与XSS或CSRF不直接相关的问题:

  • 如何处理不完整的html,例如缺少结束标记
  • 如何处理用户输入中的单引号、双引号和反斜杠
  • 如何处理在不同上下文中输出的用户输入,例如url链接、属性值等。?
  • 您是否检查输入是否与输入字符集编码匹配
  • 您是否在响应头和元标记中显式设置了内容类型
  • 对于通过HTTP服务的中度敏感用户页(如果有),您是否设置了适当的缓存控制标头
  • 如何确保用户输入是沙盒式的?具体来说,如果您允许CSS,如何确保样式仅应用于受限区域,而不能更改其他区域
  • 您是否有第三方javascript,包括网站上的广告
  • 会话cookie是否受到保护以防篡改(如果应该)
  • 您是否清理了所有可由用户修改的输入(包括HTTP头)
  • CSRF令牌真的是随机的吗?如果是,如何生成随机令牌?如果没有,您如何构建它
  • 您是否使用准备好的语句和绑定参数
  • 用户可以上传文件吗
  • 您是否提供用户上传的内容,如图像等?如果是,您如何验证文件内容(GIFAR缺陷)以及文件是否来自同一域
  • 您是否提供API访问?如果是,它是否托管在同一个域上?您有什么跨域限制
HttpOnly Cookie是一种很好的安全措施,但它不是用来阻止XSS的,只是让攻击者更难利用XSS漏洞。让我详细说明一下

使用XSS可以绕过基于令牌的xsrf安全系统,因此攻击者无需知道cookie即可利用XSS漏洞进行攻击

为避免跨站点请求伪造,我 已在隐藏中添加随机密钥 字段添加到窗体。这把钥匙是必须的 在每个POST请求中返回 请求被接受

例如,使用XSS,攻击者可以执行JavaScript,该JavaScript可以使用xmlhttprequest读取域上的任何页面。因此,通过使用xmlhttprequest,攻击者可以读取XSRF令牌,然后使用它伪造POST请求。这是因为XSS的一个属性是它允许中断。举个例子,这是我写的一个真实世界的漏洞,它符合我刚才解释的

防止XSS的最好方法是将像
这样的讨厌的字符转换成它们相应的html实体。在PHP中,我建议:

$var=htmlspeicalchars($var,ENT_QUOTES);
这将修复单引号和双引号,从而可以停止大多数XS。即使生成的sting位于html标记中。例如,如果您替换引号,攻击者将无法利用此漏洞。这是因为攻击者必须突破引号才能执行“onload=”

进入此html:

print("<img src='http://HOST/img.php?=".$var."'>");
打印(“”);
但是,您使用
标记列出的特定情况仍然可能存在问题,因为攻击者不需要引号!如果您在
标记中添加了xss漏洞,那么您的系统也会有xss漏洞。只要对用户输入的位置保持安全,就不会有针对所有漏洞的“一网打尽”或“银弹”

利用HTTP“跟踪”方法的“XST”攻击实际上不是一种现实的攻击。原因是攻击者不可能强制web浏览器发出“跟踪”http请求。在“GET”的情况下,攻击者可以使用javascript或
标记强制使用“GET”和“POST”方法,但HTTP头的其余部分是禁止使用的。请记住,在几乎所有Apache系统中,跟踪都是默认启用的,如果它真的很危险,则会一起删除。许多保安人员
print("<img src='http://HOST/img.php?=".$var."'>");