我已经读了一段时间了,没有任何意义,而且解释相互矛盾,评论证明了这一点。
到目前为止,我的理解是 JWT 存储由服务器编码的信息,可以有过期时间,并且服务器及其密钥可以解码其中的信息(如果它有效)。说得通。
它对于可扩展性很有用,因此独立的 API 可以解码并验证令牌中的信息,只要它们拥有密钥。此外,不需要将信息存储在任何数据库中,这与会话不同。说得通。
如果令牌被盗,API 无法判断令牌是否由正确的人使用。这是上面的缺点。
通过减少令牌的过期时间,可以减少安全漏洞,从而减少窃贼未经许可使用令牌的时间。(附带问题,但如果他们能够偷一次,他们可能也会偷第二次)
但是减少令牌的有效时间意味着每次令牌过期时用户都需要登录,并且如上所述,这种情况相当频繁,因此不会提供太好的用户体验。说得通。
从现在开始,一切都没有意义了:
引入刷新令牌可以解决这个问题,因为它的过期时间更长。使用刷新令牌可以生成访问令牌,因此只要用户拥有刷新令牌(时间较长)就可以登录,而被盗的访问令牌仍然仅在短时间内有效。
对我来说,上述内容似乎增加了一层额外的复杂性,而安全性没有任何改进。即对我来说,上面的内容似乎等于一个长期存在的访问令牌。
为什么?因为对我来说,刷新令牌基本上是一个访问令牌(因为这就是它生成的)。因此,拥有刷新令牌意味着无限制的访问令牌,因此无限制地访问 API。
然后我读到一个答案,刷新令牌和访问令牌是一对一的映射,因此窃取访问令牌仍然意味着对 API 的未经授权的访问,但只持续很短的时间,并且窃取刷新令牌将生成不同的访问令牌,以便 API 可以检测到异常(同一帐户使用不同的访问令牌),从而使访问令牌失效。
看来我不是唯一一个对这个问题感到困惑的人。
如果上述情况不正确,刷新令牌有何真正帮助?
如果上述情况成立,并且确实存在刷新令牌和访问令牌的一对一映射:
如果有人能澄清这个问题那就太好了,因为从 5 个解释中,有 5 个相互冲突的陈述(有时相同的解释包含冲突的信息),并且许多开发人员都想了解这种方法。
考虑以下 link_to 示例:
link_to "Personal Website", @user.website
我如何保护它免受 XSS 攻击。用户表在外部数据库中,所以我不能相信它。我尝试过使用 sanitize 和 h 的不同方法,但是当我在本地数据库用户网站中替换javascript:alert('XSS')为 时,当我单击链接时,javascript 仍在执行。
提前致谢,
我有一个类似照片存储的应用程序(Rails 5.2),它使用ActiveStorage来存储实际的照片。一切都很好,我为用户生成了带水印的缩略图,以作为变体显示(原始信息不是公开的,实际上每个图像需要一些变体)。
如果必须更改生成此类变体的方式怎么办?S3存储并不便宜(图像数量在成千上万个),并且ActiveStorage根本不跟踪变体-它们仅由我精确生成它们的哈希值来识别。如果我更改变体哈希(例如更改缩略图大小),则会创建新的哈希,但是很多旧的blob将保留在未引用的存储中。
您如何处理旧版本?我希望变量存储能够像缓存一样工作,尤其是我的用户通常不会查看旧图像。如果某个变体比给定年龄大,我只想删除它-但我无能为力。还是我
我可以看一下存储中的实际blob-但没有区别,也没有元数据。在S3中,所有这些文件看起来都一样,关键只是其制作方式的哈希值,并且没有相关的元数据。
硬编码所有先前的变体生成的哈希值以在所有先前的映像上重新运行绝不是要走的路。
我也许可以在ActiveStorage中打补丁(Variation也许?)来添加元数据(指示哪些blob是变量,哪些是原始对象)?然后,我可以进行后端作业以删除旧版本。这行得通吗?如何使它与ActiveStorage的将来版本兼容?
我应该自己跟踪变体吗?那么为什么在ActiveStorage中它不是一个选项?显然,这也需要更改ActiveStorage类。
是否可以将变体存储在其他存储中(例如另一个S3存储桶)?这也将解决问题,因为我随后将知道哪些斑点是变体,并且可以轻松清除旧斑点。
你们如何处理旧的不必要的变体?
因此,我正在开发我的第一个全栈应用程序(Spring Boot Rest API 和 Vue.js 前端),并且我在使用 sonarqube 时遇到了一个问题。我的声纳发出以下警告:
确保在这里禁用 Spring Security 的 CSRF 保护是安全的。
它来自这个文件:
@Configuration
@AllArgsConstructor
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class
WebSecurityConfig extends WebSecurityConfigurerAdapter {//provides security for endpoints
@Autowired
private JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint;
@Autowired
private UserDetailsService jwtUserDetailsService;
@Autowired
private JwtRequestFilter jwtRequestFilter;
private final AccountService accountService;
private final BCryptPasswordEncoder bCryptPasswordEncoder;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
// configure AuthenticationManager so that it knows from where to load
// user for matching credentials
// Use BCryptPasswordEncoder
auth.userDetailsService(jwtUserDetailsService).passwordEncoder(bCryptPasswordEncoder);
} …Run Code Online (Sandbox Code Playgroud) 我正在使用 Postman Rest 客户端来访问其余服务。当我尝试从 Postman 客户端执行其余服务时出现以下错误。
HTTP Status 403 - Cross-site request forgery verification failed. Request aborted.
Run Code Online (Sandbox Code Playgroud)
其余服务似乎由 CSRF 令牌的实现来保护。有没有人知道如何获取 CSRF 令牌并将其重用于未来的请求?
我正在构建一个 Django 应用程序,人们可以在其中注册活动。每个人都可以注册,没有用户帐户或登录,即没有身份验证。验证是通过一封带有链接的电子邮件完成的,必须单击该链接才能激活注册。我不确定是否需要为这些表单启用 CSRF 保护。归结为以下问题:CSRF 保护对于每个 POST 请求(不离开域)都是必要的,还是仅对于登录用户的 POST 请求是必要的?
CSRF 攻击可以做什么?我知道您可以使用它来规避同源策略并以用户的名义发布您想要的任何内容,但是您也可以使用它来更改用户的真实帖子或窃取他们的数据吗?如果恶意网站可以了解用户发布的数据或悄悄地更改他们的请求,这将是我使用它的理由。如果这只是意味着另一个网站可以创建额外的注册,那么就不行,因为其他人也可以。(我知道在任何地方使用它并不花费太多,事实上我可能会这样做,但我试图更好地理解原理)
我创建了一个在 .NET 4.7.2 上运行的简单 .NET Web 表单应用程序。
该应用程序有一个文本框、一个提交按钮和一个标签。当您单击提交按钮时,应用程序将显示文本框内容。
为了使该应用程序容易受到跨站点脚本攻击,我在其 web.config 中禁用了请求验证 (validateRequest=false)。这允许我在文本字段中输入值: XSS<img src=x onerror=confirm("HACKED")> 并提交。
单击“提交”后,我会看到弹出窗口
为了防止 XSS 攻击,我获取了 AntiXss 库的 NUGet 包,并按照Microsoft AntiXss 文档中的说明在我的 web.config 中引用它。
然而,没有任何编码,并且我的 Web 应用程序仍然容易受到 XSS 攻击,直到我在代码中显式编码该值。
protected void Button1_Click(object sender, EventArgs e)
{
//Label1.Text = TextBox1.Text;
Label1.Text = AntiXssEncoder.HtmlEncode(TextBox1.Text,true);
}
Run Code Online (Sandbox Code Playgroud)
通过使用 AntiXss 库编码的值,应用程序现在显示该值而不是执行该脚本并创建弹出窗口。
所以我有三个问题:
在 Rails API 应用程序中,我们没有现成的 CSRF 保护。特别是,不建议将访问令牌(例如 JWT)存储在 localStorage 中,建议存储在 cookie 中(带有 httpOnly 标志、SameSite 等)。但这一次我们很容易受到潜在的 CSRF 攻击。在全栈生成的 Rails 应用程序中,每次打开表单时都会生成并嵌入一个 CSRF 令牌。但是,我不知道也找不到任何我们如何在 Rails API 应用程序中使用令牌来防止 CSRF 的信息。我们有最佳实践吗?或者有人可以建议一种方法吗?我使用访问和刷新 JWT。
帮助设置标题以消除该错误消息: "Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'."
HTML:
<meta name="_csrf" th:content="${_csrf.token}"/>
<meta name="_csrf_header" th:content="${_csrf.headerName}"/>Run Code Online (Sandbox Code Playgroud)
我的JS代码:
var recipe = getRecipe();
var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
console.log(token);
console.log(header);
console.log(recipe);
var headers = {};
// How set up header for include CSRF-Token
$.ajax({
url: "/recipe",
type: "POST",
dataType: "json",
contentType: "application/json",
headers: headers,
data: JSON.stringify(recipe, null, "\t"),
success: function(data) {
console.log(data);
},
error : getErrorMsg
});
Run Code Online (Sandbox Code Playgroud)
我的控制器代码:
@RequestMapping(value = "/recipe", method = …Run Code Online (Sandbox Code Playgroud) 我创建了一个表格,您必须在其中插入电子邮件地址。
我已经有一种验证方法。但是我需要确保电子邮件确实存在。
可能吗?
我最近刚刚开始在react+express应用程序中使用jwt,并遇到了在哪里存储jwt令牌的问题。看来两个主要选项是 localStorage 和 cookies,它们都容易受到各种攻击(XSS 和 CRSF)。
但我发现react据说是XSS安全的(他们说React受XSS保护是什么意思?)那么可以使用localStorage来存储jwt吗?如果不是,行业标准是什么?