Symfony:使用 CSRFProtection 安全删除链接
我有一个删除链接,可以按 ID /comment/:id/delete
删除 Comment 对象。
为了保护此链接,我向该链接添加了一个 csrf 令牌
$CSRFTokenForm = new BaseForm();
$link = url_for(..., array('_csrf_token' => $CSRFTokenForm->getCSRFToken()));
,并在 executeDelete 中使用 checkCSRFProtection()
方法,一切正常。
唯一的事情是每个评论都由一个部分显示,每个部分创建它自己的 BaseForm() 以便创建令牌,这是浪费时间,因为它们都是相同的。
您是否对如何提高效率有更好的想法,例如静态 getCSRFToken()
方法或创建全局 BaseForm()
?
I have a delete link to delete a Comment object by ID /comment/:id/delete
In order to secure this link I add a csrf token to the link
$CSRFTokenForm = new BaseForm();
$link = url_for(..., array('_csrf_token' => $CSRFTokenForm->getCSRFToken()));
and in the executeDelete i use the checkCSRFProtection()
method, and it all works fine.
The only thing is that each comment is displayed by a partial, and each partial creates it's own BaseForm()
in order to create the token, which is waste of time since they're all the same..
Do you have a better idea on how to make it more efficient, like maybe a static getCSRFToken()
method or creating a global BaseForm()
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
使用SF的方法=>删除。它为您创建 CSRF 令牌:
Use SF's method => delete. It creates the CSRF token for you:
是的,这是一个 jQuery 插件错误。如果您使用 sfJqueryReloadedPlugin - 1.4.3,您需要更改插件目录中文件 jQueryHelper 的源代码,并将“BaseForm”而不是“sfForm”放在“csrf => 1”部分中
Yes it's a jQuery Plugin error. If you are using sfJqueryReloadedPlugin - 1.4.3 you need to change the source code of the file jQueryHelper in the plugin's directory and put "BaseForm" instead of "sfForm" in the "csrf => 1" sectuo
使用 jQuery 插件尝试:
jq_link_to_remote('comment/' . $comment->getId() . '/delete', array('csrf' => 1))
在 <一个href="http://trac.symfony-project.org/browser/plugins/sfJqueryReloadedPlugin/1.2/trunk/lib/helper/jQueryHelper.php#L340" rel="nofollow">源代码 他们就这么做了也有一个 BaseForm 实例。
With the jQuery Plugin try:
jq_link_to_remote('comment/' . $comment->getId() . '/delete', array('csrf' => 1))
Found it in the sourcecode and they do it with a BaseForm instance, too.