Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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 Symfony2 CRSF保护是如何工作的?_Security_Symfony_Csrf_Csrf Protection - Fatal编程技术网

Security Symfony2 CRSF保护是如何工作的?

Security Symfony2 CRSF保护是如何工作的?,security,symfony,csrf,csrf-protection,Security,Symfony,Csrf,Csrf Protection,我正在尝试测试由Symfony2完成的CRSF保护系统,非常感谢他们。 my security.yml模板:(我修改了默认模板。) 以我的名义: <input type="hidden" name="_csrf_token" value="{{ csrf_token("authenticate") }}"> 这会产生如下结果: <input type="hidden" name="_csrf_token" value="cKzXBHRDX_sHuT4qt9TAJIwgRv

我正在尝试测试由Symfony2完成的CRSF保护系统,非常感谢他们。
my security.yml模板:(我修改了默认模板。)

以我的名义:

<input type="hidden" name="_csrf_token" value="{{ csrf_token("authenticate") }}">

这会产生如下结果:

<input type="hidden" name="_csrf_token" value="cKzXBHRDX_sHuT4qt9TAJIwgRvtRMtPnFDtitrSZDuw">
<input type="hidden" name="_csrf_token" value="MODIFIEDcKzXBHRDX_sHuT4qt9TAJIwgRvtRMtPnFDtitrSZDuw">

我不知道symfony如何处理令牌的验证,但在提交登录之前,我使用firebug手动更改了令牌的值,如下所示:

<input type="hidden" name="_csrf_token" value="cKzXBHRDX_sHuT4qt9TAJIwgRvtRMtPnFDtitrSZDuw">
<input type="hidden" name="_csrf_token" value="MODIFIEDcKzXBHRDX_sHuT4qt9TAJIwgRvtRMtPnFDtitrSZDuw">

当我提交我的登录时,我就登录了。这意味着代币没有影响力。 我哪里做错了


猎鹬

  • Symfony版本是2.5.2
  • 当我手动将会话变量“logged”设置为true时,系统将我登录。从数据库读取并比较密码后会发生这种情况
  • 表单Html

    <form id="Loginform" onsubmit="OrganicLogin();return false;">
         <input type="hidden" name="_csrf_token" value="{{ csrf_token("authenticate") }}">
        <div id="Loginresponse" style="display:none;"></div>
            <div class="form-group" style="overflow:hidden;">
            <label style="margin-top:10px;" for="inputUsername" class="col-lg-2 control-label">Username</label>
            <div class="col-lg-10">
            <input type="text" class="form-control" id="inputUsername" placeholder="Username" style="width:215px;float:right;">
            </div>
            </div>
            <div class="form-group" style="overflow:hidden;" >
            <label style="margin-top:10px;" for="inputPassword" class="col-lg-2 control-label">Password</label>
            <div class="col-lg-10">
            <input type="password" class="form-control" id="inputPassword" placeholder="Password" style="width:215px;float:right;">
            </div>
            </div>
            <div class="form-group" style="overflow:hidden;text-align:center;" >
            <button type="submit" class="btn btn-primary btn-block" id="submitButton">Access</button>
            </div></form>
    
    
    用户名
    密码
    通道
    
  • 对!!是的

  • 实际上,我一直在争论的是,我以一种本地方式完成了登录过程,表单,用JS读取数据,向控制器发送POST请求,控制器检查输入并设置会话

  • 不,都是手工做的

  • 实际上,这是我第一次使用security.yml,我刚刚删除了一些我认为对这个线程不有用的部分


  • 我猜你的代币没有被贴出来。将模具插入:

    namespace Symfony\Component\Form\Extension\Csrf\CsrfProvider;
    
    class DefaultCsrfProvider implements CsrfProviderInterface
    {
        public function isCsrfTokenValid($intention, $token)
        {
            die('csrf token ' . $intention . ' ' . $token);
            return $token === $this->generateCsrfToken($intention);
        }
    
    如果到达骰子,那么您知道您的配置是正确的,当然您可以看到实际发布的令牌

    不用说,您还应该使用clearcache

    =======================================================

    更新1-在多次注释之后,我们确定没有调用die()。进步

    不幸的是,我们仍然需要验证海报是如何配置其系统的

    下一步-在不通过firebug调整csrf令牌的情况下登录,并验证是否达到die语句

    以这样或那样的方式报告

    不用说(但我无论如何都会这么说),确保在尝试重新登录之前注销

    ========================================================

    更新2-即使使用正常登录,也无法访问die语句

    现在是我最喜欢的部分。猎鹬。基本上,我在阅读问题时做了一些假设。需要通过问一些基本问题来确定哪些假设是错误的

  • 您正在使用哪个版本的Symfony 2。我假设至少是S2.1

  • 您如何知道系统已让您登录?您正在使用调试工具栏,它是否显示您正在进行身份验证?当您尝试使用错误的密码登录时会发生什么情况

  • 使用浏览器的“查看源”功能,将生成的表单复制到问题中。特别是,我希望看到action属性,但我也希望看到输入元素

  • 您是否确实将die语句添加到了vendor/symfony/symfony/src/symfony/Component/Form/Csrf/CsrfProvider/DefaultCsrfProvider.php中?你编辑完文件后保存了吗

  • 您实际上使用的是标准的form_登录过程,对吗?您没有任何代码,例如,检查用户密码

  • 您是否正在使用其他捆绑包,如FOSUserBundle

  • 您问题中的security.yml文件真的是您的实际文件吗?复制后你没有“清理”吗

  • 您是否已将应用程序签入github?如果是这样的话,你能提供一个链接吗?查看整个应用程序可能是解决此问题的最快方法

  • 现在这应该足够了。用你的答案更新你的问题

    =========================================================================

    更新3-绘图变厚

    当我输入上述问题时,我们发现基本登录系统本身没有正确配置。调试工具栏指示用户未通过身份验证。更多的进步!正如经常发生的那样,症状掩盖了实际问题

    安全系统可以说是Symfony 2中典型开发人员需要与之交互的最复杂的组件。配置时很容易混淆,并且很难排除故障。一个小小的打字错误就能把事情搞糟。对于开发人员来说,了解安全性是如何实现的也是非常重要的。当然,除非你是像Target或Home Depot这样的大公司

    我的建议是使用composer创建一个新的Symfony 2项目。然后逐步完成并配置安全系统。让这成为了解安全性的一种参考应用程序

    在这个过程结束时,我怀疑您已经解决了问题,并且可以将解决方案应用到您现有的应用程序中。作为奖励,你将有一些东西可以参考,以解决未来的问题

    ==================================================================

    更新4-激动人心的结论

    所以现在我们发现正在使用一个定制的、朴素的登录系统

    我仍然建议重新开始一个新项目,让事情按照Symfony 2的方式进行。之后,如果您真的愿意,可以调整登录表单以使用javascript

    如果您真的想使用自己的系统,请从这里开始:


    但是,您可能会因为没有特殊原因而放弃Symfony的主要优势之一。

    它的工作方式是,Symfony生成一个CSRF令牌,并自动将其插入表单中。它将此令牌存储在当前会话中。提交表单时,它会将提交的令牌与会话中存储的值进行比较。关于你的具体情况,它是
    ...
    
    form_login:
        check_path: _security_check
        login_path: login
    ...
    
    access_control:
        - { path: ^/demo/secured/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }