草庐IT

javascript - 跨域 AJAX 请求未被阻止 : is this a security vulnerability?

coder 2024-07-25 原文

最近三天我研究了如何使用 XMLHttpRequest 进行跨域请求。最好的选择确实是我已经在使用的 JSONP。

但我仍然有一个问题,我无法在任何地方找到答案。我阅读了数百篇文章(包括 SO),但没有人有一个负责任的好答案(有很好的引用)。希望这里有人可以提供帮助。

也就是说,我在许多网站上看到,由于安全原因,我无法从域 example.com 向 yyy.com 发出 Ajax 请求并获取我想要的数据。这很清楚,我对此毫无疑问。但问题是当我在我的本地主机中运行下面的代码时(所以我的域是“本地主机”,我不应该能够从另一个域请求任何数据)。

xhReq = new XMLHttpRequest();
xhReq.open("GET","http://domain.com.br?parameter",true);
xhReq.send(null);

当我检查 Firebug 网络选项卡时,我发现请求没有被阻止!这是明确要求的。我简直不敢相信。所以我在 domain.com.br/log.php 中创建了一个文件,我可以在其中记录任何访问我的域的请求。令人惊讶的是,我向 localhost 发出的所有请求都击中了我的 domain.com.br。当我试图获取响应时,由于我的 Chrome 和 FIrebug 浏览器的同源策略,我真的无法得到它。但令我感到非常惊讶的是,尽管我无法操纵响应,但请求确实到达了网络服务器。

更令人惊讶的是,如果 domain.com.br/log.php 生成了一个大约 1MB 的巨大响应,我的 Firebug 告诉我浏览器确实从网络服务器下载了所有 1MB,最后它显示一条消息“访问被拒绝”,正如预期的那样。那么,如果同源策略禁止读取该数据,为什么还要下载所有文件。

最后,让我感到惊讶的是,我阅读的所有网站和规范都非常清楚地表明,当目标域与源域不匹配时,请求将被使用 Ajax 阻止。但显然,通过我的实验,请求正在完成,尽管我无法访问响应数据。

让我不高兴的是它可能会打开一个巨大的安全漏洞,每天有数千次浏览的网站可以运行这 3 行代码,并在一个不友好的网站中造成巨大的 Ddos 攻击,只是让用户请求一个页面由于浏览器不会阻止请求,因此会每隔一小段时间访问另一个网站。

我在 IE 7、8 和 9 以及最新的 Chrome 和最新的 Firefox 中测试了这个脚本,行为是相同的:请求已完成,浏览器下载所有响应,但无法执行 SOP。

希望有人能向我解释为什么规范如此错误或者我理解错误的地方!

最佳答案

可以发出请求,并且服务器可以生成响应,而不管 CORS。但是,响应 可能会被隐藏。巴尔法wrote about this in his blog最近:

Note that the same origin policy doesn't necessarily prevent the request per se – it just prevents the response from being accessible. A malicious site can e.g. just redirect your browser, or submit a form, or include an image or an iframe – in all those cases a request is made to your site; the evil site just doesn't see the response.

在某种程度上,浏览器必须向服务器发出请求,以查看它是否提供“Access-Control-Allow-Origin” header 。请记住,CORS 完全由浏览器实现。有人可能只编写一个控制台应用程序来向您的服务器发出请求,因此您不应依赖 CORS 来确保请求仅来自您自己的站点。

关于javascript - 跨域 AJAX 请求未被阻止 : is this a security vulnerability?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19690117/

有关javascript - 跨域 AJAX 请求未被阻止 : is this a security vulnerability?的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  3. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  4. jquery - 如何将 AJAX 变量从 jQuery 传递到他们的 Controller ? - 2

    我有一个电子邮件表格。但是我正在制作一个测试电子邮件表单,用户可以在其中添加一个唯一的电子邮件,并让电子邮件测试将其发送到该特定电子邮件。为了简单起见,我决定让测试电子邮件通过ajax执行,并将整个内容粘贴到另一个电子邮件表单中。我不知道如何将变量从我的HAML发送到我的Controllernew.html.haml-form_tagadmin_email_blast_pathdoSubject%br=text_field_tag'subject',:class=>"mass_email_subject"%brBody%br=text_area_tag'message','',:nam

  5. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  6. ruby - HTTP 请求中的用户代理,Ruby - 2

    我是Ruby的新手。我试过查看在线文档,但没有找到任何有效的方法。我想在以下HTTP请求botget_response()和get()中包含一个用户代理。有人可以指出我正确的方向吗?#PreliminarycheckthatProggitisupcheck=Net::HTTP.get_response(URI.parse(proggit_url))ifcheck.code!="200"puts"ErrorcontactingProggit"returnend#Attempttogetthejsonresponse=Net::HTTP.get(URI.parse(proggit_url)

  7. ruby-on-rails - 获取并发布相同匹配项的请求 - 2

    在我的路线文件中我有:match'graphs/(:id(/:action))'=>'graphs#(:action)'如果是GET请求(工作)或POST请求(不工作),我想匹配它我知道我可以使用以下方法在资源中声明POST请求:post'/'=>:show,:on=>:member但是我怎样才能为比赛做到这一点呢?谢谢。 最佳答案 如果你同时想要POST和GETmatch'graphs/(:id(/:action))'=>'graphs#(:action)',:via=>[:get,:post]编辑默认值可以设置如下match'g

  8. ruby - 无法安装 gem - make 未被识别为内部或外部命令可运行程序或批处理文件 - 2

    我想在Windows7上安装带有ruby​​1.9.3的rspec-railsgem。我收到一些错误消息,提示无法安装某些json库。所以,我使用下面的说明来解决它。来源=The'json'nativegemrequiresinstalledbuildtools从[rubyinstaller.org][3]下载[Ruby1.9.3][2]从[rubyinstaller.org][3]下载DevKit文件对于Ruby1.9.3,使用[DevKit-tdm-32-4.5.2-20110712-1620-sfx.exe][4]将DevKit解压到路径C:\Ruby193\DevKit运行cd

  9. ruby - 在 Mechanize 中使用 JavaScript 单击链接 - 2

    我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan

  10. ruby-on-rails - 如何在 ActionController::TestCase 请求中设置内容类型 - 2

    我试图像这样在我的测试用例中执行获取:request.env['CONTENT_TYPE']='application/json'get:index,:application_name=>"Heka"虽然,它失败了:ActionView::MissingTemplate:Missingtemplatealarm_events/indexwith{:handlers=>[:builder,:haml,:erb,:rjs,:rhtml,:rxml],:locale=>[:en,:en],:formats=>[:html]尽管在我的Controller中我有:respond_to:html,

随机推荐