首页 > 解决方案 > 将 API-Key 设置为会话变量的安全 php API?

问题描述

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

当我通过 AJAX 进行操作时,我不能只允许本地主机。我现在所做的是在 index.php 中设置一个 API-Key Session 变量并在 login.php 中检查它。

索引.php:

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

登录.php:

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

这是一个很好的安全措施还是这绝对是胡说八道?

如果没有,我可以/应该做什么,但通过 AJAX 保持“动态”?

标签: phpapisecurity

解决方案


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


有关更多详细信息 CSRF 令牌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];
    
}

推荐阅读