我有一个在需要使用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 …
以前,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) 我一直在我的MVC3 Web应用程序中实现ASP ARF令牌,并阅读CSRF漏洞利用的工作方式以及ARF令牌如何防御它.现在我想知道'黑客'是否无法通过额外的步骤绕过ARF检查.正常的CSRF场景如下:
由于我们的ARF令牌,BankingSite知道忽略来自网站HackerSite的POST.因为它缺少正确的AFR令牌.谁能告诉我为什么黑客不能通过首先在BankingSite上执行GET请求来获取令牌?像这样:
有谁知道我在这里缺少什么,以及ARF如何抵御这种攻击?
我在使用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请求. …
我是网站安全的新手,目前正在尝试深入了解同源策略。虽然在 stackoverflow 和其他地方有关于 SOP 概念的非常好的帖子,但我找不到关于 chrome 和其他浏览器是否允许从一开始就“发送”跨域 XHR 发布请求的更新信息。
从这个5 年前的帖子来看,chrome 似乎允许请求传递到请求的服务器,但不允许读取请求者的响应。
我在我的网站上进行了测试,试图从不同的域更改我服务器上的用户信息。详情如下:
用户(登录到 www.mysite.com 时)打开 www.attacker.mysite.com 并按下一个按钮,该按钮会向“www.mysite.com”服务器发出 POST 请求......提交的隐藏表单(此处没有令牌) case) 具有更改“www.mysite.com”服务器上的用户信息所需的所有信息--> 结果:CSRF 成功攻击:用户信息确实发生了变化。
现在做同样的事情,但使用 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 浏览器中实施的更新安全措施的来源都会有所帮助。
ajax ×3
javascript ×3
csrf ×2
jquery ×2
asp.net ×1
asp.net-mvc ×1
express ×1
java ×1
jsp ×1
node.js ×1
owasp ×1
passport.js ×1
post ×1
security ×1
session ×1