php - 将 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 保持“动态”?
解决方案
保护 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];
}
推荐阅读
- ios - 使用 MapKit 和 SwiftUI、Xcode 12 在默认 iOS 地图上移动视图时如何修复“为不可见的矩形请求样式 Z”的终端输出
- c++ - 我尝试使用placement new,但总是遵守错误
- sql - 从 PostgreSQL 中的一组 id 中选择第一个元素
- uwp - UWP 应用未通过 Windows 应用认证工具包测试:Windows 运行时元数据验证
- django - 为什么这“是”比较失败
- sql-server - 一个表到另一个表插入只检查特定字段重复
- python - 如何根据服务主体 ID 限制对 azure 函数的访问
- php - 在 WooCommerce 订单和电子邮件中保存并显示产品自定义元数据
- python - 词/短语分类
- scala - scala.MatchError: Some() (属于 java.lang.String 类)