Laravel est un framework PHP moderne avec des fonctions de gestion des autorisations et d'authentification très puissantes. Cependant, si des stratégies de sécurité appropriées ne sont pas adoptées, des problèmes de sécurité subsistent, tels que des abus et des contournements dans la gestion des autorisations. Cet article présentera quelques stratégies de sécurité lors de l'utilisation des fonctions d'autorisation de Laravel et fournira des exemples de code spécifiques.
1. Abus de gestion des autorisations
L'abus de gestion des autorisations fait référence à l'utilisation excessive des autorisations des utilisateurs autorisés, comme autoriser les employés du service des ressources humaines à opérer, supprimer des factures du service financier, etc. De tels abus peuvent entraîner une fuite d'informations confidentielles, une perte de données et d'autres conséquences néfastes. Afin d'éviter cette situation, nous pouvons ajouter deux politiques de sécurité à Laravel.
1. Système d'approbation des autorisations
Le système d'approbation des autorisations peut limiter l'utilisation des autorisations des utilisateurs. Par exemple, les administrateurs ne peuvent utiliser les données sensibles qu'après approbation. L'exemple de code pour implémenter cette stratégie est le suivant :
public function update(Request $request, $id) { $user = User::find($id); if (!$user->hasPermission('edit_user')) { abort(403, '你没有权限修改用户信息。'); } // 判断该用户是否需要审批 if ($user->needApproval()) { // 如果需要审批,则需要审批人进行审核通过后才能修改用户 $approver = $user->approver; if (!$approver->hasPermission('approve_user')) { abort(403, '你没有权限审批用户信息修改请求。'); } $user->name = $request->name; $user->email = $request->email; $user->save(); return redirect()->route('users.show', $user->id)->with('success', '用户信息修改成功!'); } // 如果不需要审批,则直接修改用户 $user->name = $request->name; $user->email = $request->email; $user->save(); return redirect()->route('users.show', $user->id)->with('success', '用户信息修改成功!'); }
Dans le code ci-dessus, nous utilisons les deux méthodes hasPermission()
et needApproval()
pour déterminer si l'utilisateur a des modifications et si une approbation est requise. Si une approbation est requise, vérifiez si l'approbateur dispose du pouvoir d'approbation. Si les conditions ci-dessus sont remplies, les informations utilisateur peuvent être modifiées. hasPermission()
和needApproval()
这两个方法,分别判断用户是否具有修改权限和是否需要审批。如果需要审批,则验证审批人是否具有审批权限。如果以上条件都满足,则可以进行用户信息修改。
2.频率限制
频率限制可以防止恶意用户在短时间内重复执行某种操作,例如登录、注册等。这可以避免攻击者使用爆破工具破解密码,或者创建大量虚假账户。Laravel提供了ThrottleRequests
中间件,我们可以在appHttpKernel.php
文件中添加以下代码:
protected $middlewareGroups = [ 'web' => [ AppHttpMiddlewareEncryptCookies::class, IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class, IlluminateSessionMiddlewareStartSession::class, // 加入ThrottleRequests中间件 IlluminateRoutingMiddlewareThrottleRequests::class, IlluminateContractsAuthMiddlewareAuthenticate::class, IlluminateRoutingMiddlewareSubstituteBindings::class, ], 'api' => [ 'throttle:60,1', 'auth:api', ], ];
在上述代码中,'throttle:60,1'
表示允许每分钟最多执行60次。如果用户尝试在短时间内多次执行某个操作,则会返回一个HTTP 429错误。
二、权限管理绕过
权限管理绕过指的是,未被授权的用户或攻击者利用漏洞获取了系统的控制权。这可能导致系统不稳定、数据泄露等问题。为了防止权限管理绕过,我们可以在Laravel中加入以下两个安全策略。
1.数据过滤
在Laravel中,我们可以在模型中定义数据过滤器,以限制查询结果。使用数据过滤可以避免攻击者在URL中注入SQL代码,或者获取非授权数据。以下代码示例演示如何使用数据过滤。
class MyModel extends Model { // 只查询被授权的数据 public function scopeAuthorized($query) { // 获取当前用户的权限数组 $permissions = auth()->user()->permissions->pluck('name')->toArray(); // 过滤只保留当前用户有权限的数据 return $query->whereIn('permission', $permissions); } }
在上述代码中,scopeAuthorized()
方法使用whereIn()
方法避免查询未授权数据。pluck()
方法返回一个IlluminateSupportCollection
实例,通过toArray()
方法将其转换为一个PHP数组。
2.强制请求方认证
使用中间件auth
可以强制要求请求方进行认证。在我们的控制器中,可以像下面这样使用auth
ThrottleRequests
, nous pouvons ajouter le code suivant dans le fichier appHttpKernel.php
: public function __construct() { $this->middleware('auth'); }
'throttle:60,1 '
signifie qu'un maximum de 60 exécutions par minute sont autorisées. Si l'utilisateur tente d'effectuer une action plusieurs fois dans un court laps de temps, une erreur HTTP 429 sera renvoyée. 2. Contournement de la gestion des autorisations 🎜🎜Le contournement de la gestion des autorisations signifie que des utilisateurs non autorisés ou des attaquants utilisent des vulnérabilités pour prendre le contrôle du système. Cela peut entraîner une instabilité du système, des fuites de données et d'autres problèmes. Afin d'empêcher le contournement de la gestion des autorisations, nous pouvons ajouter les deux politiques de sécurité suivantes à Laravel. 🎜🎜1. Filtrage des données🎜🎜Dans Laravel, nous pouvons définir des filtres de données dans le modèle pour limiter les résultats des requêtes. L'utilisation du filtrage des données peut empêcher les attaquants d'injecter du code SQL dans l'URL ou d'obtenir des données non autorisées. L'exemple de code suivant montre comment utiliser le filtrage des données. 🎜rrreee🎜Dans le code ci-dessus, la méthode scopeAuthorized()
utilise la méthode whereIn()
pour éviter d'interroger des données non autorisées. La méthode pluck()
renvoie une instance IlluminateSupportCollection
, qui est convertie en un tableau PHP via la méthode toArray()
. 🎜🎜2. Forcer l'authentification du demandeur🎜🎜Utilisez le middleware auth
pour forcer le demandeur à s'authentifier. Dans notre contrôleur, nous pouvons utiliser le middleware auth
comme ceci : 🎜rrreee🎜Si le demandeur n'est pas authentifié, la demande sera rejetée. Nous pouvons économiser beaucoup de code que nous devons écrire lorsque nous utilisons d'autres solutions, car Laravel gère directement tous les détails liés à l'authentification. 🎜🎜Résumé🎜🎜Dans Laravel, les fonctions de gestion des autorisations et d'authentification sont très puissantes. Cependant, nous devons encore adopter certaines stratégies de sécurité face aux utilisateurs malveillants et aux pirates informatiques. Cet article fournit des stratégies de sécurité éprouvées depuis longtemps, ainsi que des exemples de code spécifiques. J'espère que cet article pourra vous aider à améliorer la sécurité de Laravel. 🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!