【发布时间】:2014-11-04 05:00:20
【问题描述】:
我正在尝试测试 Symfony2 完成的 CRSF 保护系统,非常感谢他们。
我的security.yml模板:(我修改了默认的。)
security:
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
login:
pattern: ^/demo/secured/login$
security: false
secured_area:
pattern: ^/demo/secured/
form_login:
check_path: _security_check
login_path: _demo_login
csrf_provider: form.csrf_provider
logout:
path: _demo_logout
target: _demo
#anonymous: ~
#http_basic:
# realm: "Secured Demo Area"
access_control:
#- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
以我的形式:
<input type="hidden" name="_csrf_token" value="{{ csrf_token("authenticate") }}">
这会产生如下内容:
<input type="hidden" name="_csrf_token" value="cKzXBHRDX_sHuT4qt9TAJIwgRvtRMtPnFDtitrSZDuw">
我不知道 symfony 如何使用令牌处理验证,但在提交登录之前,我使用 firebug 手动更改了令牌的值,如下所示:
<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,我只是删除了一些我认为对这个线程没有用的部分
没有..
【问题讨论】:
-
我的登录网址是 /login
-
你可以通过 cURL 和 POST 方法测试 ist(只是不要设置
_csrf_token字段)并打印输出。 -
我需要在控制器中写什么吗?
-
不使用外部脚本(如果您的意思是 cURL 测试)。
-
我不是说 cUrl 测试,您的第一条评论是指仅设置 csrf_token 可以绕过保护?如果你知道请告诉我 symfony 如何比较 $_POST['csrf_token'] 和其他元素..我很困惑..
标签: security symfony csrf csrf-protection