gpt4 book ai didi

php - 向安全操作发送 POST 请求

转载 作者:可可西里 更新时间:2023-11-01 12:18:38 25 4
gpt4 key购买 nike

我有一项操作需要 sfGuard 保护的 POST 数据。这意味着如果用户未登录,则 POST 数据将发送到登录表单。按说这不是问题,用户继续登录,又得重新提交数据。

不幸的是,登录表单似乎正在使用 POST 数据,就好像它是与表单本身一起提交的一样。这意味着它提示缺少所需的用户名和密码字段,并且提示缺少 CSRF token 。最后一个问题在提交表单后并没有消失,这意味着用户无论如何都无法登录。

如果用户未登录,则不应显示表单,但用户可以在表单仍打开的情况下注销。所以我问是为了保持界面无懈可击和无错误。

这是 sfGuard 的缺点,可以避免吗,还是我完全做错了什么?

澄清一下,路线如下所示:

add_subgroup:
url: /group/:id/add
class: sfPropelRoute
options:
model: Group
type: object
param: { module: subgroups, action: create }
requirements:
group_id: \d+
sf_method: [post]

用于提交请求的表单如下:

<form action="<?php echo url_for('add_subgroup', $group) ?>" method="post">
<input type="hidden" name="group_id" value="<?php echo $group->getId() ?>" />
<input type="text" name="subgroup_id" />
<input type="submit" class="button" value="Add" />
</form>

最佳答案

这是 sfGuard 的缺点,因为登录操作将检查 POST 请求,如果是则绑定(bind)表单。

来自 BasesfGuardActions.class.php 中的代码:

if ($request->isMethod('post'))
{
$this->form->bind($request->getParameter('signin'));

我个人不太喜欢在 symfony 中的 Action 之间转发,就像在这种情况下一样,我认为重定向比转发更合适。这也解决了您的问题,因为这将导致新的 GET 请求。您可以通过扩展 sfGuardBasicSecurityFilter 来完成此行为。

class mySecurityFilter extends sfGuardBasicSecurityFilter
{

protected function forwardToLoginAction()
{
$context = $this->getContext();
// If you want to redirect back to the original URI (note: original POST data will be lost)
$context->getUser()->setReferer($context->getRequest()->getUri());
$url = sfConfig::get('sf_login_module') . '/' . sfConfig::get('sf_login_action');
$context->getController()->redirect($url);
throw new sfStopException();
}

}

现在在 app/myapp/config/filters.yml 中

security:
class: mySecurityFilter

关于php - 向安全操作发送 POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7096278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com