这里的一些答案可以让您大致了解问题背后的概念,让我给您一个更务实的方法(不过,您至少应该阅读并理解其他人对此事的看法!)。
您只需要问自己:您的应用是否必须强制要求控制对 myscript.php 的所有请求?
如果是这样那么您需要使用某种令牌:您创建一个令牌并将其发送到客户端(浏览器),然后浏览器必须发送回该令牌并检查它是否匹配在做一些动作之前:
<?php
// somefile.php (this file serves the page that contains your AJAX call)
session_start();
//...
$_SESSION['token'] = createNewToken(); // creates unique tokens
//add the token as a JS variable and send it back in your AJAX CALL
// some where you'll have something similar to this:
<script>
var token = <?php echo $_SESSION['token'] ?>;
$.ajax({
url: "myscript.php",
data: form_data, // include the token here!
//...
})
然后在你的脚本中:
<?php
// myscript.php
session_start();
// you can check if it's an AJAX call, if the user is logged and then the token:
if (!isset($_SESSION['token')) {
header("HTTP/1.0 403 Forbidden");
die("Direct access not allowed!");
}
// Assuming your AJAX is a POST though you didn't tell us
if (!isset($_POST['token'] || $_POST['token'] != $_SESSION['token']) {
header("HTTP/1.0 400 Bad request");
die("You didn't provide a valid token!");
}
// do something with your DB
否则您只需要检查用户是否已登录,就像您通常对其余脚本所做的那样:
<?php
// myscript.php
session_start();
// Check if logged in user
if (!isset($_SESSION['loggedIn']) || !$_SESSION['loggedIn']) {
header("HTTP/1.0 403 Forbidden");
die("You need to be logged in!");
}
// Do something with your DB
总结
使用第一种方法允许更受控制的访问,因为您强制用户发送普通用户不会拥有的秘密(令牌,在每个请求中都会有所不同)(如果其他用户获得令牌,那么你有更大的问题,比如会话劫持)。请注意,此方法可防止用户在多个选项卡/不同浏览器上打开,因为只会保存最后一个令牌。为了避免你有this fantastic answer on SO
另一方面,第二种方法允许(登录的)用户直接请求您的 myscript.php,但也许您不需要阻止这种情况(如果您需要,只需使用第一种方法)。请注意,您不会遇到多个选项卡/不同浏览器的问题,因为您只会检查用户是否已登录。