×

System Alert: E_USER_DEPRECATED
Message: Passing a "Symfony\Component\Translation\MessageSelector" instance into the "Symfony\Component\Translation\Translator::__construct()" method as a second argument is deprecated since Symfony 3.4 and will be removed in 4.0. Inject a "Symfony\Component\Translation\Formatter\MessageFormatterInterface" implementation instead.
File: /home/netwinai/public_html/core/vendor/symfony/translation/Translator.php
Line: 90

حتما برای شما هم پیش آمده که روی یک فایل PHP پسورد بگذارید. مثلا یک فایل با پردازش سنگین دارید که نمی خواهید هر کسی حتی بصورت تصادفی آن را اجرا کند. در این مقاله ابتدا چندین روش رمزگذاری روی فایل های PHP را معرفی می کنیم و سپس با یک روش بسیار ساده و تنها با چند خط PHP به شما می آموزیم چطور روی یک فایل PHP رمزگذاری کنید.

روش های معمول رمزگذاری روی فایل های PHP:

یکی از راه های رمز گذاری روی فایل ها از جمله فایلهای PHP در سرور استفاده از HTTP Authentication می باشد. این کار بوسیله WebService نصب شده روی سرور شما انجام میشود. مانند Apache که بوسیله htaccess و htpasswd روی فایل های موردنظر و یا پوشه رمز گذاری میکند.

مشکل این روش این است که ممکن است در کدهای Symlink و برخی از کدهای ارجایی توسط PHP مشکل ایجاد کند. همچنین تعریف user و password کمی زمانبر است. علاوه بر آن برای هر WebService نیاز دارید کد مخصوص آن را وارد کنید. مثلا کد htaccess مربوط Apache روی NginX کار نمی کند.

یکی دیگر از روش های رمز گذاری استفاده از Session در خود PHP و تعریف user و passowrd است. این راه معمول ترین راهی است که برنامه نویسان استفاده میکنند. تمامی سایت ها و برنامه های وب از Session برای پل ارتباطی بین مرورگر و سرور استفاده میکنند.

منتها این روش هم مشکلاتی ممکن است داشته باشد. اینکه اگر برنامه نویس مراقب نباشد یک هکر براحتی توسط دستورات xss یا آلوده کردن مرورگر کاربر و خواندن نام کاربری/رمز ورود وارد شده، می تواند آن را هک کند.

مزیت استفاده از HTTP Authentication که خود PHP آن را ایجاد کرده :

  • در حد چند خط و بسیار ساده است.

  • وابسته به نوع WebService نیست.​

  •  می توانید قبل اجرای هر دستوری در PHP آن را فراخوانی کنید.

  • نیازی به session ندارد.

  • شما می توانید به عنوان پسورد لایه اول از آن استفاده کنید و سپس پسورد های دیگر خود برنامه فراخوانی شوند.

کد PHP نمونه اول : ...

    $AUTH_USER = 'admin';
    $AUTH_PASS = 'admin';
    header('Cache-Control: no-cache, must-revalidate, max-age=0');
    $has_supplied_credentials = !(empty($_SERVER['PHP_AUTH_USER']) && empty($_SERVER['PHP_AUTH_PW']));
    $is_not_authenticated = (
        !$has_supplied_credentials ||
        $_SERVER['PHP_AUTH_USER'] != $AUTH_USER ||
        $_SERVER['PHP_AUTH_PW']   != $AUTH_PASS
    );
    if ($is_not_authenticated) {
        header('HTTP/1.1 401 Authorization Required');
        header('WWW-Authenticate: Basic realm="Access denied"');
        exit;
    }

کد بالا ساده ترین روش استفاده از PHP HTTP Authentication است. اگر زیاد سختگیر نمی باشید، کد بالا می تواند نیاز شما را برطرف کند. متغیر $AUTH_USER برای نام کاربری و $AUTH_PASS برای پسورد تعریف کنید. می توانید کد بالا را در ابتدای فایل خود قرار دهید و یا در یک تابع مجزا قرارداده و هر وقت نیاز داشتید فراخوانی کنید.

البته کد بالا کامل نیست! اولین مشکل آن این است که فقط یک نام کاربری و رمز ورود قبول میکند. مشکل دوم این است این نام کاربری و رمز ورود توسط HTTP Header ارسال می شود و هیچ Encode یا رمزگذاری روی آن اجام نمی شود. این بدین معنی است که می تواند قبل از رسیدن به سرور به شیوه های مختلف خوانده شود. مثلا سرویس دهنده اینترنت شما می تواند نام کاربری و رمز ورود شما را بین راه شناسایی کند.

کد PHP نمونه دوم:

<?php
$realm = 'Restricted area';

//user => password
$users = array('admin' => 'mypass', 'guest' => 'guest');

if (empty($_SERVER['PHP_AUTH_DIGEST'])) {
    header('HTTP/1.1 401 Unauthorized');
    header('WWW-Authenticate: Digest realm="'.$realm.
           '",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"');

    die('Text to send if user hits Cancel button');
}

// analyze the PHP_AUTH_DIGEST variable
if (!($data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) ||
    !isset($users[$data['username']]))
    die('Wrong Credentials!');

// generate the valid response
$A1 = md5($data['username'] . ':' . $realm . ':' . $users[$data['username']]);
$A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']);
$valid_response = md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2);

if ($data['response'] != $valid_response)
    die('Wrong Credentials!');

// ok, valid username & password
echo 'You are logged in as: ' . $data['username'];

// function to parse the http auth header
function http_digest_parse($txt)
{
    // protect against missing data
    $needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1);
    $data = array();
    $keys = implode('|', array_keys($needed_parts));

    preg_match_all('@(' . $keys . ')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@', $txt, $matches, PREG_SET_ORDER);

    foreach ($matches as $m) {
        $data[$m[1]] = $m[3] ? $m[3] : $m[4];
        unset($needed_parts[$m[1]]);
    }

    return $needed_parts ? false : $data;
}
?>

در مثال بالا یک نمونه کد کامل داریم. امنیت این کد بسیار بالاست و بصورت MD5 بهمراه کلید خاص رمزگذاری می شود. حتی سرویس دهنده اینترنت و فایروال ها هم قادر به شناسایی رمز ورود شما نمی باشند. همچنین آرایه ای از نام کاربری و رمز ورود دریافت میکند و شما می توانید در آرایه $users که ابتدای کد تعریف شده، لیستی از نام کاربری و رمز ورود به برنامه بدهید. به عنوان مثال می توانید آن را از دیتابیس فراخوانی کنید.

توجه کنید که این نوع رمزگذاری معمولا برای برنامه های کوچک، صفحات کاملا شخصی و یا اطمینان بیشتر از عدم نفوذ انجام می شود. استفاده از این روش یعنی HTTP Authentication باعث می شود موتورهای جستجو از جمله گوگل به محتوای رمزگذاری شده شما دسترسی نداشته باشند.