确保我的 php 已被我的 javascript 在我的网页上调用

Be sure my php has been invoked by my javascript on my web page

我如何确定我的 php 仅被发布在我的网页上的 javascript 调用,并且仅由经过身份验证的用户调用? 我想防止来自其他网站或其他未经授权的用户的攻击或数据窃取,例如可以在未经许可的情况下调用我的 php 脚本和 get/delete 我的一些数据。 据我所知,$_SERVER['HTTP_REFERER'] 可以很容易地更改,因此它不可靠,所以我无法确定我的 php 是否已从我的网页上的 javascript 调用。 Cookies 也不可靠,所以我不能确定我作为正确登录的授权用户存储在 cookies 中的用户 ID 是否被破解和更改。那么如何使 javascript/php 网络应用程序安全呢? 有什么建议吗?谢谢。

看看How do I provide more security for checking source of the request

听起来您害怕 Cross-Site Request Forgery (CSRF) 出现在您的网站上。关注 link 以了解有关 CSRF 的更多信息。

根据经验,您总是在做安全后端。以下是您可以使用的秘密握手方法的示例。

此方法保证用户至少通过知道第一个秘密开始了他的一系列请求:

为 PHP 中的用户生成一个唯一值,并使其成为您可以轻松重新创建的用户唯一值的哈希值:

$secretHandshake = hash('sha512', $user_id . '_' . $secret_counter);

将其放在您网站上 JavaScript 可以获取的位置。隐藏的输入字段对此很有用。

现在,当您 AJAX 时,只需提交带有 AJAX 作为参数的 secret

var secret = jQuery("#secret").val();
jQuery.ajax({
  url: "doStuff.php",
  method: "POST",
  data: {action: 'createUser', data: /* whatever */, secret: secret}
}).success(function(response) {
  //Save the new secret
  response = JSON.parse(response);
  secret = response.secret;
});

现在我们可以简单地在服务器上验证请求:

if(!isset($_POST['secret']) || /* User not logged in check */) {
    die();
}
if($_POST['secret'] === $secretHandshake) {
    //Now that we have validated the respone, we create a new secret
    $secret_counter++;
    $secretHandshake = hash('sha512', $user_id . '_' . $secret_counter);
    $returner = array('secret' => $secretHandshake);

    //Do something with the data

    //Append extra responses if relevant:
    $returner['data'] = 'Success!';

    //Return as json for JavaScript
    echo json_encode($returner);
}

这使得机器人更难攻击您的站点,因为它们必须知道每个请求的当前密码。