通过JavaScript AJAX向PHP发送密码的正确方法是什么?

通过JavaScript AJAX向PHP发送密码的正确方法是什么?,javascript,php,ajax,Javascript,Php,Ajax,我尝试了一些方法,我确认这是一个特殊的字符问题,也就是说,我尝试了一个简单的密码组合,只包括字母/数字,而且有效 自从我停止使用jQuery以来,这是我第一次遇到密码验证不起作用的问题。正如我上面提到的,我确实确保了密码没有任何问题 因此,我输入了密码,并使用如下用户名加入其中: var params = null, paramObj = {}; paramObj['user'] = loginInpUser.value; paramObj['pass'] = loginInpPass.

我尝试了一些方法,我确认这是一个特殊的字符问题,也就是说,我尝试了一个简单的密码组合,只包括字母/数字,而且有效

自从我停止使用jQuery以来,这是我第一次遇到密码验证不起作用的问题。正如我上面提到的,我确实确保了密码没有任何问题

因此,我输入了密码,并使用如下用户名加入其中:

var params = null,
    paramObj = {};
paramObj['user'] = loginInpUser.value;
paramObj['pass'] = loginInpPass.value;
params = encodeURI('post_params='+JSON.stringify(paramObj));
在PHP方面,我收到如下帖子:

$post_params = json_decode($_POST['post_params'], true);
$user = $post_params['user'];
$pass = $post_params['pass'];
我确实确保我从客户端发送的内容中得到匹配的值,以及PHP从ie获得的内容。回显$user和$pass,它们完全匹配。。。有关的特殊字符包括:

)(#$$%)(
我甚至没有尝试在其中加入一个&这可能会导致在使用XMLHttpRequest发送参数之前如何连接参数的问题

那么,在特殊字符仍然被正确解析的情况下(密码\u验证哈希与密码匹配),正确的方法是什么呢

我之所以不使用jQuery,是因为使用异步标记可以降低文件下载速度

编辑:

散列的奇怪事情:

我只需要一个基本的登录系统,这样我就不用麻烦注册表单了,我创建了一个哈希函数,它使用密码\u哈希并将其插入数据库。我注意到使用

$pass = "password with special chars";
将失败,错误将表明字符串中的某些内容是未定义的变量(字符串被切碎,我猜是解析错误)

但是使用

$pass = 'password with special chars';

这很好。

您应该以JSON或URL编码的形式发送整个请求;两者的结合相当奇怪:

var params = 'user=' + encodeURIComponent(loginInpUser.value) + '&pass=' + encodeURIComponent(loginInpPass.value);
或:


这将正确地保留任意“特殊”字符。

“请注意,encodeURI本身无法形成正确的HTTP GET和POST请求,例如XMLHTTPRequests,因为“&”、“+”和“=”未编码,它们在GET和POST请求中被视为特殊字符。但是,encodeURIComponent会对这些字符进行编码。”旁注:这是一个不使用jQuery的奇怪原因。你可以使用另一个更小的库,比如Axios——自己创建XMLHTTPRequests是很愚蠢的。我也尝试过,encodeURIComponent,谢谢你的链接,我会查看它的。还有一个问题是,我是否在PHP端使用urldecode处理这两种情况。我认为不是第一种情况(使用urlencode)。我理解这可能看起来很奇怪,但我们的应用程序部署在网络速度为0.5Mbps或更低的地方。1KB的文件下载几乎需要整整一秒钟的时间。由于我已经习惯使用jquerytank you,所以它产生了一些问题。我终于成功了。我最终使用了第二个版本。我确实想提到,出于某种原因,在生成哈希时,如果我将$pass设置为PHP端用双引号括起来的字符串,它将失败,但使用单引号和哈希/存储在db中,密码匹配。。。我不知道是怎么回事。我将把它添加到我的问题中,以供任何碰巧有这个问题的人检查。
$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'];