JQuery和其他框架添加以下标头:
X-Requested-With:XMLHttpRequest
为什么需要这个?为什么服务器要以不同于正常请求的方式处理AJAX请求?
更新:我刚刚使用这个标题找到了一个真实的例子:https://core.spreedly.com/manual/payment-methods/adding-with-js.如果在没有AJAX的情况下请求支付处理器,它会在完成后重定向回原始网站.当使用AJAX请求时,不会进行重定向.
如果在具有基于cookie的访问限制的站点上使用AJAX,则JavaScript需要访问cookie.HttpOnly cookies是否可以在AJAX网站上运行?
编辑:如果指定了HttpOnly,Microsoft通过禁止JavaScript访问cookie创建了一种防止XSS攻击的方法.FireFox后来采用了这个.所以我的问题是:如果你在一个网站上使用AJAX,比如StackOverflow,那么Http-Only cookies是一个选择吗?
编辑2:问题2.如果HttpOnly的目的是阻止JavaScript访问cookie,你仍然可以通过XmlHttpRequest对象通过JavaScript检索cookie,那么HttpOnly有什么意义呢?
编辑3:以下是维基百科的引用:
当浏览器收到这样的cookie时,它应该像往常一样在以下的HTTP交换中使用它,但不能让它对客户端脚本可见.[32] 该
HttpOnly标志不是任何标准的一部分,并未在所有浏览器中实现.请注意,目前没有阻止通过XMLHTTPRequest读取或写入会话cookie.[33].
我知道document.cookie当你使用HttpOnly时会被阻止.但似乎您仍然可以在XMLHttpRequest对象中读取cookie值,从而允许使用XSS.HttpOnly如何让你更安全?通过使cookie基本上只读?
在您的示例中,我无法写入您的内容document.cookie,但我仍然可以使用XMLHttpRequest对象窃取您的cookie并将其发布到我的域中.
<script type="text/javascript">
var req = null;
try { req = new XMLHttpRequest(); } catch(e) {}
if (!req) try { req = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) {}
if (!req) try { req = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {}
req.open('GET', 'http://stackoverflow.com/', false);
req.send(null);
alert(req.getAllResponseHeaders());
</script>
Run Code Online (Sandbox Code Playgroud)
编辑4:对不起,我的意思是你可以将XMLHttpRequest发送到StackOverflow域,然后将getAllResponseHeaders()的结果保存到字符串中,正则输出cookie,然后将其发布到外部域.似乎维基百科和哈克斯在这一方面同意我,但我希望能够重新接受教育......
最终编辑:啊,显然这两个网站都是错误的,这实际上是FireFox中的一个错误.IE6和7实际上是目前唯一完全支持HttpOnly的浏览器.
重申我所学到的一切:
编辑:此信息可能不再是最新的.
我正在考虑在ASP.NET Core中更改默认防伪cookie的名称.
我想更改cookie名称的原因是为了匿名化cookie,在我看来,没有理由为什么最终用户应该能够确定这个cookie的责任.
Microsoft.AspNetCore.Antiforgery.AntiforgeryOptions.CookieName
我们正在将我们的前端转移到一个单独的项目(Django之外).这是一个Javascript单页面应用程序.
其中一个原因是让我们的前端开发人员更容易完成他们的工作,而不必在本地运行整个项目 - 包括API.相反,我们希望他们能够与我们设置的测试API进行通信.
我们已经设法解决了大部分CORS/CSRF问题.但是现在我们遇到了一些我无法在任何地方找到解决方案的东西,尽管阅读了大量文档和SO答案.
前台和API是从不同的域(在开发过程中提供服务localhost和test-api.example.com).到目前为止,虽然从同一个域提供服务,但前端已经能够从csrftokenAPI(Django)设置的cookie中获取CSRF令牌.但是,当从不同的域提供服务时,frontend(localhost)无法访问API(api-test.example.com)的cookie .
我正在试图找到解决这个问题的方法,以某种方式将CSRF令牌传递给前端.Django文档建议X-CSRFToken为AJAX请求设置自定义标头.如果我们在每个响应中同样为CSRF令牌提供标头并且(通过Access-Control-Expose-Headers)允许前端读取此标头,我们是否会破坏CSRF保护?
鉴于我们已经为API正确设置了CORS(即只允许某些域对API进行跨域请求),第三方站点上的JS应该无法读取此响应头,因此无法做出妥协AJAX请求我们的用户背后,对吧?还是我错过了一些重要的事情?
还是有另一种更好的方法来实现我们想要的东西吗?
我使用React Single Page Application作为客户端或Create React App(CRA)。
在后端,我使用Node.js&Express。
要获取数据或存储,我需要从客户端到后端调用API。
实际上,我已经看过几种中间件,例如:-Express CSURF
但老实说,我不明白如何在每次请求时都向客户端发送CSRF令牌。我尝试了几次,方法是将CSRF插入cookie中,然后将其放在客户端。但是当存储第一个请求或新的cookie时,出现error Invalid CSRF Token。
即使我这样做:
app.use(session({
genid: function (req) {
return uuidv4() // use UUIDs for session IDs
},
name:keys.session.name,
secret: keys.session.secret,
resave: false,
saveUninitialized: true,
rolling:true,
cookie: {
secure: false,
httpOnly: true,
maxAge:keys.session.maxAge, // satu hari,
sameSite:true,
}
}));
app.use(passport.session());
app.use(cookieParser());
app.use(csrf({ cookie: false }));
app.use((req,res,next)=>{
res.cookie('CSRF_token', req.csrfToken(), { sameSite: true });
})
Run Code Online (Sandbox Code Playgroud)
这意味着CSRF_token cookie将更改每个请求。但我只这样设置一次:axios.defaults.headers.common['csrf-token'] = csrf;结果仍然有效,但不起作用。
那我需要CSRF吗?或如何在React SPA上配置正确的SPA。
我试图找到以下问题的答案。
csrftokencookies?csrftoken存在的位置,还是技术上有效?我附上了一个示例屏幕截图,显示了我在csrftoken各种 cookie 路径和到期时间(多租户和各种表单路径)中看到的多个内容。
有关的:
在玩 时Spring security,我想知道CSRF应用程序注销时(跨站点请求伪造)令牌生命周期的方法。
假设用户登录并浏览我的网站。然后他退出。我是否应该使 CSRF 令牌失效(在我的情况下作为 cookie 实现,如果重要的话)?
如果不是,在安全方面有什么我应该注意的警告吗?
如果是,我该如何管理用户在应用程序上的任何进一步操作?如果没有任何CSRFToken,服务器端会禁止某些操作。那我应该生成一个新的令牌吗?
我用于Spring boot服务器端,默认情况下它似乎会使令牌无效(或者我犯了一些错误导致了这个结果......)
谢谢你的帮助。
我试图阻止我的 Web 应用程序遭受 CSRF(跨站点请求伪造)我点击了此链接Link for CSRF
这是我尝试过的。为了在 Java 中实现这一机制,我选择使用两个过滤器,一个为每个请求创建盐,另一个用于验证它。由于用户请求和后续应验证的 POST 或 GET 不一定按顺序执行,因此我决定使用基于时间的缓存来存储有效盐字符串的列表。
第一个过滤器用于为请求生成新的盐并将其存储在缓存中,代码如下:
public class LoadSalt implements Filter{
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// Assume its HTTP
HttpServletRequest httpReq = (HttpServletRequest)request;
// Check the user session for the salt cache, if none is present we create one
@SuppressWarnings("unchecked")
Cache<String, Boolean> csrfPreventionSaltCache = (Cache<String, Boolean>)
httpReq.getSession().getAttribute("csrfPreventionSaltCache");
System.out.println("Checking cahce befor creating it from Request :csrfPreventionSaltCache: "+csrfPreventionSaltCache);
if(csrfPreventionSaltCache == null)
{
System.out.println("csrfPreventionSaltCache is null …Run Code Online (Sandbox Code Playgroud) 我正在使用 Spring Boot 3、Spring Security 6。我的安全配置无法正常工作。我有两条路径,任何请求都应该被允许,而对于其他所有请求,都需要进行身份验证。
GET和方法都POST适用于那些需要身份验证的人。
对于那些带有 的permitAll(),只有GET请求有效。对于POST,我收到 401 Unauthorized。
我负责 CSRF,无论如何我希望所有POST请求都能工作,而不仅仅是那些带有身份验证的请求。
在 Postman 上,我选择POST“无身份验证”,放置 RAW 正文并选择 JSON。我真的不知道为什么它不起作用。
这是我的代码:
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http, KeycloakLogoutHandler keycloakLogoutHandler) throws Exception {
CookieCsrfTokenRepository tokenRepository = CookieCsrfTokenRepository.withHttpOnlyFalse();
XorCsrfTokenRequestAttributeHandler delegate = new XorCsrfTokenRequestAttributeHandler();
// set the name of the attribute the CsrfToken will be populated …Run Code Online (Sandbox Code Playgroud) cookies ×3
csrf ×3
ajax ×2
cors ×2
django ×2
http ×2
http-headers ×2
javascript ×2
spring-boot ×2
asp.net ×1
asp.net-core ×1
asp.net-mvc ×1
express ×1
httponly ×1
java ×1
jquery ×1
node.js ×1
python ×1
reactjs ×1
spring ×1
token ×1