Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security CSRF保护-JWT和CORS白名单的组合是否足够?_Security_Jwt_Csrf_Phoenix Framework - Fatal编程技术网

Security CSRF保护-JWT和CORS白名单的组合是否足够?

Security CSRF保护-JWT和CORS白名单的组合是否足够?,security,jwt,csrf,phoenix-framework,Security,Jwt,Csrf,Phoenix Framework,我正在努力解决React/Phoenix应用程序中的CSRF漏洞,在我看来,我的应用程序是安全的。。。但我不是这些方面的专家,我想求助于社区,看看我是否忽视了什么或是太天真了 Phoenix是一个纯API,与React客户端分开运行,因此我正在处理CORS-允许来源的白名单在Phoenix路由器中设置。ex: pipeline :api do plug CORSPlug, [origin: "localhost:3000"] plug :accepts, ["json"] plug

我正在努力解决React/Phoenix应用程序中的CSRF漏洞,在我看来,我的应用程序是安全的。。。但我不是这些方面的专家,我想求助于社区,看看我是否忽视了什么或是太天真了

Phoenix是一个纯API,与React客户端分开运行,因此我正在处理CORS-允许来源的白名单在Phoenix
路由器中设置。ex

pipeline :api do
  plug CORSPlug, [origin: "localhost:3000"]
  plug :accepts, ["json"]
  plug Guardian.Plug.VerifyHeader, realm: "Bearer"
  plug Guardian.Plug.LoadResource
end
正如您所看到的,我正在使用Guardian(它使用JWT进行用户身份验证)来处理授权

授权客户端将JWT存储在
localStorage
中,Guardian设置为在请求的
Authorization
头中作为
承载者查找该值。。。受保护的Phoenix控制器包括:

plug Guardian.Plug.EnsureAuthenticated
我设置了一个测试攻击者,运行在
localhost:5000
上,试图模拟CSRF攻击。首先,我尝试了AJAX攻击—我从登录窗口的
localStorage
复制了一个有效的JWT值,并将其设置在模拟攻击者的请求头中。正如所料,这会失败,因为
localhost:5000
未被列入白名单

The 'Access-Control-Allow-Origin' header contains the invalid value 'null'. Origin 'http://localhost:5000' is therefore not allowed access.
为了测试,我在Phoenix白名单中添加了
localhost:5000
,请求确实有效。。。所以看起来,即使攻击者设法窃取了一个有效的JWT,他们也会被白名单阻止

然后,我测试了从OWASP文档中借用的自动表单提交:

<body onload='document.CSRF.submit()'>
    <form action='http://localhost:4000/api/v1/user' method='POST' name='CSRF'>
        <input type='hidden' name='name' value='Hacked'>
        <input type='hidden' name='password' value='Hacked'>
    </form>
<body>
所以我的印象是AJAX攻击将失败,即使使用有效的JWT,因为CORS白名单。。。简单请求将失败,因为它们不包括
授权


在使用JWTs进行授权时,我已经阅读了很多关于CSRF保护的内容,但似乎没有两个人能够就什么是安全的、什么是不安全的达成一致。我是否遗漏了什么,或者CORS白名单和Guardian JWT检查的组合足以保护CSRF?

您提到了两种防止CSRF的方法:1)CORS&2)JWT存储在本地存储中并与用户会话关联。我想谈谈这两个问题:

1) CORS通过防止来自非源源的尝试代表用户发出HTTP请求,有助于防止某些类型的CSRF攻击。这可以防止从外部来源获取/发布,做得好。它不会阻止来自内部源的CSRF攻击。接下来是#2


2) 存储在localStorage中的JWT通过身份验证/承载头传递可以有所帮助,但始终容易受到XSS攻击。XSS预防至关重要。现在,JWT可以通过javascript访问,并且可以通过任何请求进行传递。为了提供帮助,网站应该阻止javascript访问令牌。推荐的方法是将JWT存储在HTTPOnly cookie中。此cookie是对身份验证/承载头的补充。在Phoenix服务器端,API需要执行的第一个授权步骤是确保来自HTTPOnly cookie的JWT与身份验证/承载头相同。只有这样才能成功调用API。

太好了,非常感谢您的解释。关于你的第二点,我已经看过各种各样的典故,但这让我非常清楚——我以前不明白。我有一个关于第二点的问题。将JWT另外保存到HTTPOnly cookie中真的增强了安全性吗?想象一下,攻击者能够向调用邪恶请求(XSS)的网站注入一段JavaScript。当受害者打开站点时,请求将被执行——cookie也将与请求一起发送,因为目标域与cookie匹配。我是不是遗漏了什么?没有人能在你的web应用程序上放置恶意JS,保护表单等难道不是更重要吗?@Jonas:好问题,你是对的,#2不能阻止XSS攻击。注入JS仍然可以代表用户调用恶意请求。见OWASP的
[info] POST /api/v1/user
[debug] Processing with MyApp.UserController.create/2
  Parameters: %{"name" => "Hacked", "password" => "[FILTERED]"}
  Pipelines: [:api]
[info] Sent 401 in 21ms
[debug] MyApp.UserController halted in 
Guardian.Plug.EnsureAuthenticated.call/2