FOSUserBundle,密码 (plainPassword) 在提交 POST 表单时未加密

FOSUserBundle, password (plainPassword) are not encrypted on submit POST form

在我的 Symfony 项目中,我使用 FOS 用户包。

在我的 secutity.yml 中,我有这个是为了使用 bcrypt 编码器:

security:
    # FOS UserBundle needles
    encoders:
        Symfony\Component\Security\Core\User\User: bcrypt
        MyNamespace\MyBundle\Entity\User: bcrypt
        FOS\UserBundle\Model\UserInterface: bcrypt

我这样调用fos用户注册表单的嵌入形式:

$builder
  ->add('contactPhone')
  ->add('contactMobilePhone')
  ->add('user', 'fos_user_registration', array(
                                               'label' => false,
      ))

例如,它呈现给我的是:

但是当我提交表单时,我可以在网络控制台浏览器中看到我的密码是明文的,每个人都可以使用它们。

所以我可以在控制台浏览器中恢复我的 POST 请求的所有数据:

my_form[user][email]=test@test.com

my_form[contactPhone]=0404040404

my_form[contactMobilePhone]=0606060606

my_form[user][username]=test

my_form[user][plainPassword][first]=test // first password entry

my_form[user][plainPassword][second]=test // verification

my_form[save] // submit my_form[_token_consumer]=// no need to see him

你可以理解它是不安全的。我在提交表单时需要对密码进行编码,以免让任何人看到它们。

请注意,当我使用 FOSUserBundle 用户登录表单登录时,也发生了同样的事情。

通过 http 连接发送的每个数据都可以被您到服务器的路由中的某个人看到(中间人攻击)。

type="password"只隐藏屏幕上的字符,即使您计算机上的其他程序也可以读取数据。

保护数据的唯一方法是通过 SSL(HTTPS 而不是 HTTP)发送数据

我不想成为坏消息的传递者,但您遇到的这种流量是意料之中的。我假设在数据库中您的用户密码实际上是加密的。

表单数据本身不应包含任何类型的加密。一旦您将表单数据提交到服务器端,数据就会被加密。要正确加密使用输入,必须将明文值提交给服务器。如果您执行任何类型的 'pre-encryption',您将需要更改注册流程以验证哈希并允许将其插入数据库,但不建议这样做。

如果您担心其他人使用这些数据进行 XSS 攻击,那么 CORS/CSRF 就是您需要设置的以缓解该问题。

为什么我说你现在的问题不是问题呢?好吧,如果您使用注册表单访问几乎任何站点并提交它,您将在请求参数中看到明文密码,这是正常的。 Facebook 和 Google 都在 login/registration 上发送明文密码。为什么?因为这是正常且符合预期的行为。