【发布时间】:2017-05-30 07:15:51
【问题描述】:
我最近开始使用 Laravel 作为 API 和 AngularJS 作为前端的个人项目。这是我第一次自己设计 API,我所做的一切都是通过教程和视频。
我最后想到了一个关于安全性和 url 操作的问题,但我知道这可能是一个通用问题,因此我将使用具体示例并针对不同情况创建其他问题。
假设我的网络应用中有一个积分系统,在执行特定操作后,我必须给用户积分。
首先,我们将 AngularJS 代码作为服务:
PointsServices.$inject = ['$http', '$cookies', 'API_Base'];
function PointsServices($http, $cookies, API_Base) {
var service = this;
service.addPoints = function(points, onSuccess, onError) {
$http.get(API_Base + 'user/addpoints?points='+points,
{
headers: { 'Authorization': 'Bearer '+$cookies.get('token')}
}).
then(function(response) {
onSuccess(response);
}, function(response) {
onError(response);
});
}
}
它只是一项服务,它获取要插入用户的点数。然后它从 cookie 中获取 JWT 令牌并将其添加到标头以进行后端身份验证。现在让我们在后端使用 Laravel:
class PointsController extends Controller
{
public function addPoints(Request $request)
{
$user = \Helpers::getUserFromToken();
$points = $request->input('points');
$user->points += $points
$user->save();
return response()->json(['message' => 'User's points added', 'status' => '200']);
}
}
\Helpers::getUserFromToken(); 是 JWT 的辅助函数,我在其中对用户进行身份验证,如下所示:
public static function getUserFromToken()
{
$token = JWTAuth::parseToken();
try {
if (!$user = $token->authenticate()) {
return response()->json(['user_not_found'], 404);
}
} catch (Tymon\JWTAuth\Exceptions\TokenExpiredException $e) {
return response()->json(['token_expired'], $e->getStatusCode());
} catch (Tymon\JWTAuth\Exceptions\TokenInvalidException $e) {
return response()->json(['token_invalid'], $e->getStatusCode());
} catch (Tymon\JWTAuth\Exceptions\JWTException $e) {
return response()->json(['token_absent'], $e->getStatusCode());
}
return $user;
}
现在,让我们戴上邪恶用户的帽子。我打开开发人员控制台并进入网络选项卡,或者只是在源代码上。我检查应用程序使用的确切 url,并在成功调用后从 cookie 或本地存储或直接从标头中获取令牌。然后,我使用 postman 或任何其他软件使用我的用户帐户令牌调用 API:
第一种情况:
- 通过更改 points 变量的值,直接从 url 在我的帐户中添加任意数量的积分。
- 我没有更改 points 变量,而是编写了一个脚本,每隔 5 到 10 分钟或随机分钟一次,我只需调用 API url 给我一分。
我应该如何避免这些 url 操作的情况以及我能做些什么,特别是对于 Laravel 5 和 AngularJS 1.5?
【问题讨论】:
-
如果不了解积分累积的操作,就很难回答这个问题。看看这个:stackoverflow.com/a/5250687/7377984
标签: angularjs laravel security api-design