我有一个应用程序,它使用javascript来获取字符串并将其发布到服务器上的接收方php文件中以进行进一步处理。 接收者的工作是解析字符串,传递东西,并向javascript报告事情的进展情况。 最近我试图将基于密码的安全性添加到整个 shebang 中,但现在 receiver.php 会传回一个空响应。
我发现,如果我在接收器的任何地方调用password_verify(无论我用它做什么......我什至可以在不使用它的情况下调用它)脚本中的以下回声不会运行 - 来自这些回声的任何响应文本都将为空 - 我不知道为什么。 但是,如果我只是从命令行运行 php 脚本,一切都可以正常工作。
在继续之前,我要指出,我对Web开发和基于密码的安全性非常陌生,所以不要太用力地歪曲我。 不过,好消息 - 与我在网络上可以找到的所有其他问题不同,我得到了正确的哈希和正确的验证响应。
使用 php 5.6.23
JS文件"test.html"的缩小版本:
<!doctype html>
<html lang="en">
<head>
<script type="text/javascript">
function reviewAndSubmit() {
//bigOlString is usually built as a result of TONS of script on this page, use this as a test
var bigOlString = "password=1234 name=test otherParams=barglebargle"
var postString = new XMLHttpRequest();
//build function to receive post response
postString.onreadystatechange = function() {
if (postString.readyState == 4) {
window.alert("responseText: " + postString.responseText)
}
}
postString.open("POST", "receivertest.php", true);
postString.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");
postString.send(bigOlString);
}
</script>
</head>
<body>
<button class="button" id="pushMe" onClick="reviewAndSubmit()">Why does PHP hate me so bad?</button>
和接收器测试.php:
<?php
//hashed version of '1234' and debug name 'test'
$debugPass = '$2y$10$b.08/4NfawKOwrBYJqguc.AWsI3mQiGGaz1eYvfc9Uid1auQKKABm';
$debugName = 'test';
//get incoming string
$inString = file_get_contents('php://input');
//get challenge content
$challengePass = substr($inString, strpos($inString, "password=") + 9, strpos($inString, "name=") - 10); //10 because of the space
$name = substr($inString, strpos($inString, "name=") +5, (strpos($inString, "otherParams=") - strpos($inString, "name=") - 6)); //ugly!
//begin authentication
$auth = False;
echo $name;
echo $challengePass;
password_verify($challengePass, $debugPass); //yes, I'm not doing anything with this. Doesn't matter.
echo "this line won't echo";
?>
如果你在receivertest.php中注释掉"password_verify"行,一切都会完美地回响。 如果你不这样做,那就没有运气了 - 测试中的"警报"窗口.html只是吐出"响应文本测试123"。 但是,如果你在控制台(php receivertest.php)中运行接收器测试.php,一切都会正确回显。
为什么我的回复文本为空?
编辑:我已经编辑了php脚本以更好地说明问题。 是的,我知道我没有使用password_verify做任何事情。 这不重要。 "此行不会回显"行在测试中不会像其他行那样回显.html。 我的问题是:为什么不呢?
代码都很好。 我在httpd.conf文件中进行了快速编辑并重新启动了apache,一切开始工作。 我撤消了该编辑以进行检查并重新启动 - 一切仍然有效。 所以我想我所需要的只是一个 apache 重启。
Apache似乎与php的关系比我想象的要多,我猜?