安全 php API 与 API-Key 设置为会话变量?

Secure php API with API-Key set as session variable?

假设我有 index.php 和 login.php,其中 login.php 仅作为 API,通过位于登录表单上的 AJAX 调用index.php

正如我通过 AJAX 所做的那样,我不能只允许本地主机。我现在所做的是在 index.php 中设置一个 API-Key Session 变量并在 login.php.

中检查它

index.php:

session.start()
$_SESSION['MYKEY'] = 'ABCDEFG'

login.php:

session_start();
if (!isset($_SESSION['MYKEY']) || $_SESSION['MYKEY'] !== 'ABCDEFG') {
    http_response_code(401); // UNAUTHORIZED
    echo "UNAUTHORIZED!";
    die();
}
// more code for actual login logic

这是一个很好的安全措施还是完全没有意义?

如果不是,我 could/should 会做些什么,但要通过 AJAX 保持“动态”?

保护 PHP 站点免受 CSRF 攻击的最广泛使用的方法之一


for more details CSRF token https://www.getastra.com/blog/php-security/php-csrf-protection/

将此代码用于您的 index.php

<?php 
    session_start();
    
    function genrateString($len = 15) {
        $string = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $stringLength = strlen($string);
        $key = '';
        for ($i = 0; $i < $len; $i++) {
            $key .= $string[rand(0, $stringLength - 1)];
        }
        return $key;
    }
    
    $_SESSION['token'] = genrateString(15);
    
?>

HTML代码

<input type="hidden" name="token" id="token" value="<?php echo $_SESSION['token'];?>">

<!-- use jquery or javascript to get value for token & send to the backend through ajax -->

并为您的 login.php 页面添加此代码以验证令牌

$token = $_POST['token'];

$ses_token = $_SESSION['token'];

if($ses_token == $token){ //this is only true for a valid token
    
    $return = ['message' => 'valid token',  'status' => true];
    
} else {
    $return = ['message' => 'invalid token',  'status' => false];
    
}