أجهزة الكمبيوتر شبابيك إنترنت

ما الفرق بين HTTP_HOST و SERVER_NAME في PHP؟ مصفوفة عمومية PHP $ _SERVER استرداد متغير البيئة HTTP_X_FORWARDED_FOR

_SERVER دولارهي واحدة من أهم المصفوفات المحددة مسبقًا في PHP. يحتوي على المتغيرات المستلمة من الخادم بواسطة مترجم PHP. استخدم الجميع هذه المتغيرات ، أو سيستخدمونها بالتأكيد ، لأنه بدونها يصعب تنظيم الدعم الكامل لتطبيقات الويب.

في مقالتي ، أقترح جدولًا يحتوي على المتغيرات الرئيسية لمصفوفة superglobal $ _SERVER. الجدول مشابه للجدول المصمم لوظائف سلسلة PHP.

لعرض جميع عناصر المصفوفة $ _SERVER ، تحتاج إلى: أ) إما استدعاء دالة print_r () ، والتي ستطبع المصفوفة ؛ ب) إما أن تستدعي الدالة phpinfo () ، والتي ستعرض معلومات حول مترجم PHP.

باختصار حول $ HTTP_SERVER_VARS

تحل المصفوفة superglobal $ _SERVER محل مصفوفة HTTP_SERVER_VARS $ في PHP 4.1.0. HTTP_SERVER_VARS دولارلا تستخدم الآن ، ولكن الأمر يستحق أن تعرف عنه. بادئ ذي بدء ، لم يكن الإصدار القديم نظامًا عالميًا تلقائيًا. الاختلاف الثاني هو أن بعض عناصر المصفوفة $ _SERVER غير موجودة في HTTP_SERVER_VARS $ ، على الرغم من أن متغيراتها هي نفسها في معظم الحالات.

عنصر

وصف قصير

مثال

$ _SERVER ["DOCUMENT_ROOT"]

يحتوي على المسار إلى الدليل الجذر للخادم.

$ _SERVER ["HTTP_HOST"]

$ _SERVER ["SERVER_NAME"]

$ _SERVER ["SCRIPT_FILENAME"]

يحتوي على اسم البرنامج النصي ، بدءًا من الدليل الجذر للمضيف الظاهري.

C: \ folder \ index.php

/www/folder/index.php

$ _SERVER ["PHP_SELF"]

$ _SERVER ["SCRIPT_NAME"]

يحتوي على اسم البرنامج النصي.

$ _SERVER ["REQUEST_URI"]

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

/www/folder/index.php؟page=2&num=5

_SERVER $ ["QUERY_STRING"]

يحتوي على معلمات تم تمريرها إلى البرنامج النصي بواسطة طريقة GET.

عن العنوان

http://site.com/index.php؟page=2&num=5

سيتم الإخراج

_SERVER $ ["REQUEST_METHOD"]

يحتوي على طريقة الطلب المستخدمة لاستدعاء البرنامج النصي.

احصل على أوبريد

$ _SERVER ["HTTP_REFERER"]

يحتوي على عنوان الصفحة التي جاء منها الزائر.

http://yandex.ru/yandsearch

_SERVER $ ["HTTP_USER_AGENT"]

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

نوكيا - نوكيا ؛ Sony Ericsson - ERICSSON أو SONYERICSSON ؛ Samsung - SAMSUNG أو SEC- ؛ موتورولا - MOT ؛ LG - LG أو LG- ؛ الكاتيل - الكاتيل ؛ باناسونيك - باناسونيك ؛ ساجيم - ساجيم ؛ بانتيك - بانتيك ؛ سيمنز - SIE ؛ بينكيو - بينكيو ؛ NEC - NEC ؛ شارب - حاد.

Mozilla / 4.0 (متوافق ، MSIE 6.0 ، Windows NT 5.1) ( أي 6وويندوز إكس بي)

Mozilla / 4.0 (متوافق ؛ MSIE 7.0 ؛ Windows NT 5.0) أوبرا 9.50 ( أوبرا 9.5ونظام التشغيل Windows 2000)

$ _SERVER ["REMOTE_ADDR"]

يحتوي على عنوان IP الخاص بالعميل.

$ _SERVER ["SERVER_ADDR"]

يحتوي على عنوان IP الخاص بالخادم.

$ _SERVER ["HTTP_ACCEPT"]

يصف تفضيل العميل لنوع المستند. يتم استرداد محتوى هذا العنصر من عنوان قبول HTTP الذي تم تمريره إلى الخادم بواسطة العميل.

تنسيق الإخراج: نوع MIME [[؛ q] ، نوع MIME آخر [؛ ف] ...]

يمكن أن يكون هناك العديد من أنواع MIME المفضلة ، ثم يتم فصلها بفواصل. * يستخدم لتعيين قالب ، تجميع. q - معامل التفضيل ، افتراضيًا ، يتراوح من 0 إلى 1.

image / jpeg ، image / x-xbitmap ، التطبيق / x-shockwave-flash

صورة / *؛ q = 0.5 ، صورة / jpeg (يفضل zhpeg على جميع التنسيقات الأخرى)

$ _SERVER ["HTTP_ACCEPT_LANGUAGE"]

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

ru، en؛ ف = 0.9 (تفضيل اللغة الروسية ، ولكن إذا لم تكن موجودة - واللغة الإنجليزية ستفعل ذلك)

$ _SERVER ["HTTP_ACCEPT_CHARSET"]

على غرار سابقاتها. يحتوي على رأس Accept-Charset

$ _SERVER ["HTTP_ACCEPT_ENCODING"]

على غرار سابقاتها. يحتوي على رأس Accept-Encoding

$ _SERVER ["SERVER_PORT"]

يحتوي على منفذ استماع الخادم.

_SERVER $ ["SERVER_SOFTWARE"]

يحتوي على معلومات حول خادم الويب.

Apache / 2.2.4 (Win32)

_SERVER $ ["SERVER_PROTOCOL"]

يحتوي على إصدار بروتوكول HTTP.

$ _SERVER ["GATEWAY_INTERFACE"]

يحتوي على إصدار CGI المستخدم بواسطة خادم الويب.

$ _SERVER ["REQUEST_TIME"]

وقت بدء طلب صفحة الويب بتنسيق UNIX. متاح منذ PHP 5.1.0

العنوان الكامل للصفحة مع المعلمات:

صدى "http: //" .SERVER_NAME. $ _ SERVER ["REQUEST_URI"] ؛
?>

يمكن تنزيل الجدول الذي يحتوي على جميع الوظائف من الرابط بتنسيق * .doc.

انتبه بشكل خاص إلى المتغير $ _SERVER ["REQUEST_URI"] ولا تنس التحقق منه!الحقيقة هي أن استخدامه قد لا يكون آمنًا بشكل خاص. على سبيل المثال ، على موقعك ، يتم إنشاء بعض عناوين url باستخدام هذه المعلمة. ثم يمكنك كتابة الرابط http://site.com/index.php في سطر المتصفح؟ ”>... سيظهر هذا نافذة تعرض محتويات ملف تعريف الارتباط. هذا المثال غير ضار ، لكنه فجوة يمكن للمتسلل من خلالها استغلال الثقب ، على سبيل المثال ، لسرقة البيانات من مستخدم آخر. لذلك - تحقق من المتغير بحثًا عن الأحرف غير الصالحة ، خاصة> و<.

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

تم حظر JavaScript في المستعرض الخاص بك. الرجاء تمكين JavaScript للموقع للعمل!

مجموعة Superglobal $ _SERVER

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

تعليق

  • اعرض القائمة الكاملة لعناصر مصفوفة $ _SERVER
  • يمكنك إما استخدام دالة print_r () ، التي تطبع ملف تفريغ للمصفوفة ، أو باستخدام الدالة phpinfo () ، التي تعرض معلومات حول مترجم PHP.

    Array (=> on => 200 => on => htmlweb.ru => https => 443 => close => Mozilla / 5.0 (متوافق ؛ Googlebot / 2.1 ؛ + http: //www.google.com/bot. html) => * / * => beget = begetok؛ => gzip، deflate => / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin = > => Apache / 2.4.25 (Debian) mpm-itk / 2.4.7-04 OpenSSL / 1.0.2l => htmlweb.ru => 185.12.92.137 => 80 => 144.76.78.4 => / var / www / htmlweb / data / www / htmlweb.ru => http => => /var/www/htmlweb/data/www/htmlweb.ru => [البريد الإلكتروني محمي]=>. php => 35242 => /php/function/$_server.php => CGI / 1.1 => HTTP / 1.0 => GET => => /php/function/٪24_server.php => /index.php => /index.php => 1560059525.711 => 1560059525) 1

    _SERVER $ [" جذر المستند"]

    يحتوي العنصر $ _SERVER ["DOCUMENT_ROOT"] على المسار إلى الدليل الجذر للخادم ، إذا تم تنفيذ البرنامج النصي في مضيف ظاهري ، فإن هذا العنصر يحتوي على المسار إلى الدليل الجذر للمضيف الظاهري. أولئك. في ملف التكوين httpd.conf ، يحتوي المضيف الظاهري على توجيه DocumentRoot ، والذي يتم تعيين القيمة "D: / main" ، وسيحتوي العنصر $ _SERVER ["DOCUMENT_ROOT"] على القيمة "D: main".

    _SERVER $ [" REMOTE_ADDR"]

    يحتوي عنصر $ _SERVER ["REMOTE_ADDR"] على عنوان IP الخاص بالعميل. عند الاختبار على جهاز محلي ، سيكون هذا العنوان 127.0.0.1. ومع ذلك ، عند الاختبار على الشبكة ، سيعيد المتغير عنوان IP للعميل أو خادم الوكيل الأخير الذي وصل العميل من خلاله إلى الخادم. إذا كان العميل يستخدم خادم وكيل ، فيمكنك معرفة عنوان IP الخاص به باستخدام متغير البيئة HTTP_X_FORWARDED_FOR ، والذي يمكن الحصول على قيمته باستخدام دالة getenv ().

    تعليق

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

    استخراج متغير البيئة HTTP_X_FORWARDED_FOR

    صدىgetenv (HTTP_X_FORWARDED_FOR) ،

    _SERVER $ [" SCRIPT_FILENAME"]

    يحتوي العنصر $ _SERVER ["SCRIPT_FILENAME"] على المسار المطلق للملف من جذر القرص. لذلك ، إذا كان الخادم يعمل بنظام تشغيل Windows ، فقد يبدو هذا المسار على النحو التالي "d: main estindex.php" ، أي يتم تحديد المسار من القرص ، في نظام تشغيل يشبه UNIX ، يتم تحديد المسار من الدليل الجذر / ، على سبيل المثال ، "/var/share/www/test/index.php".

    /var/www/htmlweb/data/www/site/index.php

    _SERVER $ [" اسم الخادم"]

    يحتوي عنصر $ _SERVER ["SERVER_NAME"] على اسم الخادم ، كقاعدة عامة ، نفس اسم المجال الخاص بالموقع الموجود عليه. على سبيل المثال،

    غالبًا ما يكون محتوى عنصر $ _SERVER ["SERVER_NAME"] هو نفسه محتوى عنصر $ _SERVER ["HTTP_HOST"]. بالإضافة إلى اسم الخادم ، تتيح لك المصفوفة superglobal $ _SERVER معرفة عدد من معلمات الخادم ، على سبيل المثال ، عنوان IP الخاص بالخادم ومنفذ الاستماع وخادم الويب المثبت وإصدار بروتوكول HTTP. يتم وضع هذه المعلومات في العناصر $ _SERVER ["SERVER_ADDR"] و $ _SERVER ["SERVER_PORT"] و $ _SERVER ["SERVER_SOFTWARE"] و $ _SERVER ["SERVER_PROTOCOL"] ، على التوالي. فيما يلي مثال على استخدام هذه العناصر.

    استخدام عناصر المصفوفة $ _SERVER

    صدى "اسم الخادم". $ _ SERVER ["SERVER_NAME"]. "
    "؛ صدى" Server IP is ". $ _ SERVER [" SERVER_ADDR "]."
    "؛ صدى" منفذ الخادم ". $ _ SERVER [" SERVER_PORT "]."
    "؛ صدى" خادم الويب - ". $ _ SERVER [" SERVER_SOFTWARE "]."
    "؛ صدى" إصدار بروتوكول HTTP - ". $ _ SERVER [" SERVER_PROTOCOL "]."
    ";

    اسم الخادم - الموقع
    عنوان IP للخادم - 185.12.92.137
    منفذ الخادم - 80
    خادم الويب - Apache / 2.4.25 (Debian) mpm-itk / 2.4.7-04 OpenSSL / 1.0.2l
    إصدار بروتوكول HTTP - HTTP / 1.0

    _SERVER $ [" REQUEST_METHOD"]

    يحتوي عنصر $ _SERVER ["REQUEST_METHOD"] على طريقة الطلب المستخدمة لاستدعاء البرنامج النصي: GET أو POST.

    صدى $ _SERVER ["REQUEST_METHOD"] ؛

    _SERVER $ [" QUERY_STRING"]

    يحتوي عنصر $ _SERVER ["QUERY_STRING"] على المعلمات التي تم تمريرها إلى البرنامج النصي إذا كانت سلسلة الاستعلام عبارة عن عنوان

    على سبيل المثال ، عند الإشارة إلى:
    سيحتوي عنصر $ _SERVER ["QUERY_STRING"] على كل النص بعد علامة "؟":

    صدى $ _SERVER ["QUERY_STRING"] ؛

    id = 1 & test = wet & id_theme = 512

    _SERVER $ [" PHP_SELF"]

    يحتوي عنصر $ _SERVER ["PHP_SELF"] على اسم البرنامج النصي ، بدءًا من الدليل الجذر للمضيف الظاهري ، أي إذا كانت سلسلة الاستعلام عنوانًا http://www.mysite.ru/test/index.php؟id=1&test=wet&id_theme=512 ثم سيحتوي عنصر $ _SERVER ["PHP_SELF"] على مقتطف "/test/index.php"... عادةً ما يتم وضع نفس الجزء في عنصر $ _SERVER ["SCRIPT_NAME"].

    _SERVER $ [" REQUEST_URI"]

    يحتوي العنصر $ _SERVER ["REQUEST_URI"] على اسم البرنامج النصي ، بدءًا من الدليل الجذر للمضيف الظاهري والمعلمات ، أي إذا كانت سلسلة الاستعلام عنوانًا: http://www.mysite.ru/test/index.php؟id=1&test=wet&id_theme=512 ثم سيحتوي عنصر $ _SERVER ["REQUEST_URI"] على مقتطف "/test/index.php؟id=1&test=wet&id_theme=512"... من أجل استعادة العنوان الكامل في البرنامج النصي ، والذي تم وضعه في سطر الاستعلام ، يكفي استخدام مجموعة عناصر مصفوفة $ _SERVER ، المعروضة أدناه

    العنوان الكامل للنص

    صدى "http: //". $ _ SERVER ["SERVER_NAME"]. $ _ SERVER ["REQUEST_URI"] ؛
    • ترجمة
    • الدورة التعليمية

    واحدة من أروع الميزات الجديدة في php 5.4 هو الخادم المدمج المصمم خصيصًا للتطوير والاختبار. يمكنك الآن كتابة التعليمات البرمجية واختبارها دون الحاجة إلى امتلاك خادم ويب كامل - ما عليك سوى بدء تشغيل الخادم المضمن واختبار الكود وإغلاقه عند الانتهاء.
    يوفر الخادم أيضًا فرصة للاستخدام الإبداعي. على سبيل المثال ، يمكنك توزيع تطبيق ويب محمول على قرص مضغوط أو USB ، أو حتى كتطبيق سطح مكتب مدمج في PHP دون استخدام GTK أو مكتبات رسومات أخرى.

    يؤكد دليل PHP أن الخادم المدمج مخصص للتطوير ويوصى بعدم استخدامه على خادم إنتاج. لا توجد توجيهات INI مسؤولة عن الخادم (باستثناء تلوين الإخراج في وحدة التحكم) ، ويبدو أن الفكرة الرئيسية للتوثيق هي: "لدينا الآن أيضًا خادم ويب ، اتركنا وشأننا".
    بغض النظر ، أعتقد أن الخادم المضمن يمكن أن يكون أداة تطوير واختبار قيمة. على سبيل المثال ، على جهازي ، أستخدم Apache مثبتًا مسبقًا بتكوين مخصص يناسبني ، لكن في بعض الأحيان أرغب في تجربة بعض تطبيقات الويب الجديدة. باستخدام خادم الويب المضمن ، يمكنني اختبار التطبيق مباشرة من مجلد التنزيلات أو مجلد temp ونقله إلى بيئتي العادية عند الحاجة فقط.
    لكن بالنسبة للمبتدئين ، ليس الأمر بهذه السهولة ، حيث أن العديد من التطبيقات المكتوبة تستخدم htaccess و mod_rewrite. لكنني متأكد من أن شخصًا ما (ربما أحدكم ، لماذا لا؟) سيكتب محولًا لهذا ، وأود أن أكون أول من يختبره.
    في هذه المقالة ، سأشرح بعض الأمثلة الأساسية لاستخدام الخادم المضمن وسأوضح لك كيفية جعله مفيدًا للتطوير والاختبار.

    نستخدم الخادم المدمج

    لذلك ، لاستخدام الخادم ، نحتاج إلى php 5.4 أو أعلى. للتحقق من إصدار PHP الخاص بك ، قم بتشغيل:
    php -v
    يمكنك أيضًا تحديد ما إذا كان الخادم متاحًا في التجميع الخاص بك عن طريق تشغيل:
    php -h
    وابحث هناك عن وصف للخيارات "-S" و "-t" ، والتي تستخدم فقط للخادم.
    للتحقق من الخادم ، يمكنك إنشاء ملف index.php في الدليل الحالي ، والذي سيحتوي على استدعاء لوظيفة phpinfo () ثم بدء تشغيل الخادم:
    $ php -S 127.0.0.1:8080 PHP 5.4.0RC7 Development Server بدأ في الجمعة 26 فبراير 18:49:29 2012 الاستماع 127.0.0.1:8080 جذر المستند هو / home / ec2-user اضغط على Ctrl-C للإنهاء.
    والآن يمكنك مشاهدة المحتوى الذي يقدمه خادم الويب المضمن:

    سيتم كتابة كل طلب عميل إلى وحدة التحكم:
    80.180.55.37:36318 : / 80.180.55.37:36584 : /
    بالعودة ، دعنا نلقي نظرة على معلمة سطر الأوامر "-S" ، والتي تُستخدم لتحديد العنوان الذي يمكن الوصول إلى الخادم منه. القيم الممكنة:
    مضيف محلي- يمكن الوصول إلى الخادم فقط من الجهاز المحلي ،
    0.0.0.0 - على أي واجهة للجهاز ،
    أي IP خارجي أو رمادي- فقط على IP المحدد
    يعيّن الخيار "-t" الدليل المحدد "جذر الدليل". على سبيل المثال:
    $ php -S : 8090 -t / home / ec2-user / public
    بجانب،. يمكنك تحديد اسم ملف موجه معين. على سبيل المثال:
    $ php -S> localhost أو عنوان IP العام الخاص بك>: 8080 -t / home / ec2-user / public public / index.php
    سيتم تحليل إخراج هذا الموجه وتنفيذه بواسطة الخادم. مثال بسيط:
    مرحبًا بك في PHP

    ";
    إذا قام البرنامج النصي بإرجاع FALSE ، فسيتم معالجة URI المطلوب بواسطة الخادم ، والذي سيصدر المورد المطلوب ، أو سيعيد الخطأ 404. إذا أعاد البرنامج النصي أي شيء آخر ، فسيتم تمرير إخراج البرنامج النصي إلى العميل.
    بينما يمنحنا هذا الأسلوب مزيدًا من التحكم ، هناك بعض الأشياء التي يجب أن تعرفها. أولاً ، يرسل خادم PHP مجموعة صغيرة فقط من رؤوس HTTP:
    الاتصال: مغلق نوع المحتوى: text / html المضيف: aws-dev-01.vtardia.com X-Powered-By: PHP / 5.4.0RC7 D
    قارن هذا بالعناوين التي يعرضها خادم Apache:
    قبول-نطاقات: بايت الاتصال: Keep-Alive Content-Length: 631 Content-Type: text / html التاريخ: السبت ، 04 فبراير 2012 18:24:42 GMT Etag: "bbb99-277-4ace8c5470a40" Keep-Alive: timeout = 15، max = 100 Last-Modified: الأربعاء ، 14 سبتمبر 2011 15:54:09 GMT Server: Apache / 2.2.21 (Unix) DAV / 2
    إذا كان التطبيق الخاص بك يستخدم الرؤوس ، فيجب أن يأخذ في الاعتبار الاختلاف في بيئات التطوير والإنتاج.
    ثانيًا ، يحتوي الخادم المضمن على SAPI مختلف (Server API). وبالتالي ، من خلال إجراء التوجيه في index ، php ، يمكنك تحديد استدعاء للبرنامج النصي على خادم الاختبار أو الإنتاج. سيعود php_sapi_name () "cli-server" على الخادم المضمن:
    هناك توجيه خاص واحد من INI يسمى "cli_server.color". يقوم هذا التوجيه بإرجاع الإخراج الملون إلى وحدة التحكم. قم بإنشاء ملف فارغ باسم cli-server.iniوأدخل هذا السطر:
    cli_server.color = تشغيل
    يمكنك إنشاء تكوين بيئة فريد للخادم الخاص بك عن طريق تحديد التوجيهات الضرورية في ملف INI الخاص بك. التوجيهات غير المعلنة ستقبل قيمها الافتراضية. الآن أعلنا عن توجيه واحد فقط - cli_server.color.
    ابدأ الخادم باستخدام المعلمة "-c" التي تحدد ملف INI:
    $ php -S localhost -c cli-server.ini
    إذا كان جهازك الطرفي يدعم الألوان ، فيجب أن تكون قادرًا على رؤية الإخراج "الملون" في وحدة التحكم. سيتم تمييز 200 حالة باللون الأخضر ، و 404 باللون البرتقالي ، وسيتم تمييز أخطاء البرنامج النصي باللون الأحمر.

    نقوم بإنشاء خادم شخصي

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

    يحتوي مجلد المكتبة على كود التطبيق ، العام هو الدليل الجذر ، ويحتوي على index.php وبعض الملفات الثابتة. سيركز هذا البرنامج التعليمي على مجلد "الخادم" ، لذلك سيتألف تطبيقنا من عبارة بسيطة "Hello Word!" وعدد قليل من الصور و css.
    هدفنا هو أن نكون قادرين على بدء تشغيل الخادم من دليل التطبيق بأمر واحد ، وسيهتم خادمنا بالتوجيه ورؤوس HTTP والأخطاء.
    $ ./start.sh
    دعنا نلقي نظرة على البرنامج النصي لبدء التشغيل:
    #! / bin / bash INIFILE = "$ (pwd) /server/server.ini" DOCROOT = "$ (pwd) / public" ROUTER = "$ (pwd) /server/router.php" HOST = 0.0.0.0 PORT = 8080 PHP = $ (أي php) إذا [$؟ ! = 0] ؛ ثم صدى "تعذر العثور على PHP" خروج 1 fi $ PHP -S $ HOST: $ PORT -c $ INIFILE -t $ DOCROOT $ ROUTER
    أفترض أن البرنامج النصي يتم تشغيله من دليل التطبيق ، لذلك يتم تعريف INIFILE و DOCROOT و ROUTER باستخدام pwd. يتم تحديد المسار إلى php باستخدام الأمر الذي. إذا لم يتم العثور على php في $ PATH للمستخدم ، فسيفشل البرنامج النصي مع حدوث خطأ.
    يعمل هذا بشكل جيد بما فيه الكفاية ، ولكن لنمنح المستخدم القدرة على تغيير أي من المعلمات المحددة من سطر الأوامر ، على سبيل المثال:
    لو [! -z $ INIFILE] ؛ ثم INIFILE = "$ (pwd) /server/server.ini" fi
    استمرارًا ، يحتوي مجلد "الأخطاء" على ملفات لرسائل خطأ HTTP. فيما يلي مثال عن خطأ 403: على الرغم من أنني استخدمت HTML فقط ، فسيتم تضمين البرنامج النصي ، وأنا أستخدمه يشملحتى تتمكن من استخدام أي كود php:
    403

    403 ممنوع

    عذرا ، المورد المطلوب لا يمكن الوصول إليه.



    الآن دعنا نلقي نظرة على router.php. تتمثل مهمة هذا الملف في تلقي وإدارة جميع الطلبات ونقلها إلى الخادم فقط في حالة وجود هذا الملف. يتم عرض كافة صفحات الخطأ من خلال توصيل القالب.
    في الأسطر الأولى ، أحدد بعض المعلمات العامة مثل DIRECTORY_INDEX ، الدليل مع قوالب الخطأ. يجب أن تتطابق المعلمة date_default_timezone_set () مع إعدادات نظام التشغيل ، وإلا سيكون هناك تناقضات بين الإدخالات في السجل وعلى الخادم. أضفت أيضًا قائمة بعناوين IP المسموح بها لتحسين الأمان.
    تعد الوظيفة logAccess () ضرورية لأنه عندما يقبل البرنامج النصي للتوجيه طلبًا ، يتم تجاهل سجل الخادم افتراضيًا. لا تقبل الوظيفة إلا رمز الحالة ، ويتوافق تنسيق الإخراج تمامًا مع تنسيق الخادم.
    مهمتنا الأولى هي التحقق من الأمن. إذا لم يكن عنوان IP الخاص بالعميل في مجموعة عناوين IP المسموح بها ، اعرض رسالة خطأ واخرج من البرنامج النصي. نحتاج إلى إعطاء رمز حالة بخلاف 200 ولن تعمل وظيفة header () هنا ، لذلك نستخدم وظيفة جديدة - http_response_code.
    إذا كان عنوان IP الخاص بالعميل موجودًا في مجموعة عناوين IP المسموح بها ، فإن خطوتنا التالية هي الحصول على المسار المطلوب وامتداد الملف. إذا كان الامتداد فارغًا ، فإننا نفترض أن المستخدم يطلب مجلدًا ويقوم ببناء المسار باستخدام DIRECTORY_INDEX المحدد أولاً.
    أخيرًا ، إذا كان الملف المطلوب موجودًا ، فقم بإرجاع FALSE ودع الخادم يصل إلى الملف. إذا لم يكن كذلك ، فسيتم عرض رسالة خطأ 404.

    ملخص

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

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

    وهذا ما استخدمه العميل بالفعل باعتباره "المضيف المستهدف" للطلب. تم تعريف SERVER_NAME في تكوين الخادم. أي واحد يعتمد على ما تحتاجه من أجله. يجب أن تفهم الآن أن هذه قيمة يتحكم فيها العميل ، وبالتالي لا يمكن الاعتماد عليها للاستخدام في منطق الأعمال ، والأخرى هي قيمة يتحكم فيها الخادم وتكون أكثر موثوقية. ومع ذلك ، تحتاج إلى التأكد من أن خادم الويب لديه التكوين الصحيح لـ SERVER_NAME. بأخذ Apache HTTPD كمثال ، إليك مقتطف من وثائقه:

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

    ينعش: بعد التحقق من إجابة Pekka على سؤالك الذي يحتوي على رابط لإجابة bobince أن PHP ستعيد دائمًا قيمة HTTP_HOST لـ SERVER_NAME ، والتي تتعارض مع تجربة PHP 4.x + Apache HTTPD 1.2.x منذ عامين ، قمت بنفض الغبار عن XAMPP الحالي الخاص بي على نظام التشغيل Windows XP (Apache HTTPD 2.2.1 مع PHP 5.2.8) ، وقمت بتشغيله ، وأنشأت صفحة PHP تطبع كلا القيمتين ، وأنشأت تطبيق اختبار Java باستخدام URLConnection لتغيير رأس المضيف ، وعلمتني الاختبارات أن هذا هو الحال بالفعل (خاطئ).

    بعد الشك أولاً في PHP والبحث في بعض الإبلاغ عن أخطاء PHPفيما يتعلق بالموضوع ، اكتشفت أن جذر المشكلة موجود على خادم الويب قيد الاستخدام ، وأنه لم يُرجع رأس HTTP Host بشكل صحيح عندما تم طلب SERVER_NAME. لذلك أنا حفرت في الإبلاغ عن خطأ Apache HTTPDاستخدام كلمات رئيسية مختلفةفيما يتعلق بالموضوع ، ووجدت أخيرًا خطأ ذي صلة. تم تقديم هذا السلوك منذ ذلك الحين حول Apache HTTPD 1.3. تحتاج إلى تعيين توجيه UseCanonicalName في الإدخال ServerName في httpd.conf (راجع أيضًا التحذير أسفل المستند!).

    ServerName example.com UseCanonicalName تشغيل

    هذا عمل معي.

    معمم ، SERVER_NAME أكثر موثوقية ، لكنك متكلفي تكوين الخادم!

    HTTP_HOST هو المضيف الهدف الذي أرسله العميل. المستخدم حر في التلاعب بالمستخدم. ليست هناك حاجة لإرسال طلب إلى موقعك مع طلب HTTP_HOST لقيمة www.stackoverflow.com.

    يأتي SERVER_NAME من تعريف خادم VirtualHost وبالتالي يعتبر أكثر موثوقية. يمكن أيضًا التلاعب بها خارجيًا في ظل ظروف معينة تتعلق بإعداد خادم الويب الخاص بك. انظر الى هذا هذا السؤال SOالذي يتعامل مع جوانب السلامة لكلا الخيارين.

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

    لاحظ أنه إذا كنت تريد استخدام IPv6 ، فمن المحتمل أنك تريد استخدام HTTP_HOST وليس SERVER_NAME. إذا أدخلت http: // [:: 1] / ، فستكون متغيرات البيئة كما يلي:

    HTTP_HOST = [:: 1] SERVER_NAME = :: 1

    هذا يعني أنه إذا قمت بعمل mod_rewrite ، على سبيل المثال ، فقد تحصل على نتيجة سيئة. مثال على إعادة توجيه SSL:

    # SERVER_NAME لن يعمل - إعادة التوجيه إلى https: // :: 1 / RewriteRule. * Https: //٪ (SERVER_NAME) / # HTTP_HOST سيعمل - إعادة التوجيه إلى https: // [:: 1] / RewriteRule. * Https: //٪ (HTTP_HOST) /

    ينطبق هذا فقط إذا كنت تقوم بالوصول إلى الخادم بدون اسم مضيف.

    إذا كنت تريد التحقق من خلال server.php أو ما تريد الاتصال به بما يلي:

    ثم قم بالوصول إلى جميع عناوين url الصالحة لموقعك وتحقق من الفرق.

    لقد استغرق الأمر بعض الوقت لمعرفة ما يقصده الناس بعبارة "SERVER_NAME أكثر موثوقية". أنا أستخدم خادمًا مشتركًا ولا يمكنني الوصول إلى توجيهات المضيف الظاهري. لذلك ، أنا أستخدم mod_rewrite في .htaccess لتعيين HTTP_HOSTs مختلفة في أدلة مختلفة. في هذه الحالة ، تكون قيمة HTTP_HOST هذه منطقية.

    يكون الوضع مشابهًا إذا كنت تستخدم مضيفات افتراضية تعتمد على الاسم: يوضح توجيه ServerName داخل مضيف ظاهري ببساطة اسم المضيف الذي سيتم تعيينه لهذا المضيف الظاهري. خلاصة القول هي أنه في كلتا الحالتين ، يجب أن يتطابق اسم المضيف الذي قدمه العميل أثناء الطلب (HTTP_HOST) مع الاسم الموجود على الخادم ، والذي يقوم بدوره بتعيين الدليل. سواء تم إجراء التعيين باستخدام توجيهات مضيف ظاهري أو باستخدام قواعد htaccess mod_rewrite ، فهو ثانوي هنا. في هذه الحالات ، سيكون HTTP_HOST هو نفسه SERVER_NAME. أنا سعيد لأنه تم تكوين Apache بهذه الطريقة.

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

    لذا من الآن فصاعدًا سأستخدم SERVER_NAME في حالة دفع الكود الخاص بي إلى هذه التكوينات الخاصة.

    بافتراض أن لديك إعدادًا بسيطًا (CentOS 7 و Apache 2.4.x و PHP 5.6.20) وموقع ويب واحد فقط (بدون استضافة مشتركة) ...

    بمعنى PHP ، $ _SERVER ["SERVER_NAME"] هو عنصر PHP مسجل في فئة $ _SERVER الفائقة بناءً على تكوين Apache (توجيه ** ServerName ** مع UseCanonicalName On) في httpd.conf (سواء من تكوين مضيف افتراضي ممكّن ملف ، أيا كان ، وما إلى ذلك). HTTP_HOSTيتم استنتاجه من رأس مضيف HTTP. تعامل معها مثل مدخلات المستخدم. قم بالتصفية والتحقق قبل الاستخدام.

    في ما يلي مثال أستخدم فيه $ _SERVER ["SERVER_NAME"] كأساس للمقارنة. الطريقة التالية هي لفئة فرعية معينة ، والتي أطلقت عليها اسم ServerValidator (أحد عناصر Validator). يتحقق ServerValidator من ستة أو سبعة عناصر في $ _SERVER قبل استخدامها.

    عند تحديد ما إذا كان طلب HTTP هو POST ، أستخدم هذه الطريقة.

    الوظيفة العامة isPOST () (إرجاع (($ this-> requestMethod === "POST") && // Ignore $ this-> hasTokenTimeLeft () && // Ignore $ this-> hasSameGETandPOSTIdentities () && // Ingore ($ this -> httpHost === filter_input (INPUT_SERVER، "SERVER_NAME"))) ؛)

    بحلول الوقت الذي يتم فيه استدعاء هذه الطريقة ، سيتم إجراء جميع عمليات التصفية والتحقق من صحة عناصر $ _SERVER المقابلة (ومجموعات الخصائص المقابلة لها).

    ($ this-> httpHost === filter_input (INPUT_SERVER، "SERVER_NAME")

    للتحقق من أن قيمة $ _SERVER ["HTTP_HOST"] (المشتقة في النهاية من رأس مضيف HTTP المطلوب) تطابق $ _SERVER ["SERVER_NAME"].

    أنا الآن أستخدم محادثة superglobal لشرح المثال الخاص بي ، ولكن هذا لأن بعض الأشخاص ليسوا على دراية بـ INPUT_GET و INPUT_POST و INPUT_SERVER فيما يتعلق بـ filter_input_array ().

    خلاصة القول هي أنني لا أعالج طلبات POST على الخادم الخاص بي ما لم يتم استيفاء جميع الشروط الأربعة. ومن ثم ، فيما يتعلق بطلبات POST ، فإن رفض تقديم رأس مضيف HTTP (تم التحقق من التواجد في وقت سابق) يؤدي إلى عذاب متصفحات صارمة HTTP 1.0... بالإضافة إلى ذلك ، يجب أن يتطابق المضيف المطلوب مع القيمة اسم الخادمفي httpd.conf ، وبالتبعية - قيمة $ _SERVER ("SERVER_NAME") في $ _SERVER supermacle. مرة أخرى ، كنت سأستخدم INPUT_SERVER مع وظائف مرشح PHP ، لكنك كنت تكسر الانجراف.

    كما هو موضح في balusC ، فإن SERVER_NAME ليست موثوقة ويمكن تغييرها في تكوين apache وتكوين الخادم وجدار الحماية الذي قد يكون بينك وبين الخادم.

    تقوم الوظيفة التالية دائمًا بإرجاع المضيف الحقيقي (المضيف الذي كتبه المستخدم) بدون منفذ ، وهي موثوقة تقريبًا:

    الوظيفة getRealHost () (list ($ realHost،) = explode (":"، $ _ SERVER ["HTTP_HOST"])؛ return $ realHost؛)

    للمشاركه

    بادئ ذي بدء ، سنقوم بتحسين صفحة التسجيل بإضافة القدرة على تحميل صورة رمزية. يجب أن تكون الصورة الأصلية بتنسيق jpg أو gif أو png. أيضًا ، يجب ألا يزيد حجمه عن 2 ميغابايت. لا تقلق ، بعد ضغطها بنص ، سيكون حجم الصورة الرمزية حوالي 3 كيلو بايت وبتنسيق jpg. افتح الصفحة ريج.بي أتش بيوإضافة في العلامة < شكل> خط enctype = "multipart / form-data"كما في المثال:


    التسجيل










    الآن نحن نحفظ reg.php

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


    نضع جميع القيم كما في الصورة:

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

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

    // إزالة المسافات الزائدة
    $ login = trim ($ login) ؛

    // إضافة واحدة جديدة *******************************************

    // إضافة تحقق لطول تسجيل الدخول وكلمة المرور
    إذا (strlen ($ تسجيل الدخول)< 3 or strlen($login) > 15) {
    خروج ("يجب أن يتكون تسجيل الدخول من 3 أحرف على الأقل ولا يزيد عن 15.") ؛
    }
    إذا (strlen ($ password)< 3 or strlen($password) > 15) {
    خروج ("يجب أن تتكون كلمة المرور من 3 أحرف على الأقل ولا تزيد عن 15.") ؛
    }

    if (! blank ($ _ POST ["fupload"])) // تحقق مما إذا كان المستخدم قد نشر صورة
    {
    $ fupload = $ _ POST ["fupload"] ؛ $ fupload = تقليم ($ fupload) ؛
    إذا ($ fupload == "" أو فارغ ($ fupload)) (
    unset ($ fupload)؛ // إذا كان المتغير $ fupload فارغًا ، فاحذفه
    }
    }
    إذا (! isset ($ fupload) أو فارغ ($ fupload) أو $ fupload == "")
    {
    // إذا كان المتغير غير موجود (لم يرسل المستخدم الصورة) ، فقم بتعيين صورة معدة مسبقًا مع نقش "no avatar"
    $ avatar = "avatars / net-avatara.jpg" ؛ // يمكنك رسم net-avatara.jpg أو أخذ المصدر
    }
    آخر
    {
    // خلاف ذلك - قم بتحميل صورة المستخدم
    $ path_to_90_directory = "avatars /" ؛ // المجلد الذي سيتم فيه تحميل الصورة الأولية ونسختها المضغوطة

    If (preg_match ("/ [.] (JPG) | (jpg) | (gif) | (GIF) | (png) | (PNG) $ /"، $ _ FILES ["fupload"] ["name"]) ) // تحقق من تنسيق الصورة الأصلية
    {
    $ filename = $ _FILES ["fupload"] ["name"]؛
    $ source = $ _FILES ["fupload"] ["tmp_name"] ؛
    الهدف $ = $ path_to_90_directory. اسم الملف $؛
    move_uploaded_file ($ source، $ target)؛ // تحميل الملف الأصلي إلى المجلد $ path_to_90_directory
    if (preg_match ("/ [.] (GIF) | (gif) $ /"، $ filename)) (
    $ im = imagecreatefromgif ($ path_to_90_directory. $ filename)؛ // إذا كان الأصل بتنسيق gif ، فقم بإنشاء صورة بنفس التنسيق. مطلوب للضغط اللاحق
    }
    if (preg_match ("/ [.] (PNG) | (png) $ /"، $ filename)) (
    $ im = imagecreatefrompng ($ path_to_90_directory. $ filename)؛ // إذا كان الأصل بتنسيق png ، فقم بإنشاء صورة بنفس التنسيق. مطلوب للضغط اللاحق
    }

    If (preg_match ("/ [.] (JPG) | (jpg) | (jpeg) | (JPEG) $ /"، $ filename)) (
    $ im = imagecreatefromjpeg ($ path_to_90_directory. $ filename)؛ // إذا كان الأصل بتنسيق jpg ، فقم بإنشاء صورة بنفس التنسيق. مطلوب للضغط اللاحق
    }
    // إنشاء صورة مربعة وضغطها التالي المأخوذ من الموقع www.codenet.ru
    // أنشئ مربعًا بحجم 90 × 90
    // dest - الصورة الناتجة
    // w - عرض الصورة
    // نسبة - نسبة العرض إلى الارتفاع
    ث = 90 ؛ // مربع 90 × 90. يمكن توفير أحجام أخرى.
    // إنشاء الصورة الأصلية بناءً على
    // ملف المصدر وتحديد حجمه
    $ w_src = imagesx ($ im) ؛ // احسب العرض
    $ h_src = الصور ($ im) ؛ // احسب ارتفاع الصورة
    // إنشاء صورة مربعة فارغة
    // إنه truecolor! هذا مهم! ، وإلا فسنحصل على نتيجة 8 بت
    $ dest = imagecreatetruecolor ($ w، $ w)؛
    // قص المركز المربع عند x إذا كانت الصورة أفقية
    إذا (w_src> $ h_src)
    imagecopyresampled ($ dest ، $ im ، 0 ، 0 ،
    round ((max ($ w_src، $ h_src) -min ($ w_src، $ h_src)) / 2) ،
    0، $ w، $ w، min ($ w_src، $ h_src)، min ($ w_src، $ h_src))؛
    // قطع المربع العلوي في y ،
    // إذا كانت الصورة عمودية (على الرغم من أن الوسط ممكن أيضًا)
    إذا كان ($ w_src<$h_src)
    imagecopyresampled ($ dest ، $ im ، 0 ، 0 ، 0 ، 0 ، $ w ، $ w ،
    min ($ w_src، $ h_src)، min ($ w_src، $ h_src)) ؛
    // تم تحجيم الصورة المربعة بدون قصاصات
    إذا ($ w_src == $ h_src)
    imagecopyresampled ($ dest، $ im، 0، 0، 0، 0، $ w، $ w، $ w_src، $ w_src)؛
    التاريخ بالدولار = الوقت () ؛ // احسب الوقت في الوقت الراهن.
    imagejpeg ($ dest، $ path_to_90_directory. $ date. ". jpg")؛ // احفظ صورة jpg في المجلد المطلوب ، سيكون الاسم هو الوقت الحالي. صنعت بحيث لا تحمل الصور الرمزية نفس الاسم.
    // لماذا jpg؟ يشغل مساحة صغيرة جدًا + يتم إتلاف الرسوم المتحركة لصورة gif ، التي تشتت انتباه المستخدم. ليس من اللطيف قراءة تعليقه عندما تلاحظ بعض الحركة خارج زاوية عينك.
    $ avatar = $ path_to_90_directory. $ date. ". jpg" ؛ // أدخل مسار الصورة الرمزية في المتغير.
    delfull $ = path_to_90_directory $. اسم ملف $؛
    unink ($ delfull)؛ // احذف الصورة الأصلية التي تم تحميلها ، لم نعد بحاجة إليها. كانت المهمة هي الحصول على منمنمة.
    }
    آخر
    {
    // في حالة عدم تطابق التنسيق ، قم بإصدار رسالة مناسبة
    خروج ("يجب أن تكون الصورة الرمزية بالتنسيق JPG أو GIF أو PNG");
    }
    // نهاية عملية التحميل وتخصيص متغير $ avatar لعنوان الصورة الرمزية المحملة
    }



    // أضاف واحدًا جديدًا *********************************************
    // ثم يتبع كل شيء من الجزء الأول من المقالة ، لكنك تحتاج إلى إضافة التغيير إلى الاستعلام إلى قاعدة البيانات.
    // الاتصال بقاعدة البيانات
    // تحقق من وجود مستخدم له نفس تسجيل الدخول
    $ result = mysql_query ("SELECT ID من المستخدمين حيث تسجيل الدخول =" $ login ""، $ db)؛
    إذا (! فارغ ($ myrow ["id"])) (
    خروج ("عذرًا ، اسم المستخدم الذي أدخلته مسجل بالفعل. الرجاء إدخال اسم مستخدم آخر.") ؛
    }
    // إذا لم يكن كذلك ، فاحفظ البيانات
    $ result2 = mysql_query ("INSERT INTO users (تسجيل الدخول ، كلمة المرور ، الصورة الرمزية)) VALUES (" $ login "،" $ password "،" $ avatar ")") ؛
    // تحقق من وجود أي أخطاء
    إذا ($ result2 == "TRUE")
    {
    صدى "لقد قمت بالتسجيل بنجاح! يمكنك الآن زيارة الموقع. الصفحة الرئيسية" ؛
    }
    آخر (
    صدى "خطأ! أنت غير مسجل." ؛
    }
    ?>

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


    IP - عنوان IP.
    التاريخ - تاريخ تسجيل الدخول غير الناجح لآخر 15 دقيقة للمستخدم باستخدام عنوان IP المحدد. col - عدد الأخطاء خلال آخر 15 دقيقة للمستخدم باستخدام عنوان IP المحدد.
    بخير! تم ، الآن لنغير ملف التحقق من تسجيل الدخول وكلمة المرور ، لأن كلمة المرور الخاصة بنا الآن مشفرة. افتح testreg.php واحذف كل شيء بخلاف إزالة المسافات من تسجيل الدخول وكلمة المرور. بعد ذلك ، أضف الكود التالي:

    // إزالة المسافات الزائدة
    $ login = trim ($ login) ؛
    $ password = trim ($ password) ؛

    // استبدل بـ ******************************************* جديد
    // الاتصال بقاعدة البيانات
    include ("bd.php") ؛ يجب أن يكون الملف // bd.php في نفس المجلد مثل أي شخص آخر ، إذا لم يكن كذلك ، فقم فقط بتغيير المسار
    // تحقق من تخمين كلمة المرور
    $ ip = getenv ("HTTP_X_FORWARDED_FOR") ؛
    إذا (فارغ ($ ip) || $ ip == "غير معروف") ($ ip = getenv ("REMOTE_ADDR") ؛) // استرداد ip
    mysql_query ("DELETE FROM oshibka WHERE UNIX_TIMESTAMP () - UNIX_TIMESTAMP (date)> 900")؛ // احذف عناوين IP للمستخدمين الذين قاموا بتسجيل الدخول بالخطأ بعد 15 دقيقة.
    $ result = mysql_query ("SELECT col FROM oshibka WHERE ip =" $ ip ""، $ db)؛ // استرجع من قاعدة البيانات عدد محاولات تسجيل الدخول غير الناجحة لآخر 15 للمستخدم باستخدام عنوان IP المحدد
    $ myrow = mysql_fetch_array (بالدولار نتيجة) ؛
    إذا ($ myrow ["col"]> 2) (
    // إذا كان هناك أكثر من خطأين ، أي ثلاثة ، فقم بإصدار رسالة.
    خروج ("لقد كتبت تسجيل الدخول أو كلمة المرور بشكل غير صحيح 3 مرات. انتظر 15 دقيقة قبل المحاولة التالية.") ؛
    }
    $ password = md5 ($ password) ؛ // تشفير كلمة المرور
    $ password = strrev ($ password) ؛ // أضف العكس للأمان
    كلمة مرور دولار = كلمة مرور دولار. "b3p6f" ؛
    // يمكنك إضافة العديد من الشخصيات حسب رغبتك ، على سبيل المثال ، بكتابة "b3p6f". إذا تم اختراق كلمة المرور هذه بطريقة القوة الغاشمة على الخادم الخاص بهم بنفس md5 ، فمن الواضح أنه لن يأتي أي شيء جيد منها. لكن أنصحك بوضع شخصيات أخرى ، تستطيع في بداية السطر أو في المنتصف.
    // في هذه الحالة ، من الضروري زيادة طول حقل كلمة المرور في قاعدة البيانات. يمكن أن تكون كلمة المرور المشفرة أكبر من ذلك بكثير.

    $ result = mysql_query ("حدد * من المستخدمين حيث تسجيل الدخول =" تسجيل الدخول بالدولار "وكلمة المرور =" $ password ""، $ db)؛ // يسترجع من قاعدة البيانات جميع البيانات المتعلقة بالمستخدم باستخدام اسم المستخدم وكلمة المرور اللذين تم إدخالهما
    $ myrow = mysql_fetch_array (بالدولار نتيجة) ؛
    إذا (فارغ ($ myrow ["id"]))
    {
    // إذا كان المستخدم الذي أدخل اسم المستخدم وكلمة المرور غير موجود
    // قم بتدوين ملاحظة أن عنوان IP المحدد لا يمكنه الدخول.
    $ select = mysql_query ("SELECT ip FROM oshibka حيث ip =" $ ip "")؛
    $ tmp = mysql_fetch_row ($ select) ؛
    if ($ ip == $ tmp) (// تحقق مما إذا كان المستخدم موجودًا في جدول "oshibka"
    $ result52 = mysql_query ("حدد العمود من oshibka حيث ip =" $ ip ""، $ db)؛
    $ myrow52 = mysql_fetch_array ($ result52) ؛
    $ col = $ myrow52 + 1؛ // أضف محاولة تسجيل دخول فاشلة أخرى
    mysql_query ("UPDATE oshibka SET col = $ col، date = NOW () حيث ip =" $ ip "")؛
    }
    آخر (
    mysql_query ("INSERT INTO oshibka (ip، date، col) VALUES (" $ ip "، NOW ()،" 1 ")")؛
    // إذا لم تكن هناك أخطاء في آخر 15 دقيقة ، فقم بإدراج رقم قياسي جديد في جدول "oshibka"
    }

    خروج ("عذرًا ، اسم المستخدم أو كلمة المرور التي أدخلتها غير صحيحة.") ؛
    }
    آخر (
    نبسب ؛ // إذا كانت كلمات المرور متطابقة ، فسنبدأ جلسة للمستخدم! يمكنك تهنئته ، دخل!
    $ _SESSION ["password"] = $ myrow ["password"]؛
    $ _SESSION ["login"] = $ myrow ["تسجيل الدخول"]؛
    $ _SESSION ["id"] = $ myrow ["id"]؛ // غالبًا ما يتم استخدام هذه البيانات ، لذا فإن المستخدم الذي قام بتسجيل الدخول "سيحمل معه"

    // بعد ذلك ، نتذكر البيانات الموجودة في ملفات تعريف الارتباط لتسجيل الدخول لاحقًا.
    //الانتباه!!! افعل ذلك في نقاشك ، حيث يتم تخزين البيانات في ملفات تعريف الارتباط دون تشفير
    إذا ($ _POST ["save"] == 1) (
    // إذا أراد المستخدم حفظ بياناته لتسجيل الدخول التالي ، فسنحفظها في ملفات تعريف الارتباط في متصفحه
    setcookie ("تسجيل الدخول" ، $ _POST ["تسجيل الدخول"] ، الوقت () + 9999999) ؛
    setcookie ("password" ، $ _POST ["password"] ، الوقت () + 9999999) ؛
    }}
    صدى صوت " "؛ // إعادة توجيه المستخدم إلى الصفحة الرئيسية ، حيث سيتم إعلامه بتسجيل الدخول بنجاح
    ?>

    5. تغيير الصفحة الرئيسية بالكامل. من الضروري عرض الصورة الرمزية للمستخدم عليها ، وعرض ارتباط لتسجيل الخروج من الحساب وإضافة مربع اختيار لتذكر كلمة المرور عند تسجيل الدخول.
    Index.php

    // الإجراء بأكمله يعمل على الجلسات. يتم فيه تخزين بيانات المستخدم أثناء وجوده على الموقع. من المهم جدًا تشغيلها في بداية الصفحة !!!
    جلسة_ستارت () ،
    include ("bd.php") ؛ يجب أن يكون الملف // bd.php في نفس المجلد مثل أي شخص آخر ، إذا لم يكن كذلك ، فقم فقط بتغيير المسار
    إذا (! فارغ ($ _ SESSION ["تسجيل الدخول"]) و! فارغ ($ _ SESSION ["كلمة المرور"]))
    {
    // إذا كان هناك تسجيل دخول وكلمة مرور في الجلسات ، فإننا نتحقق منها ونسترجع الصورة الرمزية
    $ تسجيل الدخول = $ _SESSION ["تسجيل الدخول"] ؛
    $ password = $ _SESSION ["password"] ؛
    $ result = mysql_query ("SELECT id، avatar from users where login =" $ login "AND password =" $ password ""، $ db)؛
    $ myrow = mysql_fetch_array (بالدولار نتيجة) ؛
    // استرداد بيانات المستخدم المطلوبة
    }
    ?>


    الصفحة الرئيسية


    الصفحة الرئيسية

    if (! isset ($ myrow ["avatar"]) أو $ myrow ["avatar"] == "") (
    // تحقق مما إذا كانت بيانات المستخدم قد تم استردادها من قاعدة البيانات. إذا لم يكن كذلك ، فهو لم يدخل ، أو كلمة السر في الجلسة غير صحيحة. نعرض نافذة تسجيل الدخول. لكننا لن نعرضه لمن دخلوا ، فلم يعودوا بحاجة إليه.
    مطبعة<<


    هنا؛

    إذا كان (isset ($ _ COOKIE ["login"])) // هل هناك متغير مع تسجيل الدخول في COOKIE. يجب أن يكون ذلك إذا نقر المستخدم عند تسجيل الدخول السابق على مربع الاختيار "تذكرني"
    {
    // إذا كانت الإجابة بنعم ، فأدخل قيمتها في النموذج. في هذه الحالة ، يظهر للمستخدم أنه قد تم إدخال معلومات تسجيل الدخول الخاصة به بالفعل في العمود المطلوب
    صدى "القيمة =" ". $ _ COOKIE [" تسجيل الدخول "]." ">"؛
    }

    مطبعة<<




    هنا؛

    إذا (isset ($ _ COOKIE ["password"])) // هل هناك متغير بكلمة مرور في ملف COOKIE. يجب أن يكون ذلك إذا نقر المستخدم عند تسجيل الدخول السابق على مربع الاختيار "تذكرني"
    {
    // إذا كانت الإجابة بنعم ، فأدخل قيمتها في النموذج. في هذه الحالة ، يظهر للمستخدم أنه قد تم إدخال كلمة المرور الخاصة به بالفعل في العمود المطلوب
    صدى "القيمة =" ". $ _ COOKIE [" كلمة المرور "]." ">"؛
    }

    مطبعة<<



    تذكرنى.






    سجل الان



    قمت بتسجيل الدخول كضيف

    هنا؛
    }
    آخر
    {
    // عند تسجيل الدخول بنجاح ، يتم إعطاء المستخدم كل شيء أدناه بين العلامات النجمية.

    مطبعة<<
    لقد قمت بتسجيل الدخول إلى الموقع باسم $ _SESSION (تسجيل الخروج)


    هذا الرابط متاح فقط للمستخدمين المسجلين

    شخصيتك الإفتراضية:




    هنا؛

    //************************************************************************************
    // عند تسجيل الدخول بنجاح ، يتم إعطاء المستخدم كل شيء أعلاه بين العلامات النجمية.
    }
    ?>



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

    جلسة_ستارت () ،
    إذا (فارغ ($ _ SESSION ["تسجيل الدخول"]) أو فارغ ($ _ SESSION ["كلمة المرور"]))
    {
    // إذا لم تكن هناك جلسة باستخدام اسم المستخدم وكلمة المرور ، فحينئذٍ وصل مستخدم غير مؤمن إلى هذا الملف. إنه لا ينتمي إلى هنا. نصدر رسالة خطأ ، أوقف البرنامج النصي
    خروج ("الوصول إلى هذه الصفحة مسموح به فقط للمستخدمين المسجلين. إذا كنت مسجلاً ، فادخل إلى الموقع باستخدام اسم المستخدم وكلمة المرور الخاصين بك
    الصفحة الرئيسية ")؛
    }

    unset ($ _ SESSION ["password"]) ؛
    unset ($ _ SESSION ["تسجيل الدخول"]) ؛
    unset ($ _ SESSION ["id"]) ؛ // تدمير المتغيرات في الجلسات
    خروج (" ");
    // أرسل المستخدم إلى الصفحة الرئيسية.
    ?>

    هذا كل شيء! استخدمه لصحتك! حظا طيبا وفقك الله!