ویژگی تصویر

ساخت CMS ساده با PHP

  /  PHP   /  ساخت CMS ساده با PHP
بنر تبلیغاتی الف
آموزش PHP

یک سیستم مدیریت محتوا (CMS) ساده به توسعه‌دهندگان کمک می‌کند تا بدون نیاز به پلتفرم‌های سنگین، محتوای سایت را مدیریت کنند. PHP به‌خاطر یادگیری سریع، پشتیبانی گسترده و سازگاری با MySQL یکی از محبوب‌ترین گزینه‌ها برای ساخت CMS ساده است. در این مقاله گام‌های عملی، نکات امنیتی و نمونه‌کدهای کاربردی برای پیاده‌سازی یک CMS پایه ارائه می‌شود.

پیش‌نیازها

  • PHP 7.4+ یا بالاتر
  • MySQL / MariaDB
  • وب‌سرور مثل Apache یا Nginx
  • آشنایی پایه با HTML و SQL

طراحی پایگاه داده (Schema)

یک ساختار ساده برای ذخیره مقالات، کاربران و نظرات کافی است. جدول زیر یک نمونهٔ پایه را نشان می‌دهد:

جدولستون‌ها
usersid (INT PK), username (VARCHAR), password (VARCHAR), role (VARCHAR)
postsid (INT PK), title (VARCHAR), slug (VARCHAR), body (TEXT), author_id (INT), created_at (DATETIME)

مثال SQL برای ایجاد جداول

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(100) NOT NULL UNIQUE,
  password VARCHAR(255) NOT NULL,
  role VARCHAR(20) DEFAULT 'editor'
);

CREATE TABLE posts (
  id INT AUTO_INCREMENT PRIMARY KEY,
  title VARCHAR(255) NOT NULL,
  slug VARCHAR(255) NOT NULL UNIQUE,
  body TEXT NOT NULL,
  author_id INT NOT NULL,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (author_id) REFERENCES users(id)
);

این SQL دو جدول پایه ایجاد می‌کند: users برای احراز هویت و posts برای ذخیره مقالات. ستون slug برای URL دوستانه (SEO-friendly) مفید است.

اتصال امن به دیتابیس با PDO

<?php
// db.php
$dsn = 'mysql:host=localhost;dbname=cms;charset=utf8mb4';
$options = [
  PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];
$pdo = new PDO($dsn, 'db_user', 'db_pass', $options);
?>

کد بالا اتصال PDO را ایجاد می‌کند. استفاده از PDO و تنظیم ERRMODE باعث می‌شود خطاها کنترل‌شده و ایمن‌تر پردازش شوند.

نمایش لیست مقالات (Front-end)

<?php
// index.php
require 'db.php';
$stmt = $pdo->query('SELECT id, title, slug, created_at FROM posts ORDER BY created_at DESC');
$posts = $stmt->fetchAll();
foreach ($posts as $post) {
  echo '<h2><a href="/post.php?slug=' . htmlspecialchars($post['slug']) . '">' . htmlspecialchars($post['title']) . '</a></h2>';
  echo '<p>' . htmlspecialchars($post['created_at']) . '</p>';
}
?>

در این مثال با استفاده از htmlspecialchars از XSS جلوگیری شده و لیست مقالات بر اساس تاریخ مرتب می‌شود. برای URL دوستانه بهتر است از rewrites استفاده کنید.

ایجاد مقاله با امنیت پایه (CRUD)

<?php
// create_post.php (simplified)
session_start();
require 'db.php';

// Simple CSRF token
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  if (!hash_equals($_SESSION['csrf'], $_POST['csrf'] ?? '')) {
    die('Invalid CSRF token');
  }

  $title = $_POST['title'];
  $body = $_POST['body'];
  $slug = preg_replace('/[^a-z0-9-]+/i', '-', strtolower(trim($title)));
  $author_id = 1; // get from session in real app

  $stmt = $pdo->prepare('INSERT INTO posts (title, slug, body, author_id) VALUES (?, ?, ?, ?)');
  $stmt->execute([$title, $slug, $body, $author_id]);
  header('Location: /');
  exit;
}
$_SESSION['csrf'] = bin2hex(random_bytes(16));
?>

<form method="post">
  <input type="hidden" name="csrf" value="<?=htmlspecialchars($_SESSION['csrf'])?>" />
  <input name="title" required />
  <textarea name="body" required></textarea>
  <button type="submit">Publish</button>
</form>

این اسکریپت نمونه نشان می‌دهد چگونه با token CSRF ساده و prepared statements از حملات CSRF و SQL Injection جلوگیری می‌کنیم. در پروژه واقعی، شناسه کاربر از session گرفته و اعتبارسنجی ورودی‌ها قوی‌تر انجام می‌شود.

احراز هویت و مدیریت رمز عبور

برای ثبت کاربر و ورود از password_hash و password_verify استفاده کنید. مثال ساده:

// register.php (snippet)
$hash = password_hash($password, PASSWORD_DEFAULT);
// store $hash in DB

// login.php (snippet)
if (password_verify($passwordInput, $storedHash)) {
  // login success
}

استفاده از password_hash از شما را در برابر حملات brute-force و ذخیره رمز به صورت plaintext محافظت می‌کند.

آپلود فایل و مدیریت رسانه

  • فایل‌ها را در سیستم فایل نگه دارید و در DB فقط مسیر را ذخیره کنید.
  • نوع فایل و اندازه را چک کنید.
  • نام فایل را sanitize یا با UUID جایگزین کنید.

نکات امنیتی و بهینه‌سازی (تجربهٔ توسعه‌دهندگان)

  • همیشه از prepared statements با PDO استفاده کنید.
  • ورودی‌های کاربران را معتبرسازی و خروجی‌ها را با htmlspecialchars خروجی‌دهی کنید.
  • از محدودیت دسترسی (roles) برای صفحات مدیریت استفاده کنید.
  • برای SEO از slug خوانا و نقشهٔ سایت (sitemap) استفاده کنید.
  • برای بهبود سرعت، صفحات استاتیک یا نتایج دیتابیس را کش کنید (Memcached یا فایل سیستم).
  • سطح دسترسی فایل‌ها و پوشه‌ها را در سرور تنظیم کنید (مثلاً uploads قابل اجرا نباشد).

قابلیت‌های تکمیلی و معماری بهتر

برای تولید یک CMS قابل نگهداری پیشنهاد می‌شود MVC یا حداقل تفکیک لایه‌ها (روتر، کنترلر، مدل، ویو) رعایت شود. استفاده از Composer برای مدیریت کتابخانه‌ها، و پیاده‌سازی unit tests برای منطق مهم مفید است. همچنین استفاده از فریم‌ورک‌های کوچک مثل Slim یا Lumen می‌تواند سرعت توسعه را بالا ببرد.

نمونه بهبود: استفاده از transactions و error handling

try {
  $pdo->beginTransaction();
  // multiple DB operations
  $pdo->commit();
} catch (Exception $e) {
  $pdo->rollBack();
  // log error and show friendly message
}

این روش تضمین می‌کند عملیات چندگانهٔ پایگاه‌داده به‌صورت اتمیک اجرا شوند و در صورت خطا داده‌ها به حالت پایدار بازگردند.

نتیجه‌گیری و مسیر بعدی

ساخت یک CMS ساده با PHP فرصتی عالی برای یادگیری مفاهیم امنیت، معماری وب و بهبود عملکرد است. با رعایت اصول پایه مانند استفاده از PDO، password_hash، CSRF و مفاهیم caching می‌توانید یک CMS سبک، امن و قابل توسعة شخصی بسازید. برای گسترش، اضافه کردن نسخه‌بندی محتوا، پلاگین‌پذیری و ویرایشگر WYSIWYG گزینه‌های مناسب بعدی هستند.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: