سؤال

ما هي بعض المبادئ التوجيهية من أجل الحفاظ على المسؤول الدورة الأمن مع PHP?هناك معلومات في كل مكان على الانترنت حان الوقت كل هبطت في مكان واحد!

هل كانت مفيدة؟

المحلول

وهناك زوجين من الأشياء للقيام به من أجل الحفاظ على جلسة العمل الخاصة بك آمنة:

  1. استخدام SSL عند مصادقة المستخدمين أو أداء العمليات الحساسة.
  2. تجديد الدورة معرف كلما الأمن التغييرات على مستوى (مثل تسجيل الدخول).يمكنك حتى تتجدد الدورة معرف كل طلب إذا كنت ترغب في ذلك.
  3. الجلسات الوقت
  4. لا تستخدم register globals
  5. تخزين تفاصيل المصادقة على الخادم.التي لا ترسل تفاصيل مثل اسم المستخدم في ملف تعريف الارتباط.
  6. التحقق $_SERVER['HTTP_USER_AGENT'].وهذا يضيف صغيرة حاجز اختطاف الجلسة.يمكنك أيضا التحقق من عنوان IP.ولكن هذا يسبب مشاكل المستخدمين التي تم تغيير عنوان IP بسبب موازنة التحميل على عدة اتصالات الإنترنت وما إلى ذلك (كما هو الحال في بيئتنا هنا).
  7. تأمين الوصول إلى دورات في نظام الملفات أو استخدام مخصص دورة التعامل مع
  8. الحساسة العمليات النظر التي تتطلب تسجيل الدخول للمستخدمين تقديم authenication التفاصيل مرة أخرى

نصائح أخرى

واحد التوجيهي هو الاتصال session_regenerate_id في كل مرة جلسة الأمن على مستوى التغييرات.هذا يساعد على منع اختطاف الجلسة.

بلدي اثنين (أو أكثر) سنتا:

  • لا تثق بأحد
  • تصفية الإدخال الهروب الإخراج (كوكي الدورة بيانات المدخلات الخاصة بك أيضا)
  • تجنب XSS (الحفاظ على HTML الخاص بك بشكل جيد ، نلقي نظرة على PHPTAL أو HTMLPurifier)
  • الدفاع في العمق
  • لا تعرض البيانات

هناك مجموعة صغيرة ولكن كتاب جيد في هذا الموضوع: الأساسية PHP الأمن كريس Shiflett.

الأساسية PHP الأمن http://shiflett.org/images/essential-php-security-small.png

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

يمكنك استخدام تقنية المذكورة أعلاه (IP & وكيل المستخدم) ، هو موضح هنا: كيفية تجنب سرقة الهوية

أعتقد أن واحدة من المشاكل الرئيسية (التي يتم تناولها في PHP 6) هو register_globals.الآن واحدة من الأساليب القياسية المستخدمة لتجنب register_globals هو استخدام $_REQUEST, $_GET أو $_POST المصفوفات.

"الصحيح" طريقة للقيام بذلك (كما 5.2, على الرغم من انها عربات التي تجرها الدواب قليلا هناك ، ولكن مستقرة اعتبارا من 6 ، الذي هو قريبا) من خلال المرشحات.

وذلك بدلا من:

$username = $_POST["username"];

يمكنك أن تفعل:

$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);

أو حتى مجرد:

$username = filter_input(INPUT_POST, 'username');

هذه الدورة تثبيت الورق وقد مؤشرات جيدة حيث هجوم قد يأتي.انظر أيضا دورة التثبيت صفحة في ويكيبيديا.

باستخدام عنوان IP ليس حقا أفضل فكرة في تجربتي.على سبيل المثال ؛ مكتبي اثنين من عناوين IP التي تستخدم اعتمادا على الحمولة ونحن باستمرار تشغيل في القضايا باستخدام عناوين IP.

بدلا من ذلك, لقد اختار لتخزين دورات في قاعدة بيانات منفصلة عن المجالات على الخوادم.هذه الطريقة لا أحد على نظام الملفات الوصول إلى هذا الدورة معلومات عن الفندق.هذه كانت مفيدة حقا مع انشئ قبل 3.0 (لقد منذ ثابت هذا) ولكن انها لا تزال فكرة جيدة على ما أعتقد.

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

هنا هو فكرة جيدة البرنامج التعليمي على setTimer() و clearTimer().

المشكلة الرئيسية مع PHP دورات الأمن (إلى جانب الدورة اختطاف) يأتي مع بيئة ما كنت في.بشكل افتراضي PHP مخازن الدورة البيانات في ملف في نظام التشغيل دليل temp.دون أي تفكير أو تخطيط هذا هو العالم للقراءة دليل لذلك كل دورة المعلومات العامة مع أي شخص الوصول إلى الملقم.

أما بالنسبة الحفاظ على دورات عبر ملقمات متعددة.عند هذه النقطة سيكون من الأفضل أن التبديل PHP المستخدم التعامل مع جلسات حيث المكالمات الخاصة بك توفير وظائف الخام (إنشاء, قراءة, update, delete) الدورة البيانات.عند هذه النقطة يمكنك تخزين دورة المعلومات في قاعدة بيانات أو memcache مثل حل حتى يتسنى لجميع خوادم التطبيقات الوصول إلى البيانات.

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

أنا وضعت بلدي دورات مثل هذا-

على صفحة تسجيل الدخول:

$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR']);

(العبارة المحددة على التكوين الصفحة)

ثم على رأس الذي هو في بقية أنحاء الموقع:

session_start();
if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR'])) {       
    session_destroy();
    header('Location: http://website login page/');
    exit();     
}

php.ini

session.cookie_httponly = 1
change session name from default PHPSESSID

eq أباتشي إضافة رأس:

X-XSS-Protection    1

أود أن تحقق كلا IP وكيل المستخدم لمعرفة ما إذا كانوا التغيير

if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
    || $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
    //Something fishy is going on here?
}

إذا كنت تستخدم session_set_save_handler() يمكنك تعيين الخاص بك الدورة معالج.على سبيل المثال هل يمكن تخزين جلسات العمل الخاصة بك في قاعدة البيانات.الرجوع إلى php.net التعليقات على أمثلة قاعدة بيانات الدورة معالج.

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

تحتاج إلى تأكد من الدورة البيانات آمنة.من خلال النظر في php الخاص بك.ini أو باستخدام phpinfo() يمكنك أن تجد لك الدورة الإعدادات._session.save_path_ يخبرك أين يتم حفظها.

تحقق من الأذونات من المجلد و من والديه.فإنه لا ينبغي أن يكون الجمهور (/tmp) أو الوصول إلى مواقع أخرى على خادم مشترك.

على افتراض كنت لا تزال تريد استخدام دورة php, يمكنك تعيين php لاستخدام مجلد آخر عن طريق تغيير _session.save_path_ أو حفظ البيانات في قاعدة البيانات عن طريق تغيير _session.save_handler_ .

كنت قد تكون قادرة على تعيين _session.save_path_ في php الخاص بك.ini (بعض مقدمي تسمح بذلك) أو أباتشي + mod_php في .ملف htaccess في المجلد الجذر:php_value session.save_path "/home/example.com/html/session".يمكنك أيضا تعيين في وقت التشغيل مع _session_save_path()_ .

تحقق كريس Shiflett التعليمي أو Zend_Session_SaveHandler_DbTable إلى تعيين بديل الدورة معالج.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top