كلاود
أمن سيبراني

أمان API: أفضل الممارسات للمطورين

كلاود|١٤ أبريل ٢٠٢٦|4 دقائق قراءة|٢٩٦ مشاهدة
أمان API: أفضل الممارسات للمطورين

Authentication، rate limiting، input validation، CORS — 10 ممارسات أمان لكل API. مع أمثلة كود.

أفضل ممارسات أمان API

API غير محمي = باب مفتوح لبيانات شركتك. كل يوم تتعرض APIs غير المحمية لمحاولات اختراق تلقائية. هذا الدليل يغطي الحماية الأساسية التي يجب أن تطبقها على أي API.

المشاكل الأمنية الأكثر شيوعاً في APIs

وفق OWASP API Security Top 10 (2023):

  1. Broken Object Level Authorization — الأكثر شيوعاً: مستخدم يصل لبيانات مستخدم آخر
  2. Broken Authentication — توثيق ضعيف أو مكسور
  3. Excessive Data Exposure — إرجاع بيانات أكثر مما يحتاجه العميل
  4. Rate Limiting غير كافٍ — السماح بطلبات غير محدودة
  5. Mass Assignment — قبول أي حقل في الطلب بدون تصفية

المصادقة والتوثيق

JWT الآمن

// Laravel - مثال JWT آمن
use Firebase\JWT\JWT;
use Firebase\JWT\Key;

// إنشاء Token
$payload = [
 'sub' => $user->id,
 'iat' => time,
 'exp' => time + 3600, // انتهاء بعد ساعة
 'jti' => uniqid('', true), // منع إعادة الاستخدام
];

$token = JWT::encode($payload, config('app.jwt_secret'), 'HS256');

// التحقق من Token
try {
 $decoded = JWT::decode($token, new Key(config('app.jwt_secret'), 'HS256'));
 $userId = $decoded->sub;
} catch (\Exception $e) {
 return response->json(['error' => 'Unauthorized'], 401);
}

API Keys للخدمات الخارجية

// توليد API Key آمن
$apiKey = bin2hex(random_bytes(32)); // 64 حرف عشوائي

// تخزينه بـ Hash (لا تخزن المفتاح الأصلي)
$hashedKey = hash('sha256', $apiKey);

// في middleware التحقق
public function handle(Request $request, Closure $next)
{
 $apiKey = $request->header('X-API-Key');
 
 if (!$apiKey) {
 return response->json(['error' => 'API key required'], 401);
 }
 
 $hashedKey = hash('sha256', $apiKey);
 $key = ApiKey::where('key_hash', $hashedKey)
 ->where('is_active', true)
 ->first;
 
 if (!$key) {
 return response->json(['error' => 'Invalid API key'], 401);
 }
 
 return $next($request);
}

Authorization: التحقق من الصلاحيات

Broken Object Level Authorization

// خطأ شائع — يسمح لأي مستخدم برؤية أي فاتورة
public function show($invoiceId)
{
 $invoice = Invoice::find($invoiceId); // خطأ!
 return response->json($invoice);
}

// الصحيح — تحقق من ملكية المورد
public function show($invoiceId)
{
 $invoice = Invoice::where('id', $invoiceId)
 ->where('user_id', auth->id) // ✓
 ->firstOrFail;
 
 return response->json($invoice);
}

Rate Limiting

// في Laravel — Rate Limiting مخصص
RateLimiter::for('api', function (Request $request) {
 return [
 Limit::perMinute(60)->by($request->user?->id ?: $request->ip),
 Limit::perDay(10000)->by($request->user?->id ?: $request->ip),
 ];
});

// في routes/api.php
Route::middleware(['auth:sanctum', 'throttle:api'])->group(function {
 Route::get('/user', [UserController::class, 'show']);
});

Rate Limiting لنقاط حساسة

// حماية مشددة لـ Login و Password Reset
RateLimiter::for('login', function (Request $request) {
 return Limit::perMinute(5)
 ->by($request->input('email') . '|' . $request->ip)
 ->response(function {
 return response->json([
 'error' => 'Too many attempts. Try again in 1 minute.'
 ], 429);
 });
});

تصفية البيانات (Input Validation)

// تحقق صارم من البيانات الواردة
public function store(Request $request)
{
 $validated = $request->validate([
 'name' => 'required|string|max:255|regex:/^[\p{L}\s]+$/u',
 'email' => 'required|email:rfc,dns',
 'amount' => 'required|numeric|min:0|max:100000',
 'type' => 'required|in:invoice,receipt,quote',
 ]);
 
 // استخدم $validated فقط — لا $request->all
 Invoice::create($validated);
}

تأمين Headers الاستجابة

// Middleware لإضافة Security Headers
public function handle(Request $request, Closure $next)
{
 $response = $next($request);
 
 $response->headers->set('X-Content-Type-Options', 'nosniff');
 $response->headers->set('X-Frame-Options', 'DENY');
 $response->headers->set('X-XSS-Protection', '1; mode=block');
 $response->headers->set('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
 $response->headers->set('Content-Security-Policy', "default-src 'self'");
 
 // إخفاء معلومات السيرفر
 $response->headers->remove('X-Powered-By');
 $response->headers->remove('Server');
 
 return $response;
}

تسجيل الأحداث الأمنية

// تسجيل كل محاولات المصادقة الفاشلة
Event::listen(Failed::class, function ($event) {
 Log::warning('Failed login attempt', [
 'email' => $event->credentials['email'],
 'ip' => request->ip,
 'user_agent' => request->userAgent,
 'time' => now->toIso8601String,
 ]);
 
 // إشعار فوري إذا تجاوزت عتبة معينة
 $failedAttempts = Cache::increment('failed_login:' . request->ip);
 if ($failedAttempts >= 10) {
 // Block IP أو أرسل تنبيه
 }
});

HTTPS إلزامي

أي API يعمل على HTTP بدون TLS يُرسل البيانات بالكامل بدون تشفير. كلاود (cloud.net.sa) توفر Let's Encrypt مجاناً مع التجديد التلقائي — لا عذر لـ API بدون HTTPS.

# إعادة توجيه HTTP لـ HTTPS
server {
 listen 80;
 server_name api.yourcompany.com;
 return 301 https://$host$request_uri;
}

الخلاصة

أمان API ليس اختيارياً — هو مسؤولية قانونية وأخلاقية. ابدأ بـ HTTPS + JWT + Rate Limiting + Input Validation، ثم أضف طبقات إضافية حسب حساسية بياناتك.


ابدأ الآن

تبي بيئة آمنة لتطبيقاتك؟ اختر سيرفر محمي بحماية DDoS وجدار ناري متقدم. راجع اتفاقية مستوى الخدمة وسياسة الخصوصية.

مشاركة