【问题标题】:Avoid url manipulation on a Web App working with API避免在使用 API 的 Web 应用程序上进行 url 操作
【发布时间】: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:

第一种情况:

  1. 通过更改 points 变量的值,直接从 url 在我的帐户中添加任意数量的积分。
  2. 我没有更改 points 变量,而是编写了一个脚本,每隔 5 到 10 分钟或随机分钟一次,我只需调用 API url 给我一分。

我应该如何避免这些 url 操作的情况以及我能做些什么,特别是对于 Laravel 5 和 AngularJS 1.5?

【问题讨论】:

标签: angularjs laravel security api-design


【解决方案1】:

您必须让您的服务器/后端(在您的情况下为 Laravel)根据您的业务逻辑计算积分。

因此,例如,如果您基于 CheckIn 活动给用户积分,您必须向服务器发送请求以执行逻辑并确定该用户是否应得积分,因此您可以发送如下内容:

activity_type=checkin&location_id=123

【讨论】:

  • 这可以解决第一部分,但是如何防止用户手动创建 API 调用?假设使用上面的 URL,他可以调用相同的 URL 或更改位置 ID
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
相关资源
最近更新 更多