相关疑难解决方法(0)

jquery $ .ajax调用在Chrome或Firefox中导致401未经授权的响应,但在IE中有效

我有一个在需要使用JQuery $ .ajax方法(目前使用jquery 1.7.2)的网页上运行的脚本向不同域上的服务端点提交几个GET请求.我在IE(9,10,11)中使用了ajax调用,但它在Firefox和Chrome中失败了401 Unauthorized响应.Chrome中的部分其他错误消息是"访问此资源需要完全身份验证".

我的ajax调用设置如下(对于这些失败的请求,dataType为"json",async为true):

    $.ajax({
      url: url,
      type: "GET",
      async: isAsync,
      dataType: dataType,
      username: user,
      password: pswd,
      success: function (response, status) {
         // success code here
      },
      failure: function (response, status) {
         // failure code here
      },
      complete: function (xhr, status) {
         // on complete code here
      }
   });
Run Code Online (Sandbox Code Playgroud)

我传递了访问该服务所需的用户名和密码,这在IE中有效.我理解JQuery ajax函数将正确处理身份验证,因此如果响应返回指示需要授权,它将使用提供的凭据来正确地生成该请求.我在这里错过了什么吗?我是否需要手动添加Authorization标头才能生效?

更新:以下是Chrome和IE通过F12调试工具报告的请求,响应和Cookie信息(某些信息已替换为[...已删除...])

铬(42.0.2311.90米)

响应标题

access-control-allow-credentials:true access-control-allow-origin:[... removed ...] access-control-expose-headers:cache-control:private,max-age = 0,must-revalidate connection :keep-alive content-encoding:gzip content-length:296 content-type:text/html; charset = ISO-8859-1 date:Tue,21 Apr 2015 20:55:12 GMT expires:Tue,2015年4月21日20 :55:12 GMT p3p:CP …

javascript ajax jquery http-status-code-401

8
推荐指数
1
解决办法
4万
查看次数

调用客户端重定向后,会话属性将丢失

以前,servlet使用response.sendRedirect("pages/my_page.jsp?foo=bar");没有问题.可以在重定向到的后续页面中检索会话属性.

目前,我正在改变发送请求的方式.最初,Javascript使用myForm.submit();,但我现在已将其更改为jQuery.ajax("my_page.jsp?foo=bar", {...});.然后,servlet在JSON响应中包含一个URL,而不是response.sendRedirect()success函数中,我window.location.replace(url);用来导航到新页面.但是,无法在后续页面中获取已保存的会话属性.

我通过插入<%= session.getId() %>JSP页面来比较会话ID .他们是一样的.这里的问题是重定向到的页面中的session.getAttribute("myAttribute_1")返回null.

我不确定这是否重要,但我实际上是在使用多个JSP页面执行此任务:

A.jsp --- (redirect) ---> B.jsp --- (redirect) ---> C.jsp
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如何获取保存的会话属性C.jsp


编辑

下面是我用来保存会话属性的代码片段.

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    HttpSession session = request.getSession(true);

    response.setContentType("application/json");

    CustomObject customObject = new CustomObject();
    // ...
    session.setAttribute("myAttribute_1", customObject);

    PrintWriter writer = response.getWriter();
    JsonObject json = new JsonObject();
    Gson gson = new GsonBuilder().setPrettyPrinting().create();

    json.addProperty("url", "next_page.jsp?foo=bar"); …
Run Code Online (Sandbox Code Playgroud)

javascript java session jquery jsp

8
推荐指数
1
解决办法
5889
查看次数

ASP反请求伪造,为什么黑客不会先获取?

我一直在我的MVC3 Web应用程序中实现ASP ARF令牌,并阅读CSRF漏洞利用的工作方式以及ARF令牌如何防御它.现在我想知道'黑客'是否无法通过额外的步骤绕过ARF检查.正常的CSRF场景如下:

  1. 创建一个发布到目标网站BankingSite的网站(我们称之为HackerSite)
  2. 使用社交工程(或广告中的XSS等),以便用户访问网站HackerSite
  3. HackerSite上的脚本将使用用户cookie /凭证发布到BankingSite,从而以他/她的名义发布

由于我们的ARF令牌,BankingSite知道忽略来自网站HackerSite的POST.因为它缺少正确的AFR令牌.谁能告诉我为什么黑客不能通过首先在BankingSite上执行GET请求来获取令牌?像这样:

  1. 创建一个发布到目标网站BankingSite的网站(我们称之为HackerSite)
  2. 使用社交工程(或广告中的XSS等),以便用户访问网站HackerSite
  3. HackerSite上的脚本将执行GET请求并从响应中的HTML中获取ARF令牌,此请求还将在用户的cookie中设置ARF令牌
  4. HackerSite上的第二个脚本将使用抓取的ARF令牌 +用户cookie /凭证发布到BankingSite ,从而以他/她的名字发布

有谁知道我在这里缺少什么,以及ARF如何抵御这种攻击?

asp.net asp.net-mvc csrf owasp

5
推荐指数
1
解决办法
127
查看次数

使用AJAX时,Passport + Express4未经过身份验证

我在使用Passport时遇到了一个问题:在调用我的自定义端点时,我无法检查用户是否经过身份验证.

我已按以下方式配置了Express4应用程序:

app.use(morgan('dev')); // log every request to the console
app.use(cookieParser()); // read cookies (needed for auth)
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
// required for passport
app.use(session({ secret: 'secretphrase' })); // session secret
app.use(passport.initialize());
app.use(passport.session()); // persistent login sessions
app.use(checkAuth); // CHECK SESSION
app.use(flash()); // use connect-flash for flash messages stored in session
app.use(prepareRequests);
Run Code Online (Sandbox Code Playgroud)

checkAuth()中间件具有以下代码:

var checkAuth = function(request, response, next) {

    console.log("------------");
    console.log("checkAuth user: " + request.session.passport.user);
    console.log("checkAuth isAuthenticated: " + request.isAuthenticated());
    next();
}
Run Code Online (Sandbox Code Playgroud)

我第一次尝试使用护照登录时,isAuthenticated是假的.一旦我登录,每次打电话给我的服务器,当我的中间件通过时,被认证是假的!!! 但是,奇怪的是,如果我再次尝试登录,则isAuthenticated是真的.

这意味着只有我的AJAX调用返回isAuthenticated = false,但是当我maka表单帖子或点击指向API的链接时,它返回true!然后存储会话,但不存储AJAX请求. …

javascript ajax node.js express passport.js

3
推荐指数
1
解决办法
1906
查看次数

浏览器是否允许“发送”跨域请求?

我是网站安全的新手,目前正在尝试深入了解同源策略。虽然在 stackoverflow 和其他地方有关于 SOP 概念的非常好的帖子,但我找不到关于 chrome 和其他浏览器是否允许从一开始就“发送”跨域 XHR 发布请求的更新信息。

这个5 年前的帖子来看,chrome 似乎允许请求传递到请求的服务器,但不允许读取请求者的响应。

我在我的网站上进行了测试,试图从不同的域更改我服务器上的用户信息。详情如下:

  1. 我的域名:“www.mysite.com”
  2. 攻击者域:“www.attacker.mysite.com” 根据同源策略,这两个被认为是不同的起源。
  3. 用户(登录到 www.mysite.com 时)打开 www.attacker.mysite.com 并按下一个按钮,该按钮会向“www.mysite.com”服务器发出 POST 请求......提交的隐藏表单(此处没有令牌) case) 具有更改“www.mysite.com”服务器上的用户信息所需的所有信息--> 结果:CSRF 成功攻击:用户信息确实发生了变化。

  4. 现在做同样的事情,但使用 javascript 通过 JQuery 提交表单.post而不是提交表单--> 结果:除了 chrome 给出正常响应:

请求的资源上不存在“Access-Control-Allow-Origin”标头

,我发现在服务器端没有做任何更改......似乎请求甚至没有从浏览器通过。用户信息根本没有改变!虽然这听起来不错,但我期待相反。

根据我的理解和上面链接的帖子,对于跨域请求,浏览器应该只阻止服务器响应,而不是从一开始就将发布请求发送到服务器。另外,我没有任何 CORS 配置集;没有Access-Control-Allow-Origin headers被发送。但即使我有那个设置,它也应该只适用于“读取”服务器响应而不是实际发送请求......对吗?

我想到了预检,其中发送请求以检查服务器是否允许它,从而在发送其实际数据以更改用户信息之前阻止请求。但是,根据Access_Control_CORS,这些预检仅在不适用于我的简单 AJAX 发布请求的特定情况下发送(默认情况下包括带有 enctype 的简单表单,application/x-www-form-urlencoded并且不发送自定义标头)。

那么,chrome 是否已经更改了其安全规范以从一开始就阻止对跨域的 post 请求?或者我对同源策略的理解在这里遗漏了什么?

无论哪种方式,了解是否有在不同 Web 浏览器中实施的更新安全措施的来源都会有所帮助。

security ajax post csrf same-origin-policy

3
推荐指数
1
解决办法
1219
查看次数