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 上发送明文密码。为什么?因为这是正常且符合预期的行为。
在我的 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 上发送明文密码。为什么?因为这是正常且符合预期的行为。