表单提交请求和ajax请求之间有什么区别?

时间:2009-09-11 00:49:20

标签: ajax xss

我理解XSS和同源策略的基本思想,所以如果你的膝跳反应是在基础知识上训练我,你可以至少跳过半步......

如果javascript是客户端,那么通过XMLHttpRequest提交的http请求在什么时候区别于通过表单提交按钮提交请求的用户?

这是我的实际情况:

我正在开发一个脚本,该脚本将(如果可能的话)聚集来自安全子域的安全数据,这些子域存在此类私有数据。为了解决这个问题,我会调用我的网站staff.work.org和另一个网站personal.work.org

Back Story,如果你想要跳过

因此,这样一个脚本的好处是它既可以简化冗余流程,又可以为员工和管理层带来好处。现在,工作人员必须向调度经理发送该期限的可用性。由于大多数员工都是学生,他们基本上只需要通过电子邮件发送课程表。他们每个人都通过电子邮件发送他们的日程安排,经理会用它做任何事情,可能只是制作一个大文本文件或Excel文件。

但我想要的是他们只需转到一个“Schedule Importer”类型页面,将personal.work.org的数据从staff.work.org提取到我的脚本上(该公司有直接的赞助和品牌推广)学院,所以我们托管在他们的领域)。这样,他们可以确认类,进行任何更改,然后提交其可用性。然后,数据将转到管理员可以在管理页面上提取的SQL数据库,从而更好地了解大局。不仅如此,我的剧本还可以让工作人员将他们的日程安排转换为ical,这样他们就可以放入他们的Google日历,更好地跟上学校,yadda yadda。


我给了那个背景故事,以便a)你会发现这不只是为了ajax或跨域抓取而只是为了削减几个角落,而b)因为任何替代方案都是受欢迎的。

因此,两个站点(员工和个人)使用相同的身份验证方法,因此使用相同的cookie。登录到一个意味着登录到两者。因此,用户可以非常轻松地同时打开两个页面,等等。如果我在iFrame中设置私有数据,他们就会看到它而无需再次登录。

不起作用的东西

因此,cURL无法检索数据,因为cookie中包含登录IP,因此cURL显示服务器的IP,而不是用户的IP。由于登录站点拒绝任何源自绑定到主服务器的IP的登录尝试,因此无法在服务器端创建新的cookie。所以据我所知,服务器端已经出局了。

但是尝试通过ajax和jquery检索客户端会导致请求被视为跨站点,因为由于子域名,我必须输入完整的URL。它不是传递cookie和GET方法,而是传递:

Access-Control-Request-Method GET
Access-Control-Request-Headers cookie,x-requested-with

谷歌快速搜索告诉我的是w3c尝试拥有合法的XSS。很公平,但它不起作用,所以我猜这不起作用。

我知道如果我把它放在iframe中,我将无法出于类似的原因进入它。

蹩脚的解决方法

但我能想到的唯一其他选择是:a)让用户下载计划页面并将其上传到我的页面,b)让他们查看源代码,将其复制并粘贴到我的页面上,或c)让他们复制并直接从普通浏览器视图粘贴。

前两个不会赢得任何天才奖或真正流行。任何复制和粘贴在我的最终和他们的身上都充满了潜在的错误,因此不值得冒这个风险。

问题的简短版本

但是如果我将一个指向调度页面的表单放入方法作为get,点击一个提交按钮(没有其他输入或值)只需将它们直接带到页面就像是一个链接。这只是浏览器的XSS策略的一部分,其中js发送的请求在进入管道之前会被扭曲吗?或者在另一点发生了什么?有没有办法使用表单“下载”页面(没有personal.work.org的服务器访问权限来更改标题?

基本上我猜测我运气不好而且这是为了更大的利益,但似乎有一些我遗漏的东西应该允许交易数据,当用户已经使用相同的cookie进行身份验证时......

哦,我查看了this article on the topic,这是有洞察力的,建议在两个文档中设置document.domain = work.org可以解决问题。根据Firebug(document > domain : "")的说法,这不仅不是一个选项,而且甚至在我的脚本上设置的所有尝试都失败了。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

多数民众赞成正确,这些尝试将被视为XSS,我认为你不能轻易驾驭它。但是,有一个很好的解决方法,你可以看到谷歌用它来跨域服务对用户进行身份验证。根据你的情况调整它,它会做这样的事情:

  1. 域名A通过iframe向域B提交数据,但不希望能够访问答案。

  2. 域B在回答中,告诉浏览器它正被重定向回域A,页面/ handle.php?data= [某些加密数据,服务器A可以用密码解密只有你的系统知道] < / p>

  3. 域名A现在知道来自B的内容,可以告诉用户的浏览器如何使用它。

  4. 有关此加密数据的建议:第一个字节应为校验和。即使黑客无法对其进行解码,他们也可以通过愚蠢地编辑请求将错误的数据推送到您的服务器。 数据还应带有唯一的ID,可能有1或2分钟的失效日期,因此不能提交两次或记录在不同的时间内提交。