أمان PHP

يعد الأمان أحد أهم أجزاء تطوير PHP. قد يعمل تطبيق PHP بشكل صحيح من وجهة نظر وظيفية، ولكن إذا لم يتعامل مع إدخال المستخدم واستعلامات قاعدة البيانات والجلسات والملفات وكلمات المرور بأمان، فقد يصبح عرضة للهجمات.

يُستخدم PHP بشكل شائع لإنشاء أنظمة تسجيل الدخول ولوحات المعلومات ولوحات الإدارة وواجهات API والمدونات وأنظمة التجارة الإلكترونية وأنظمة إدارة المحتوى. تتعامل هذه التطبيقات غالبًا مع المستخدمين والنماذج وقواعد البيانات والجلسات والملفات التي تم تحميلها والمعلومات الحساسة.

تشرح هذه المقالة موضوعات أمان PHP الهامة بما في ذلك أساسيات الأمان، والتحقق من صحة الإدخال، والهروب من المخرجات، وSQL injection، وحماية XSS، وحماية CSRF، وتجزئة كلمة المرور، وأمن الجلسة، وأمان رفع الملفات، ومعالجة الأخطاء، وممارسات الترميز الآمن.

PHP أساسيات الأمان

يبدأ الأمان PHP بقاعدة واحدة بسيطة: لا تثق مطلقًا بإدخال المستخدم. يجب التعامل مع أي بيانات تأتي من المستخدم، أو المتصفح، أو URL، أو النموذج، أو ملف تعريف الارتباط، أو الرأس، أو طلب API، أو الملف الذي تم تحميله، أو الخدمة الخارجية على أنها غير موثوق بها حتى يتم التحقق من صحتها والتعامل معها بأمان.

يمكن أن تأتي مدخلات المستخدم من العديد من الأماكن، بما في ذلك:

  • $_GET: البيانات من سلسلة الاستعلام URL.

  • $_POST: البيانات من النماذج المقدمة أو طلبات AJAX.

  • $_COOKIE: البيانات المخزنة في متصفح المستخدم.

  • $_FILES: معلومات الملف الذي تم تحميله.

  • $_SERVER: معلومات الطلب والخادم.

  • JSON نص الطلب: البيانات المرسلة بواسطة واجهات API أو تطبيقات JavaScript.

يعتمد التطوير الآمن PHP عادةً على عدة ممارسات تعمل معًا. يمكنك التحقق من صحة الإدخال، وإخراج الهروب، واستخدام العبارات المحضرة لاستعلامات قاعدة البيانات، وكلمات مرور التجزئة، وحماية الجلسات، والتحقق من الأذونات، والتعامل مع الأخطاء بعناية، وتجنب الكشف عن المعلومات الحساسة.

لا ينبغي إضافة الأمان إلا في نهاية المشروع. يجب أن يكون جزءًا من عملية التطوير منذ البداية.

التحقق من صحة الإدخال

التحقق من صحة الإدخال يعني التحقق مما إذا كان إدخال المستخدم مقبولاً قبل استخدامه. يساعد التحقق من الصحة على حماية التطبيق من البيانات غير الصحيحة أو غير الكاملة أو غير المتوقعة أو الخطيرة.

على سبيل المثال، إذا طلب نموذج عنوان بريد إلكتروني، فيجب أن يتحقق التطبيق من أن القيمة هي بريد إلكتروني صالح بالفعل. إذا كان النموذج يطلب عمرًا، فيجب أن يتحقق التطبيق من أن القيمة عبارة عن رقم ضمن النطاق المتوقع.

<?php
$email = trim($_POST["email"] ?? "");

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo "Invalid email address.";
}
?>

يمكن للتحقق من الصحة التحقق من أشياء كثيرة:

  • الحقول المطلوبة.

  • تنسيق البريد الإلكتروني.

  • تنسيق URL.

  • الحد الأدنى والحد الأقصى للطول.

  • القيم الرقمية.

  • القيم المسموح بها

  • تنسيق التاريخ.

  • نوع الملف وحجم الملف.

على سبيل المثال، يجب ألا يقبل حقل الدور أي قيمة عشوائية. يجب أن يقبل فقط القيم المحددة المسموح بها.

<?php
$allowedRoles = ["user", "editor", "admin"];
$role = $_POST["role"] ?? "user";

if (!in_array($role, $allowedRoles, true)) {
    echo "Invalid role.";
    exit;
}
?>

يعمل التحقق من الصحة على تحسين الأمان وجودة البيانات. فهو يمنع البيانات غير الصالحة من الدخول إلى التطبيق ويساعد النظام على التصرف بشكل متوقع.

هروب الإخراج

يعني الهروب من الإخراج تحويل الأحرف الخاصة قبل عرض المحتوى الذي أنشأه المستخدم في HTML. وهذا أمر مهم لأن إدخال المستخدم قد يحتوي على كود HTML أو JavaScript.

في PHP، htmlspecialchars() يُستخدم بشكل شائع لعرض النص بأمان داخل HTML.

<?php
$name = $_POST["name"] ?? "";

echo htmlspecialchars($name, ENT_QUOTES, "UTF-8");
?>

بدون الهروب، يمكن للمستخدم إرسال شيء مثل علامة البرنامج النصي، وقد ينفذه المتصفح كـ JavaScript. ومع الهروب، يعرضه المتصفح كنص عادي بدلاً من تشغيله.

يمكن لوظيفة مساعدة صغيرة أن تجعل الإخراج الآمن أسهل:

<?php
function e($value) {
    return htmlspecialchars($value ?? "", ENT_QUOTES, "UTF-8");
}

echo e($_POST["name"] ?? "");
?>

يجب تطبيق هروب المخرجات عند عرض البيانات التي أنشأها المستخدم مثل الأسماء والتعليقات ومحتوى المقالة ومعلومات الملف الشخصي والكلمات الرئيسية للبحث وقيم قاعدة البيانات.

التحقق من الصحة والهروب مختلفان. يتحقق التحقق من صحة الإدخال إذا كان الإدخال مقبولاً. الهروب يحمي سياق الإخراج حيث يتم عرض البيانات.

SQL الحقن

SQL injection هي إحدى أخطر الثغرات الأمنية في التطبيقات المعتمدة على قواعد البيانات. يحدث ذلك عندما يتم إدراج إدخال المستخدم مباشرةً في استعلام SQL دون الحماية المناسبة.

على سبيل المثال، هذا الرمز غير آمن:

<?php
$email = $_POST["email"];

$sql = "SELECT * FROM users WHERE email = '$email'";
?>

إذا أرسل مستخدم ضار رمز SQL خاص داخل حقل البريد الإلكتروني، فقد يغير معنى الاستعلام. يمكن أن يؤدي ذلك إلى تسرب البيانات، أو تسجيل الدخول غير المصرح به، أو حذف السجلات، أو تلف قواعد البيانات.

النهج الصحيح هو استخدام العبارات المحضرة. البيانات المجهزة تفصل بنية SQL عن مدخلات المستخدم.

<?php
$pdo = new PDO(
    "mysql:host=localhost;dbname=app;charset=utf8mb4",
    "root",
    ""
);

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$email = $_POST["email"] ?? "";

$statement = $pdo->prepare("SELECT * FROM users WHERE email = :email");

$statement->execute([
    "email" => $email
]);

$user = $statement->fetch(PDO::FETCH_ASSOC);
?>

يجب استخدام العبارات المعدة لجميع الاستعلامات التي تتضمن مدخلات المستخدم، بما في ذلك استعلامات SELECT، وINSERT، وUPDATE، وDELETE.

على سبيل المثال، يجب أن يستخدم استعلام التحديث أيضًا العبارات المحضرة:

<?php
$id = $_POST["id"] ?? "";
$name = $_POST["name"] ?? "";

$statement = $pdo->prepare("
    UPDATE users
    SET name = :name
    WHERE id = :id
");

$statement->execute([
    "name" => $name,
    "id" => $id
]);
?>

يعد منع SQL injection أحد أهم العادات الأمنية لكل مطور PHP.

XSS الحماية

XSS يرمز إلى البرمجة النصية عبر المواقع. يحدث ذلك عندما يتمكن أحد المهاجمين من إدخال JavaScript في صفحة يشاهدها مستخدمون آخرون.

على سبيل المثال، قد يسمح نموذج التعليق للمستخدمين بكتابة التعليقات. إذا عرض التطبيق التعليقات دون الهروب، فيمكن لمستخدم ضار إرسال رمز JavaScript بدلاً من النص العادي.

مخرجات غير آمنة:

<?php
echo $_POST["comment"];
?>

الإخراج الآمن:

<?php
echo htmlspecialchars($_POST["comment"] ?? "", ENT_QUOTES, "UTF-8");
?>

يمكن استخدام XSS لسرقة بيانات الجلسة أو تغيير محتوى الصفحة أو إعادة توجيه المستخدمين أو تنفيذ إجراءات نيابة عن مستخدم آخر. هذا هو السبب في أن الهروب من الإخراج أمر ضروري.

تتضمن الحماية XSS عادةً ما يلي:

  • الهروب من الإخراج الذي أنشأه المستخدم.

  • التحقق من صحة المدخلات بعناية.

  • تجنب HTML الخام من المستخدمين ما لم يتم تعقيمه بشكل صارم.

  • استخدام ملفات تعريف الارتباط الآمنة لحماية الجلسة.

  • استخدام سياسة أمان المحتوى عندما يكون ذلك ممكنًا.

إذا كان تطبيقك يسمح بنص منسق، مثل محتوى المدونة أو التعليقات المنسقة، فلا تثق ببساطة في HTML. استخدم مطهرًا موثوقًا به HTML أو ميزة إطارية مصممة للتعامل الآمن مع النص المنسق.

CSRF الحماية

CSRF يرمز إلى تزوير الطلب عبر المواقع. يحدث ذلك عندما يخدع أحد المهاجمين مستخدمًا قام بتسجيل الدخول لإرسال طلب غير مرغوب فيه إلى تطبيقك.

على سبيل المثال، إذا قام مستخدم بتسجيل الدخول إلى لوحة الإدارة، فقد يحاول المهاجم جعل متصفح المستخدم يرسل نموذجًا مخفيًا يغير بيانات الحساب أو يحذف المحتوى.

عادةً ما تستخدم حماية CSRF رمزًا مميزًا. يقوم الخادم بإنشاء رمز مميز عشوائي، ويخزنه في الجلسة، ويدرجه داخل النموذج. عند إرسال النموذج، يتحقق الخادم مما إذا كان الرمز المميز المقدم يتطابق مع الرمز المميز للجلسة.

<?php
session_start();

if (empty($_SESSION["csrf_token"])) {
    $_SESSION["csrf_token"] = bin2hex(random_bytes(32));
}
?>

<form method="post" action="update-profile.php">
    <input type="hidden" name="csrf_token" value="<?php echo htmlspecialchars($_SESSION["csrf_token"], ENT_QUOTES, "UTF-8"); ?>">

    <input type="text" name="name">

    <button type="submit">Update</button>
</form>

عند معالجة الطلب، تحقق من الرمز المميز:

<?php
session_start();

$token = $_POST["csrf_token"] ?? "";

if (!hash_equals($_SESSION["csrf_token"] ?? "", $token)) {
    http_response_code(403);
    echo "Invalid CSRF token.";
    exit;
}

echo "Request accepted.";
?>

تعد حماية CSRF مهمة بشكل خاص للنماذج التي تقوم بإنشاء البيانات أو تحديثها أو حذفها. يجب حماية تسجيل الدخول وتسجيل الخروج وتحديث الملف الشخصي وتغيير كلمة المرور وأزرار الحذف وإجراءات المسؤول.

تجزئة كلمة المرور

لا ينبغي أبدًا تخزين كلمات المرور كنص عادي. إذا تم تسريب قاعدة بيانات وتم تخزين كلمات المرور مباشرة، تصبح جميع حسابات المستخدمين مكشوفة.

PHP يوفر password_hash() لتجزئة كلمات المرور بشكل آمن.

<?php
$password = $_POST["password"] ?? "";

$hash = password_hash($password, PASSWORD_DEFAULT);

echo $hash;
?>

يجب تخزين التجزئة التي تم إنشاؤها في قاعدة البيانات، وليس كلمة المرور الأصلية.

عندما يحاول المستخدم تسجيل الدخول، استخدم password_verify() لمقارنة كلمة المرور المقدمة مع التجزئة المخزنة.

<?php
$submittedPassword = $_POST["password"] ?? "";
$storedHash = $user["password"];

if (password_verify($submittedPassword, $storedHash)) {
    echo "Login successful.";
} else {
    echo "Invalid credentials.";
}
?>

لا تستخدم أساليب التجزئة الضعيفة مثل MD5 أو SHA1 لكلمات المرور. تحتاج تجزئة كلمة المرور إلى خوارزميات مصممة لتخزين كلمات المرور.

من الممارسات الجيدة أيضًا فرض قواعد كلمة المرور مثل الحد الأدنى للطول وحماية نماذج تسجيل الدخول من هجمات القوة الغاشمة باستخدام تحديد المعدل أو عمليات الإغلاق المؤقتة.

أمان الجلسة

تُستخدم الجلسات بشكل شائع لأنظمة تسجيل الدخول ولوحات معلومات المستخدم. نظرًا لأن الجلسات يمكن أن تمثل مستخدمين مصادق عليهم، يجب التعامل معها بعناية.

قد يقوم نظام تسجيل الدخول الأساسي بتخزين معرف المستخدم في الجلسة بعد تسجيل الدخول الناجح.

<?php
session_start();

session_regenerate_id(true);

$_SESSION["user_id"] = $user["id"];
$_SESSION["user_role"] = $user["role"];
?>

الوظيفة معرف_الجلسة (صحيح) يساعد على الحماية من تثبيت الجلسة عن طريق إنشاء معرف جلسة جديد بعد تسجيل الدخول.

للتحقق مما إذا كان المستخدم قد قام بتسجيل الدخول:

<?php
session_start();

if (empty($_SESSION["user_id"])) {
    header("Location: login.php");
    exit;
}
?>

لتسجيل الخروج، قم بمسح بيانات الجلسة وتدمير الجلسة.

<?php
session_start();

$_SESSION = [];

session_destroy();

header("Location: login.php");
exit;
?>

تتضمن ممارسات أمان الجلسة المهمة ما يلي:

  • قم بإعادة إنشاء معرف الجلسة بعد تسجيل الدخول.

  • لا تقم بتخزين كلمات المرور في الجلسة.

  • استخدم HTTPS في الإنتاج.

  • قم بتعيين خيارات ملفات تعريف الارتباط الآمنة عندما يكون ذلك ممكنًا.

  • تدمير الجلسات أثناء تسجيل الخروج.

  • التحقق من الأذونات على الصفحات المحمية.

أمن ملفات تعريف الارتباط

يتم تخزين ملفات تعريف الارتباط في متصفح المستخدم، لذا يجب ألا تحتوي على معلومات حساسة مثل كلمات المرور البسيطة أو الرموز الخاصة أو بيانات المستخدم السرية.

عند تعيين ملفات تعريف الارتباط، يسمح PHP بالخيارات المتعلقة بالأمان.

<?php
setcookie("theme", "dark", [
    "expires" => time() + 3600,
    "path" => "/",
    "secure" => true,
    "httponly" => true,
    "samesite" => "Lax"
]);
?>

ال يؤمن الخيار يعني أنه يجب إرسال ملف تعريف الارتباط عبر HTTPS فقط. ال httponly يمنع الخيار JavaScript من قراءة ملف تعريف الارتباط. ال com.samesite يساعد الخيار في تقليل بعض مخاطر الطلب عبر المواقع.

تعد ملفات تعريف الارتباط مفيدة للتفضيلات والبيانات غير الحساسة، ولكن يجب تصميم المصادقة بعناية باستخدام ممارسات الجلسة والرموز المميزة الآمنة.

أمان رفع الملفات

يمكن أن تكون عمليات رفع الملفات محفوفة بالمخاطر لأن المستخدمين يرسلون الملفات إلى الخادم الخاص بك. إذا لم يتم التحقق من صحة التحميلات بشكل صحيح، فقد يقوم المهاجمون بتحميل ملفات خطيرة أو الكتابة فوق الملفات الموجودة.

يجب أن يتحقق نظام التحميل الآمن من حجم الملف وامتداده ونوع MIME وأخطاء التحميل واسم الملف. ويجب أيضًا تخزين الملفات التي تم تحميلها في دليل خاضع للرقابة.

<?php
$allowedExtensions = ["jpg", "jpeg", "png", "pdf"];
$maxSize = 2 * 1024 * 1024;

if ($_FILES["file"]["error"] !== UPLOAD_ERR_OK) {
    echo "Upload error.";
    exit;
}

$fileName = $_FILES["file"]["name"];
$tmpName = $_FILES["file"]["tmp_name"];
$fileSize = $_FILES["file"]["size"];

$extension = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));

if (!in_array($extension, $allowedExtensions, true)) {
    echo "File type is not allowed.";
    exit;
}

if ($fileSize > $maxSize) {
    echo "File is too large.";
    exit;
}

$newName = bin2hex(random_bytes(16)) . "." . $extension;

move_uploaded_file($tmpName, __DIR__ . "/uploads/" . $newName);

echo "File uploaded safely.";
?>

لا تثق في اسم الملف الأصلي. قم بإنشاء اسم آمن جديد بدلاً من ذلك. يساعد هذا على منع الكتابة فوق الملفات ويقلل المخاطر الناجمة عن الأحرف الخاصة.

للحصول على حماية أفضل، لا ينبغي وضع الملفات التي تم تحميلها في دليل حيث يمكن تنفيذ البرامج النصية PHP. إذا أمكن، قم بتخزين التحميلات خارج جذر الويب العام وخدمتها من خلال منطق التنزيل المتحكم فيه.

التفويض وأدوار المستخدم

المصادقة تجيب على السؤال: من هو المستخدم؟ يجيب التفويض على السؤال: ما الذي يُسمح للمستخدم بفعله؟

قد يكون المستخدم قد قام بتسجيل الدخول، ولكن هذا لا يعني أنه يجب عليه الوصول إلى كل صفحة أو تنفيذ كل إجراء. على سبيل المثال، يجب على المسؤولين فقط حذف المستخدمين، ويجب على مالك المنشور فقط تحرير هذا المنشور ما لم يكن لدى المستخدم أذونات أعلى.

<?php
session_start();

if (($_SESSION["user_role"] ?? "") !== "admin") {
    http_response_code(403);
    echo "Access denied.";
    exit;
}

echo "Welcome to admin area.";
?>

للتحقق من الملكية، قارن معرف المستخدم الذي تم تسجيل الدخول به مع معرف مالك المورد.

<?php
if ($post["user_id"] !== $_SESSION["user_id"]) {
    http_response_code(403);
    echo "You cannot edit this post.";
    exit;
}
?>

يجب دائمًا التحقق من التفويض من جانب الخادم. لا يعد إخفاء زر في HTML أو JavaScript كافيًا لأنه لا يزال بإمكان المستخدمين إرسال الطلبات يدويًا.

معالجة الأخطاء ووضع التصحيح

تعتبر رسائل الخطأ مفيدة أثناء التطوير، ولكنها قد تكشف معلومات حساسة أثناء الإنتاج. لا ينبغي أن تظهر بيانات اعتماد قاعدة البيانات، ومسارات الملفات، واستعلامات SQL، وتتبعات المكدس للمستخدمين العموميين.

أثناء التطوير، يمكن أن يساعد عرض الأخطاء في تصحيح الأخطاء:

<?php
ini_set("display_errors", "1");
error_reporting(E_ALL);
?>

في عملية الإنتاج، يجب عادةً تسجيل الأخطاء بدلاً من عرضها:

<?php
ini_set("display_errors", "0");
ini_set("log_errors", "1");
error_reporting(E_ALL);
?>

عندما يفشل شيء ما، قم بإظهار رسالة آمنة للمستخدم وقم بتسجيل التفاصيل الفنية بشكل خاص.

<?php
try {
    // Database or application logic
} catch (Exception $exception) {
    error_log($exception->getMessage());

    echo "Something went wrong. Please try again later.";
}
?>

يحمي هذا الأسلوب تفاصيل النظام الحساسة مع السماح للمطورين بالتحقيق في الأخطاء من خلال السجلات.

ممارسات قواعد البيانات الآمنة

لا يقتصر أمان قاعدة البيانات على العبارات المحضرة فقط. ويتضمن أيضًا الأذونات والنسخ الاحتياطية ومعالجة الأخطاء وتجنب الوصول غير الضروري.

تتضمن ممارسات أمان قاعدة البيانات المهمة ما يلي:

  • استخدم العبارات المحضرة لجميع مدخلات المستخدم.

  • استخدم مستخدم قاعدة البيانات بأذونات محدودة.

  • لا تكشف عن بيانات اعتماد قاعدة البيانات علنًا.

  • قم بتخزين بيانات الاعتماد في ملفات التكوين أو البيئة.

  • لا تظهر أخطاء قاعدة البيانات الأولية للمستخدمين.

  • النسخ الاحتياطي لقواعد البيانات الهامة بانتظام.

  • التحقق من صحة البيانات قبل حفظها.

على سبيل المثال، لا ينبغي أن يحتاج مستخدم قاعدة البيانات التي يستخدمها موقع الويب دائمًا إلى أذونات إدارية كاملة. في مرحلة الإنتاج، يكون من الآمن منح الأذونات التي يحتاجها التطبيق فقط.

تأمين PHP التكوين

ترتبط بعض الممارسات الأمنية بالخادم وتكوين PHP. لا يزال من الممكن إضعاف التطبيق الآمن بسبب التكوين غير الآمن.

تتضمن ممارسات التكوين المهمة ما يلي:

  • حافظ على تحديث PHP.

  • تعطيل عرض الأخطاء في الإنتاج.

  • استخدم HTTPS لمواقع الإنتاج.

  • قم بتعيين أذونات الملف والدليل الصحيحة.

  • لا ترتكب أسرارًا في مستودعات Git.

  • حماية ملفات البيئة من الوصول العام.

  • تحديد حجم التحميل وفقًا لاحتياجات التطبيق.

  • قم بإزالة الملفات غير المستخدمة والبرامج النصية للاختبار والنسخ الاحتياطية القديمة من الدلائل العامة.

الأمن ليس مجرد رمز. إنه أيضًا النشر والتكوين والتحديثات والأذونات والمراقبة.

قائمة التحقق من الأمان لمشاريع PHP

يمكن لقائمة التحقق الأمنية العملية PHP أن تساعد المطورين على مراجعة تطبيقاتهم قبل النشر.

  • التحقق من صحة جميع المدخلات من النماذج وعناوين URL وملفات تعريف الارتباط وواجهات API والملفات.

  • قم بإلغاء جميع المخرجات التي أنشأها المستخدم باستخدام الطريقة الصحيحة لسياق الإخراج.

  • استخدم العبارات المحضرة لاستعلامات قاعدة البيانات.

  • تجزئة كلمات المرور باستخدام password_hash().

  • التحقق من كلمات المرور باستخدام password_verify().

  • إعادة إنشاء معرف الجلسة بعد تسجيل الدخول.

  • قم بحماية النماذج الحساسة باستخدام الرموز المميزة CSRF.

  • تحقق من أذونات المستخدم قبل الإجراءات المحمية.

  • التحقق من صحة الملفات التي تم تحميلها بعناية.

  • لا تظهر الأخطاء الفنية في الإنتاج.

  • استخدم HTTPS في الإنتاج.

  • حافظ على تحديث PHP والحزم وبرامج الخادم.

  • تخزين الأسرار خارج الملفات العامة.

  • استخدم النسخ الاحتياطية للبيانات المهمة.

لا تغطي قائمة المراجعة هذه كل موضوعات الأمان المحتملة، ولكنها تغطي أهم الأسس التي يجب على كل مبتدئ في PHP أن يفهمها.

كيف يعمل أمان PHP في المشاريع الحقيقية

في التطبيقات الحقيقية، يتم استخدام مفاهيم الأمان معًا. على سبيل المثال، يقوم نظام تسجيل الدخول بالتحقق من صحة الإدخال، ويستخدم العبارات المحضرة للعثور على المستخدم، والتحقق من تجزئة كلمة المرور، وإعادة إنشاء معرف الجلسة، وتخزين معرف المستخدم فقط في الجلسة، وإعادة توجيه المستخدم إلى لوحة معلومات محمية.

<?php
session_start();

$pdo = new PDO(
    "mysql:host=localhost;dbname=app;charset=utf8mb4",
    "root",
    ""
);

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$email = trim($_POST["email"] ?? "");
$password = $_POST["password"] ?? "";

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo "Invalid login details.";
    exit;
}

$statement = $pdo->prepare("SELECT id, name, email, password FROM users WHERE email = :email LIMIT 1");
$statement->execute([
    "email" => $email
]);

$user = $statement->fetch(PDO::FETCH_ASSOC);

if (!$user || !password_verify($password, $user["password"])) {
    echo "Invalid login details.";
    exit;
}

session_regenerate_id(true);

$_SESSION["user_id"] = $user["id"];

header("Location: dashboard.php");
exit;
?>

يجمع هذا المثال بين التحقق من الصحة والعبارات المحضرة والتحقق من كلمة المرور وأمن الجلسة وسلوك تسجيل الدخول الآمن.

الأمن في أطر عمل PHP الحديثة

توفر أطر عمل PHP الحديثة مثل Laravel وSymfony أدوات مدمجة للعديد من المهام الأمنية. وهي تشمل التحقق من صحة الطلب، وحماية CSRF، وتجزئة كلمة المرور، وأنظمة المصادقة، وسياسات الترخيص، والجلسات الآمنة، والهروب في القوالب، ومنشئي استعلام قاعدة البيانات.

ومع ذلك، فإن تعلم الأمان بلغة PHP الخالصة لا يزال مهمًا. يساعدك على فهم ما يفعله إطار العمل خلف الكواليس ويسمح لك باتخاذ قرارات أفضل عند إنشاء منطق مخصص.

على سبيل المثال، يمكن لـ Laravel حماية النماذج باستخدام رموز CSRF تلقائيًا، وتجزئة كلمات المرور باستخدام مساعدين آمنين، والهروب من مخرجات Blade افتراضيًا، واستخدام روابط Eloquent أو منشئ الاستعلام لتقليل مخاطر SQL injection. لكن لا يزال المطور بحاجة إلى التحقق من صحة الإدخال وأذونات التصميم وحماية تحميلات الملفات وتجنب ممارسات الترميز غير الآمنة.

خاتمة

يعد الأمان PHP مهارة أساسية لكل مطور للواجهة الخلفية. تتطلب التطبيقات الآمنة معالجة دقيقة للمدخلات والمخرجات وقواعد البيانات والجلسات وكلمات المرور والملفات والأخطاء وملفات تعريف الارتباط والأذونات.

تشمل أهم الممارسات التحقق من صحة المدخلات، والهروب من المخرجات، واستخدام العبارات المحضرة، والحماية من SQL injection، ومنع XSS، واستخدام الرموز المميزة CSRF، وتجزئة كلمات المرور، وتأمين الجلسات، والتحقق من صحة رفع الملفات، وإخفاء الأخطاء الفنية في الإنتاج.

الأمن ليس ميزة واحدة. إنها عادة مستمرة يجب تطبيقها طوال المشروع بأكمله. بعد فهم أساسيات الأمان PHP، فإن الخطوة التالية هي التدريب من خلال إنشاء نظام تسجيل دخول آمن، ولوحة معلومات محمية، ونموذج آمن لرفع الملفات، وتطبيق CRUD مع التحقق من الصحة والعبارات المحضرة.