我要求实施 CSRF 来防止对 java 服务器应用程序的攻击。这是一个提供大量 Web REST API 服务的应用程序。\n我查看了许多指南并在堆栈上进行了搜索,但仍然有一些顾虑。\n我知道对于 GET 请求来说是不需要的。
\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) 我正在使用laravel 6。我希望我的laravel CSRF 令牌每 60 秒过期一次。
配置/会话
'一生' => 60,
我需要对我的后端实施 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) 当我使用表单发布到 /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)
这是一个安全风险,对吧?这是为什么?我该如何修复它?
在其中他们说CSRF的最佳预防措施是从一些用户唯一数据(例如散列会话ID)创建令牌,然后将POST与您的请求一起创建.
生成难以猜测的值(例如GUID)并将其存储为会话变量并将其作为隐藏字段放入页面中会不那么安全吗?
每次加载页面时,值都会改变,但POSTed数据的测试将在此之前进行.
在我看来,这同样安全.我错了吗?
我在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.但是,我确信这不是理想的修复方法(现在我不会在我的表单中检查伪造).
我试过更复杂的修复,比如
init:function(){
var ac=this
# advice from StackOverflow to remove hidden
# …Run Code Online (Sandbox Code Playgroud) 我一直在研究 OWASP 建议以防止 CSRF 攻击(https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet)。
现在,我不明白的是,这将如何防止 XSS 和 CSRF 攻击的组合攻击。假设我们有以下攻击场景:
攻击者能够执行存储型 XSS 攻击,以便每次用户访问该页面时都会执行攻击者在网站上插入的脚本。
该脚本将完全重新设计 DOM,例如,攻击者的脚本不再需要用户提供一些不相关的信息的原始表单,而是重新设计该表单,以便将该表单重新设计为添加具有管理员权限的用户的表单。请注意,用户不会看到这一点,因为字段的标签将保持不变。只是 POST 会有所不同。
攻击者知道该网站使用反 CSRF 令牌。查看 OWASP 建议:“(..)应用程序应包含一个具有通用名称(如“CSRFToken”)的隐藏输入参数”,攻击者知道大多数网站在页面上的某处都会有一个带有此 id 的隐藏字段。
攻击者确保该字段的值也在伪造的 POST 中提交。即使攻击者不知道这个隐藏字段的值,它也可以在 POST 中指定该值应与请求一起发送。这是可能的,因为用户的 DOM 已被修改,请求将来自用户的浏览器,用户的 cookie 也会随请求一起发送。
用户提交表单,然后创建假用户。
在我看来,仅使用 CSRF 令牌无法避免这种情况。或者同步器模式的隐含假设是 XSS 攻击已被消除?
我的 Ajax 调用受“Access-Control-Allow-Origin”保护
但是,仍然可以从 Google Chrome 工具进行一些 ajax 调用。
有没有办法阻止来自 Google Chrome 的 ajax 调用?
(设置CSRF保护的简单方法?)
我正在尝试使用 Hapi 的插件Crumb来实施针对 CSRF 攻击的解决方案,但似乎我没有得到解决方案的流程。我可以简单地在每个 http 响应中设置一个令牌作为 cookie。问题来了,如果客户端发出令牌,REST 如何验证 CSRF 令牌?REST 后端如何理解此随机字符串对该请求有效而另一个随机字符串无效?
Forbidden (CSRF token missing or incorrect.)当我尝试使用登录页面时收到错误。
场景如下:
Forbidden (CSRF token missing or incorrect.)错误。csrf_token是在表格中。为什么会发生这种情况?我该如何修复它?
我不知道这会有帮助,但这是我的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) 我向 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:// 版本。
csrf ×12
django ×4
ajax ×2
csrf-token ×2
django-csrf ×2
forms ×2
javascript ×2
laravel ×2
security ×2
django-admin ×1
hapijs ×1
java ×1
jeditable ×1
laravel-8 ×1
owasp ×1
spring-boot ×1
token ×1
vue.js ×1
xss ×1