【问题标题】:What is the right way to send a password through JavaScript AJAX to PHP?通过 JavaScript AJAX 向 PHP 发送密码的正确方法是什么?
【发布时间】:2017-05-30 03:28:29
【问题描述】:

我尝试了几种方法,我已经确认这是一个特殊字符问题,即。我尝试了一个简单的密码组合,只包含字母/数字并且有效。

自从我停止使用 jQuery 以来,这是我第一次遇到 password_verify 不起作用的问题。如上所述,我确实确保 password_verify 没有任何问题。

所以我得到了我的密码输入,然后我用这样的用户名加入它:

var params = null,
    paramObj = {};
paramObj['user'] = loginInpUser.value;
paramObj['pass'] = loginInpPass.value;
params = encodeURI('post_params='+JSON.stringify(paramObj));

在 PHP 方面,我在 POST 中收到这样的消息:

$post_params = json_decode($_POST['post_params'], true);
$user = $post_params['user'];
$pass = $post_params['pass'];

我确实确保从我在客户端发送的内容中获得匹配的值,即 PHP 获得的内容。回显 $user 和 $pass,它们完全匹配……有问题的特殊字符是:

)(#$$%)(

我什至没有尝试在其中添加 & ,这可能会导致在使用 XMLHttpRequest 发送参数之前如何连接参数出现问题。

那么在仍然正确解析特殊字符(password_verify 将哈希与密码匹配)的情况下,正确的方法是什么?

我不使用 jQuery 的原因是降低文件下载速度-使用异步标签。

编辑:

哈希的奇怪之处:

我只需要一个基本的登录系统,所以我没有使用注册表单,我创建了一个使用 password_hash 的散列函数并将其插入到数据库中。我注意到使用

$pass = "password with special chars";

会失败,错误会说字符串中的某些内容是未定义的变量(字符串被剪切,我猜是解析错误)。

但是使用

$pass = 'password with special chars';

这很好。

【问题讨论】:

  • developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… "请注意,encodeURI 本身不能形成正确的 HTTP GET 和 POST 请求,例如 XMLHTTPRequests,因为“&”、“+”和“=”没有被编码,它们是在 GET 和 POST 请求中被视为特殊字符。但是,encodeURIComponent 确实对这些字符进行了编码。"
  • 旁注:这是不使用 jQuery 的奇怪原因。你可以使用另一个更小的库,比如 Axios - 自己创建 XMLHTTPRequests 是很愚蠢的。
  • 我也试过了,encodeURIComponent,谢谢你的链接,我会检查的。还有一个问题是我是否在 PHP 端使用 urldecode 来处理这两种情况。我认为不是第一种情况(使用 urlencode)。
  • 我知道这可能看起来很奇怪,但我们的应用程序部署在网络速度为 0.5Mbps 或更低的地方。 1KB 的文件几乎需要一秒钟的时间来下载。由于我习惯于使用 jQuery,因此出现了一些问题

标签: javascript php ajax


【解决方案1】:

您应该将整个请求作为 JSON 或 URL 编码发送;两者的混合相当奇怪:

var params = 'user=' + encodeURIComponent(loginInpUser.value) + '&pass=' + encodeURIComponent(loginInpPass.value);
$user = $_POST['user'];
$pass = $_POST['pass'];

或者:

var params = JSON.stringify({ user: loginInpUser.value, pass: loginInpPass.value })
$params = json_decode(file_get_contents('php://input'), true);
echo $params['user'], $params['pass'];

这样可以正确地保留任意“特殊”字符。

【讨论】:

  • 谢谢。我终于让它工作了。我最终使用了第二个版本。
  • 我确实想提一下,由于某种原因,在生成哈希时,如果我将 $pass 设置为在 PHP 端用双引号括起来的字符串,它会失败,但使用单引号和 hash/存储在数据库中,密码匹配...我不知道这是怎么回事。对于碰巧遇到此问题的任何人,我会将其添加到我的问题中,作为潜在的检查对象。
猜你喜欢
  • 2015-01-20
  • 2011-10-19
  • 1970-01-01
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-29
  • 1970-01-01
相关资源
最近更新 更多