0x00 前言
随着项目需求的逐渐增多,功能的逐渐繁杂。以接口(API)形式获取数据成了不可避免的途径。那么如何提高PHP接口的安全性呢?下面是途径之一,废话不多说,直接上码。
0x01 PHP服务端验证方法:
<?php
define('ADMIN_USERNAME', 'admin'); // Admin Username
define('ADMIN_PASSWORD', md5('111111')); // Admin Password
//Authenticate
if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW'])
|| $_SERVER['PHP_AUTH_USER'] != base64_encode(ADMIN_USERNAME)
|| $_SERVER['PHP_AUTH_PW'] != base64_encode(ADMIN_PASSWORD)) {
header('WWW-Authenticate: Basic realm="Auth failed"');
Header("HTTP/1.0 401 Unauthorized");
echo <<<EOB
<html><body>
<h1>Rejected!</h1>
<big>Wrong Username or Password!</big>
</body></html>
EOB;
}
else {
echo "通过验证!";
}
0x02 PHP客户端请求方法:
define('ADMIN_USERNAME', 'admin'); // Admin Username
define('ADMIN_PASSWORD', md5('111111')); // Admin Password
$url = 'http://127.0.0.1/phpinput/output.php'; // url 必要参数
$params = ['name'=>'wangbiao', 'age'=>30]; // 参数 非必要
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0); // 可自定义Header
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, base64_encode(ADMIN_USERNAME) . ':' . base64_encode(ADMIN_PASSWORD));
curl_setopt($ch, CURLOPT_POSTFIELDS, $params); // 传递参数
$data = curl_exec($ch);
print_r($data);
0x03 总结
Basic Access Authentication scheme是在HTTP1.0提出的认证方法,它是一种基于challenge/response的认证模式,针对特定的realm需要提供用户名和密码认证后才可访问,其中密码使用明文传输。Basic模式认证过程如下:
1 浏览器发送http报文请求一个受保护的资源。
2 服务端的web容器将http响应报文的响应码设为401,响应头部加入WWW-Authenticate: Basic realm=”myTomcat”。
3浏览器弹出对话框让用户输入用户名和密码,并用Base64进行编码,实际是用户名+冒号+密码进行Base64编码,即Base64(username:password),这次浏览器就会在HTTP报文头部加入Authorization: Basic bXl0b21jYXQ=。
4 服务端web容器获取HTTP报文头部相关认证信息,匹配此用户名与密码是否正确,是否有相应资源的权限,如果认证成功则返回相关资源,否则再执行 过程2,重新进行认证。
5 以后每次访问都要带上认证头部。
服务端返回的认证报文中包含了realm=”Auth failed”,realm的值用于定义保护的区域,在服务端可以通过realm将不同的资源分成不同的域,域的名称即为realm的值,每个域可能会有自己的权限鉴别方案。
Basic认证模式有两个明显的缺点:
- 无状态导致每次通信都要带上认证信息,即使是已经认证过的资源;
- 传输安全性不足,认证信息用Base64编码,基本就是明文传输,很容易对报文截取并盗用认证信息。
网友评论