حول المحتوى:
نصائح وتصميمات لحماية واجهات الـ API: مصادقة، صلاحيات، تشفير، التحقق من صحة الإدخالات، وضوابط معدل الطلبات مع أمثلة في Flask وFastAPI وDjango REST Framework.
نصائح وتصميمات لحماية واجهات الـ API: مصادقة، صلاحيات، تشفير، التحقق من صحة الإدخالات، وضوابط معدل الطلبات مع أمثلة في Flask وFastAPI وDjango REST Framework.
تُعد واجهات RESTful APIs من الأعمدة الأساسية في البرمجة الحديثة، خصوصاً مع انتشار التطبيقات الموزعة، وإنترنت الأشياء، وتكامل الأنظمة. ورغم بساطة تصميم REST، فإن بناء RESTful API آمن وموثوق يتطلب الالتزام بمجموعة من أفضل الممارسات في المصادقة، التحكم في الوصول، حماية البيانات، والحد من الإساءات. في هذا الدليل نستعرض أهم الممارسات الأمنية مدعومة بأمثلة من أطر بايثون الشائعة: Flask، وFastAPI، وDjango REST Framework.
مع ازدياد الاعتماد على APIs لتبادل البيانات بين الأنظمة والتطبيقات، أصبح أمان الواجهات ضرورة قصوى. أي خلل أمني قد يؤدي إلى كشف بيانات المستخدمين، أو إساءة استخدام الأنظمة، أو تعريض الخوادم للهجمات والهدر في الموارد. لذا، فإن بناء واجهات API آمنة هو استثمار طويل الأمد في سلامة مشروعك وسمعة شركتك.
المصادقة هي الخطوة الأولى والأساسية: كيف تتأكد أن من يرسل الطلب هو مستخدم موثوق؟ تقدم RESTful APIs عدة طرق للمصادقة أشهرها:
from flask import Flask, request, jsonify
import jwt, datetime
SECRET_KEY = 'your_secret_key'
app = Flask(__name__)
@app.route('/login', methods=['POST'])
def login():
data = request.json
# تحقق من بيانات المستخدم (اختصاراً)
if data['username'] == 'admin' and data['password'] == 'pass':
payload = {
'user': data['username'],
'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1)
}
token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')
return jsonify({'token': token})
return jsonify({'msg': 'بيانات خاطئة'}), 401
تعرف بالتفصيل على FastAPI من مقالنا بناء RESTful APIs باستخدام FastAPI.
from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
@app.get("/protected")
def protected_route(token: str = Depends(oauth2_scheme)):
# تحقق من صحة التوكن عبر jwt.decode ...
return {"msg": "وصول مصرح"}
اطلع على دليل شامل لإطار Django REST مع أمثلة للمزيد.
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
from rest_framework.response import Response
class ProtectedView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request):
return Response({'msg': 'أنت مصادق'})
حتى بعد المصادقة، عليك التأكد من أن المستخدم يمتلك صلاحيات تسمح له بتنفيذ العملية المطلوبة (كتصفح بيانات/تعديل/حذف... إلخ).
from flask import g
@app.route('/delete_user', methods=['DELETE'])
def delete_user():
user = g.current_user # لنفترض أن المستخدم تم تمريره من ميدل وير المصادقة
if user['role'] != 'admin':
return jsonify({'msg': 'ممنوع'}), 403
# تنفيذ الحذف...
معظم أطر العمل تعتمد على إعدادات السيرفر (مثل Nginx, Apache أو gunicorn)، وتحتاج لتوليد وتثبيت شهادة SSL.
# مثال لتشغيل flask على https محلياً (غير مستحسن للبيئة الحية):
app.run(ssl_context=('cert.pem', 'key.pem'))
راجع توثيق كل إطار عمل لطريقة دعم الـ HTTPS في البيئة الحية.
التحقق من صحة البيانات الواردة من المستخدمين هو خط الدفاع الأول ضد الهجمات مثل: الحقن (SQL Injection), والأكواد الخبيثة (XSS) وغيرها.
from rest_framework import serializers
class UserSerializer(serializers.Serializer):
username = serializers.CharField(max_length=100)
email = serializers.EmailField()
from pydantic import BaseModel, EmailStr
class UserIn(BaseModel):
username: str
email: EmailStr
يساعد Rate Limiting في حماية API من محاولات الإغراق (Brute Force, DDoS)، وذلك بتحديد عدد محدد من الطلبات في فترة زمنية معينة لكل مستخدم أو IP.
from flask_limiter import Limiter
limiter = Limiter(app, key_func=get_remote_address)
@app.route("/login")
@limiter.limit("5 per minute")
def login():
...
from ratelimit.decorators import ratelimit
@ratelimit(key='ip', rate='10/m')
def my_view(request):
...
@app.errorhandler(Exception)
def handle_error(e):
# السجل الداخلي
log_exception(e)
# رسالة خطأ عامة للعميل
return jsonify({"msg": "حدث خطأ غير متوقع"}), 500
from fastapi import FastAPI, HTTPException, Depends, Security
from fastapi.security import OAuth2PasswordBearer
from pydantic import BaseModel, constr
from typing import Optional
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
class UserIn(BaseModel):
username: constr(max_length=100)
password: constr(min_length=8)
@app.post("/login")
def login(user: UserIn):
# تحقق من بيانات المستخدم
...
@app.get("/profile")
def profile(token: str = Depends(oauth2_scheme)):
# فك شيفرة JWT والتحقق من الصلاحيات ...
...
from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from .serializers import UserSerializer
class ProfileView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request):
serializer = UserSerializer(request.user)
return Response(serializer.data)
تصميم RESTful APIs آمن ليس خياراً بل ضرورة ملحة لأي مشروع تقني حديث. الالتزام بهذه الممارسات لا يقي مشروعك فقط من المخاطر الأمنية، بل يعزز من جودته واحترافيته. ولا تنسَ أن الأمان شراكة دائمة بين البنية البرمجية والفريق التقني، كل تحديث هو فرصة لتعزيز الحماية أكثر.
لمزيد من الشروحات حول البرمجة والأطر الآمنة، تابع تصفح مقالاتنا الأخرى على موقع افهم صح.
نصائح وتصميمات لحماية واجهات الـ API: مصادقة، صلاحيات، تشفير، التحقق من صحة الإدخالات، وضوابط معدل الطلبات مع أمثلة في Flask وFastAPI وDjango REST Framework.
مساحة اعلانية