标签: csrf

在 Java Web 应用程序上生成并验证 CSRF 令牌

我要求实施 CSRF 来防止对 java 服务器应用程序的攻击。这是一个提供大量 Web REST API 服务的应用程序。\n我查看了许多指南并在堆栈上进行了搜索,但仍然有一些顾虑。\n我知道对于 GET 请求来说是不需要的。

\n

所以,如果我错了,请纠正我。

\n
    \n
  1. 浏览器第一次发送请求以获取会话的 CSRF 令牌,大约 30 分钟
  2. \n
  3. 然后浏览器将此令牌放入脚本中并发送给后端。
  4. \n
\n

这是我的过滤器。

\n
    public class ValidateCSRFToken implements Filter {\n\n    private static final Logger LOGGER = LoggerFactory.getLogger(ValidateCSRFToken.class);\n\n    @Override\n    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {\n        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;\n        HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;\n        // Spring put the CSRF token in session attribute "_csrf"\n        CsrfToken csrfToken = (CsrfToken) httpServletRequest.getAttribute("_csrf");\n\n        // Send the …
Run Code Online (Sandbox Code Playgroud)

java csrf spring-security spring-boot csrf-token

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

laravel 6 csrf 令牌每 60 秒就会过期?

我正在使用laravel 6。我希望我的laravel CSRF 令牌每 60 秒过期一次

配置/会话

'一生' => 60,

csrf laravel csrf-token laravel-8

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

Spring webflux 与 jwt + csrf 令牌

我需要对我的后端实施 CSRF 保护。我正在使用以下配置。但应用程序允许没有 CSRF 令牌的 Post 和 Get 请求。

@Slf4j
@EnableWebFluxSecurity
@EnableReactiveMethodSecurity
public class SecurityConfig {

    @Bean
    SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
        http
                .csrf(csrf -> csrf.csrfTokenRepository(CookieServerCsrfTokenRepository.withHttpOnlyFalse()))
                .authorizeExchange()
                .anyExchange().authenticated()
                .and().oauth2ResourceServer().jwt();
        return http.build();
    }
}
Run Code Online (Sandbox Code Playgroud)

在 HTTP 请求中包含实际的 CSRF 令牌

 @ControllerAdvice
    public class SecurityControllerAdvice {
        @ModelAttribute
        Mono<CsrfToken> csrfToken(ServerWebExchange exchange) {
            Mono<CsrfToken> csrfToken = exchange.getAttribute(CsrfToken.class.getName());
            return csrfToken.doOnSuccess(token -> {
                exchange.getAttributes()
                        .put(CsrfRequestDataValueProcessor.DEFAULT_CSRF_ATTR_NAME, token);
            });
        }
    }
Run Code Online (Sandbox Code Playgroud)

我尝试使用邮递员的API。但这对我不起作用。

春季版

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.3</version>
        <relativePath/>
   </parent> 
Run Code Online (Sandbox Code Playgroud)

依赖项:

<dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-oauth2-resource-server</artifactId>
            <version>RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-oauth2-jose</artifactId>
            <version>RELEASE</version>
        </dependency> …
Run Code Online (Sandbox Code Playgroud)

csrf spring-security vue.js spring-webflux

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

Laravel:通过 axios 登录不需要 CSRF 令牌

当我使用表单发布到 /login 路由时,需要有效的 CSRF 令牌。

<form role="form" method="POST" action="/login">
Run Code Online (Sandbox Code Playgroud)

但是,我可以完全登录而无需令牌,只需使用:

axios.post("/login", { email:this.email, password:this.password })
    .then((res) => {
        window.location.href = "/dashboard";
    })
Run Code Online (Sandbox Code Playgroud)

这是一个安全风险,对吧?这是为什么?我该如何修复它?

forms authentication csrf laravel

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

CSRF和不断变化的令牌

我刚刚看过Doctype关于CSRF 一集.

在其中他们说CSRF的最佳预防措施是从一些用户唯一数据(例如散列会话ID)创建令牌,然后将POST与您的请求一起创建.

生成难以猜测的值(例如GUID)并将其存储为会话变量并将其作为隐藏字段放入页面中会不那么安全吗?

每次加载页面时,值都会改变,但POSTed数据的测试将在此之前进行.

在我看来,这同样安全.我错了吗?

security csrf

0
推荐指数
1
解决办法
523
查看次数

删除隐藏字段后,Django中的CSRF错误

在StackOverflow上得到了一些关于如何使用JavaScript删除所有隐藏字段的建议.

提交表单会将用户发送给/submit调用submit_form视图.在我的views.py文件中,我定义了我的索引页面(带有表单),以及接收提交的页面(我的/index页面为我打印错误,但这不应该影响任何东西):

def index(request, error_message = ''):
    t = get_template('index.html')
    html = t.render(Context( { 'ERROR_MESSAGE': error_message } ))
    return HttpResponse(html)

def submit_form(request):
    # get the POST data out of request and do something
    pass
Run Code Online (Sandbox Code Playgroud)

我已经能够通过将代码更改为:来抑制错误:

from django.contrib.csrf.middleware import csrf_exempt

@csrf_exempt
def submit_form(request):
    # get the POST data out of request and do something
    pass
Run Code Online (Sandbox Code Playgroud)

这实际上关闭了submit_form函数的CSRF.但是,我确信这不是理想的修复方法(现在我不会在我的表单中检查伪造).

我试过更复杂的修复,比如

  • 添加此代码以立即遵循jQuery代码(从提交中删除隐藏字段)
init:function(){
var ac=this

    # advice from StackOverflow to remove hidden 
    # …
Run Code Online (Sandbox Code Playgroud)

javascript forms django csrf

0
推荐指数
1
解决办法
404
查看次数

Django和JEditable:CSRF错误

我开始在Django中使用Jeditable插件并很快遇到CSRF错误:"CSRF验证失败.请求中止.","CSRF令牌丢失或不正确"

在撰写本文时,Jeditable插件似乎已于2008年更新 - 在此之后,Django开始要求CSR请求的CSRF令牌.

如何将Django CSRF数据添加到Jeditable?

django csrf jeditable

0
推荐指数
1
解决办法
692
查看次数

同步器令牌模式:如何防止 XSS 和 CSRF 的组合?

我一直在研究 OWASP 建议以防止 CSRF 攻击(https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet)。

现在,我不明白的是,这将如何防止 XSS 和 CSRF 攻击的组合攻击。假设我们有以下攻击场景:


  1. 攻击者能够执行存储型 XSS 攻击,以便每次用户访问该页面时都会执行攻击者在网站上插入的脚本。

  2. 该脚本将完全重新设计 DOM,例如,攻击者的脚本不再需要用户提供一些不相关的信息的原始表单,而是重新设计该表单,以便将该表单重新设计为添加具有管理员权限的用户的表单。请注意,用户不会看到这一点,因为字段的标签将保持不变。只是 POST 会有所不同。

  3. 攻击者知道该网站使用反 CSRF 令牌。查看 OWASP 建议:“(..)应用程序应包含一个具有通用名称(如“CSRFToken”)的隐藏输入参数”,攻击者知道大多数网站在页面上的某处都会有一个带有此 id 的隐藏字段。

  4. 攻击者确保该字段的值也在伪造的 POST 中提交。即使攻击者不知道这个隐藏字段的值,它也可以在 POST 中指定该值应与请求一起发送。这是可能的,因为用户的 DOM 已被修改,请求将来自用户的浏览器,用户的 cookie 也会随请求一起发送。

  5. 用户提交表单,然后创建假用户。


在我看来,仅使用 CSRF 令牌无法避免这种情况。或者同步器模式的隐含假设是 XSS 攻击已被消除?

security xss csrf owasp

0
推荐指数
1
解决办法
1202
查看次数

如何防止来自 Chrome 开发者工具的 ajax 调用?

我的 Ajax 调用受“Access-Control-Allow-Origin”保护

但是,仍然可以从 Google Chrome 工具进行一些 ajax 调用。

有没有办法阻止来自 Google Chrome 的 ajax 调用?

(设置CSRF保护的简单方法?)

javascript ajax csrf csrf-protection

0
推荐指数
1
解决办法
2723
查看次数

如何验证 CSRF 令牌?

我正在尝试使用 Hapi 的插件Crumb来实施针对 CSRF 攻击的解决方案,但似乎我没有得到解决方案的流程。我可以简单地在每个 http 响应中设置一个令牌作为 cookie。问题来了,如果客户端发出令牌,REST 如何验证 CSRF 令牌?REST 后端如何理解此随机字符串对该请求有效而另一个随机字符串无效?

csrf token hapijs

0
推荐指数
1
解决办法
5184
查看次数

Django - 登录 - 禁止(CSRF 令牌丢失或不正确。):

Forbidden (CSRF token missing or incorrect.)当我尝试使用登录页面时收到错误。

场景如下:

  1. 用户打开了两个选项卡。
  2. 两个选项卡都是登录页面。
  3. 在选项卡 1 中,用户成功登录,并被重定向到需要登录的新页面。
  4. 在选项卡2中,用户尚未刷新页面,仍处于登录页面。在Django后端,用户已经通过身份验证,但前端模板还没有注意到它。
  5. 在选项卡 2 中,当我单击登录按钮时,出现Forbidden (CSRF token missing or incorrect.)错误。
  6. 我确定这csrf_token是在表格中。
  7. 仅当我使用两个选项卡时才会出现此错误。
  8. 我正在使用 AJAX

为什么会发生这种情况?我该如何修复它?

我不知道这会有帮助,但这是我的views.py登录信息

class Login_View(LoginView):

    template_name = 'login.html'

    def post(self, request, *args, **kwargs):
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)

        response_data = {}
        if user is not None:
            if user.is_active:
                login(request, user)
                response_data['result'] = 'success'
            else:
                return HttpResponse("Inactive user.")
        else:
            response_data['result'] = 'fail'

        return HttpResponse(json.dumps(response_data), content_type="application/json")
Run Code Online (Sandbox Code Playgroud)

django ajax csrf django-csrf csrf-protection

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

部署时 Django 管理员登录“CSRF cookie 未设置”,但可在本地主机上运行

我向 CORS_ALLOWED_ORIGINS 和 CSRF_TRUSTED_ORIGINS 以及 ALLOWED_HOSTS 添加了域的多个变体。我添加django.template.context_processors.csrf到 context_processors 中。我没有将 CSRF_COOKIE_SECURE 和 SESSION_COOKIE_SECURE 设置为 true (我希望我可以更改)。我想不出还有什么可以让它在 Django admin 上工作,并且在我设置会话身份验证(包括配置 csrf 和会话 cookie)后它才停止工作。当我没有对前端进行任何身份验证时,Django 登录工作正常,甚至像我说的那样,它在本地主机上工作正常。

我真的很感激任何有关我可以尝试解决此问题的其他建议。

更新:现在我收到此错误消息 Referer checking failed - https://myapp.herokuapp.com/admin/login/?next=/admin/ does not match any trusted origins.

我认为问题可能在于它是一个 heroku 子域,所以我添加了一个域和一个 SSL 证书。新域出现完全相同的错误。

我的 CORS_ALLOWED_ORIGINS 包括https://myapp.herokuapp.comandhttps://www.example.com和,因为斜杠不断从浏览器复制,https://www.example.com/. 即使有 SSL 证书,我也包含了每个地址的 http:// 版本。

django csrf django-admin django-sessions django-csrf

0
推荐指数
1
解决办法
2501
查看次数