我创建了一个网站,要求用户使用Google作为提供商通过Oauth2登录。我使用this作为供应商,我基本上实现了它,因为他们建议你。
基本上流程是:
- 用户进入安全页面
- 脚本检查是否存在带有令牌的cookie
- 发送令牌以进行验证检查
- 有效时,继续
- 无效时,发送回登录页面
- 登录后,通过ID令牌验证检查返回的代码,然后将idtoken保存为cookie
- 此cookie用于在每次页面加载时验证用户(我们不使用任何其他API调用,仅使用页面加载身份验证)
现在这个脚本已经被审计,审计员已经将这个流标记为“不安全”。说攻击者可以窃取令牌并将其用于自己的利益。我完全理解。
然而,如何防止这种情况?我们需要把代码存起来吗审计员提出了两点建议:将重定向参数不仅发送到授权端点,而且发送到令牌端点。问题是,我相信我已经这样做了。
如果有人能指导我这些安全调查结果,我将非常感激。
授权代码(用于需要用户登录的页面):
if(isset($_POST['Logout'])){
setcookie($COOKIENAME, "", time() - 3600);
header("Location: /login.php", true, 301); }
try {
if (!isset($_COOKIE[$COOKIENAME])) {
header("Location: /login.php", true, 301);
}
require_once 'vendor/autoload.php';
$client = new Google_Client();
$client->setAuthConfig('./clientInfo.json');
$redirect_uri = $_SERVER['HTTP_HOST'].'/login.php';
$client->setRedirectUri($redirect_uri);
$client->setAccessType('offline');
$token = $client->verifyIdToken($_COOKIE[$COOKIENAME]);
if (!$token) {
header("Location: login.php", true, 301);
}
} catch (Exception $e) {
print "An error occurred: " . $e->getMessage();
}
验证码(用于回调):
if (isset($_GET['code'])) {
$client = new Google_Client();
$client->setAuthConfig('./clientInfo.json');
$redirect_uri = $_SERVER['HTTP_HOST'].'/login.php';
$client->setRedirectUri($redirect_uri);
$client->setAccessType('offline');
try {
$token = $client->verifyIdToken(urldecode($_GET['code']));
if ($token) {
$userid = $token['sub'];
$exp = $token['exp'];
$cookie_name = $COOKIENAME;
$cookie_value = urldecode($_GET['code']);
setcookie($cookie_name, $cookie_value, $exp, "/");
header("Location: dashboard.php");
} else {
echo "invalid token";
}
} catch (Exception $e) {
print "An error occurred: " . $e->getMessage();
}
} else {
echo "invalid token";
}
1条答案
按热度按时间oprakyz71#
您可以使用session而不是cookie来存储令牌。
Cookie存储在客户端浏览器中,每次与服务器通信时发送。黑客可以在浏览器上注入代码来窃取它。他们还可以拦截服务器和客户端之间的通信(如果未加密)以窃取它。
会话在服务器端存储数据。浏览器上仅存储会话ID。黑客无法获得浏览器上的数据,因为它从未发送给他们。