ثغرات أمان PHP: قرصنة الجلسة والبرمجة عبر المواقع وحقن SQL وكيفية إصلاحها

الأمان في PHP

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

أنواع نقاط الضعف

هذه هي نقاط الضعف الشائعة التي ستواجهها عند كتابة كود PHP. سنناقش القليل بمزيد من التفصيل أدناه.

  • تزوير طلب الموقع المتقاطع ثغرة أمنية في التطبيق ناتجة عن عدم قيام المبرمج بفحص المكان الذي تم إرسال الطلب منه - يتم إرسال هذا الهجوم إلى مستخدم ذي امتياز عالي للحصول على وصول أعلى مستوى إلى التطبيق.
  • Cross Site Scripting ثغرة في التطبيق ناتجة عن عدم قيام المبرمج بتعقيم المدخلات قبل إخراج الإدخال إلى المتصفح (على سبيل المثال ، تعليق على مدونة). يتم استخدامه بشكل شائع لتشغيل جافا سكريبت ضار في المستعرض للقيام بهجمات مثل سرقة ملفات تعريف الارتباط للجلسة من بين إجراءات ضارة أخرى للحصول على امتيازات مستوى أعلى في التطبيق.
  • تضمين الملف المحلي ثغرة أمنية في التطبيق سببها المبرمج الذي يتطلب إدخال ملف مقدم من المستخدم وعدم تعقيم الإدخال قبل الوصول إلى الملف المطلوب. ينتج عن هذا ملف يتم تضمينه حيث لا ينبغي أن يكون.
  • تضمين الملفات عن بُعد ثغرة أمنية في التطبيق ناتجة عن مطالبة المبرمج بإدخال ملف يوفره المستخدم وعدم تعقيم الإدخال قبل الوصول إلى الملف المطلوب. ينتج عن هذا ملف يتم سحبه من خادم بعيد وإدراجه حيث لا ينبغي أن يكون.
  • سرقة الجلسة ثغرة أمنية ناتجة عن وصول المهاجم إلى معرف جلسة المستخدم والقدرة على استخدام حساب مستخدم آخر ينتحل صفته. غالبًا ما يستخدم هذا للوصول إلى حساب مستخدم إداري.
  • اكتساب معرف الجلسة اكتساب معرف الجلسة هو ثغرة أمنية ناتجة عن قدرة المهاجم على تخمين معرف جلسة المستخدم أو استغلال الثغرات الأمنية في التطبيق نفسه أو في متصفح المستخدم للحصول على معرف الجلسة.
  • حقن SQL ثغرة في التطبيق ناتجة عن عدم قيام المبرمج بتعقيم الإدخال قبل تضمينه في استعلام في قاعدة البيانات. هذا يؤدي إلى أن يكون المهاجم قد قرأ بشكل كامل وفي كثير من الأحيان لا يكتب الوصول إلى قاعدة البيانات. مع هذا النوع من الوصول ، يمكن للمهاجم القيام بأشياء سيئة للغاية.

الآن دعونا نلقي نظرة على بعض نقاط الضعف الشائعة بمزيد من التفصيل.

اختطاف الجلسة

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

الدفاع ضد هجمات اختطاف الجلسة في PHP

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

 ($_SESSION['lastaccess'] + 3600)) { session_unset(); session_destroy(); } else { $_SESSION['lastaccess'] = time(); }

عبر موقع البرمجة

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

مثال هجوم البرمجة عبر الموقع

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

 alert('Cross Site Scripting!'); 

الدفاع عن موقع الويب الخاص بك من هجمات البرمجة النصية عبر المواقع في PHP

في PHP هناك نوعان من المهام الرئيسية، htmlspecialchars()و strip_tags()التي بنيت في حماية نفسك من الهجمات عبر موقع البرمجة.

و htmlspecialchars($string)سوف ظيفة منع سلسلة HTML من تقديم ك HTML وعرضها كنص عادي إلى متصفح الويب. مثال على كود htmlspecialchars ()


    

The other approach is the strip_tags($string, $allowedtags) function which removes all HTML tags except for the HTML tags that you’ve whitelisted. It’s important to note that with the strip_tags() function you have to be more careful, this function does not prevent the user from including javascript as a link, you’ll have to sanitize that on our own.

strip_tags() code example


     

"; echo strip_tags($usercomment, $allowedtags);

إعداد رأس حماية X-XSS:

في PHP ، يمكنك إرسال العنوان X-XSS-Protectionالذي سيخبر المتصفحات بالتحقق من هجوم Scripting المنعكس عبر الموقع ومنع الصفحة من التحميل. هذا لا يمنع جميع هجمات البرمجة النصية عبر المواقع فقط تلك المنعكسة ويجب استخدامه مع طرق أخرى.


    

Writing your own sanitization function Another option, if you would like more control over how the sanitization works, is to write your own HTML Sanitization function, this is not recommended for PHP Beginners as a mistake would make your website vulnerable.

Defending your website from cross site scripting attacks with a Content Security Policy

An effective approach to preventing cross site scripting attacks, which may require a lot of adjustments to your web application’s design and code base, is to use a content security policy.

Set a Content Security Policy as an HTTP Header

The most common way of setting a Content Security Policy is by setting it directly in the HTTP Header. This can be done by the web server by editing it’s configuration or by sending it through PHP.

Example of a Content Security Policy set in a HTTP Header


     

Set a Content Security Policy as a Meta tags

You can include your Content Security Policy in the page’s HTML and set on a page by page basis. This method requires you to set on every page or you lose the benefit of the policy.

Example of a Content Security Policy set in a HTML Meta Tag


      SQL Injection

SQL injection is a vulnerability in the application caused by the programmer not sanitizing input before including it into a query into the database. This leads to the attacker having full read and more often than not write access to the database. With this type of access an attacker can do very bad things.

Example SQL Injection attack

The below PHP Script runs an SQL Statement to get a user’s email by ID. However the input is not sanitized making it vulnerable to SQL Injection

connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "SELECT email FROM users WHERE idemail"]; } } else { echo "no results"; } $conn->close();
SELECT email FROM users WHERE id = `$input`;

So with the above the input is not type casted (I.e. casting the input with (int) so only a number is allowed) nor escaped allowing someone to perform an SQL Injection attack - for example the URL getemailbyuserid.php?id=1'; My Query Here-- - would allow you to run arbitrary SQL queries with little effort.

Defending your website from sql injection attacks in PHP

There are a few approaches to defend your website from SQL Injection Attacks. These approaches are Whitelisting, Type Casting, and Character Escaping

Whitelisting: The whitelisting approach is used in cases where only a few inputs are expected. You can list each expected input in a PHP Switch and then have a default for invalid input. You do not have to worry about a type casting issue or a character escape bypass but the allowed input is extreamly limited. It remains an option, see the example below.


        

Type Casting: The type casting approach is commonly used for an application using numeric input. Simply cast the input with (int) $input and only a numeric value will be allowed.

Character Escaping: The character escaping approach will escape characters such as quotes and slashes provided by the user to prevent an attack. If you are using MySQL Server and the MySQLi library to access your database, the mysqli_real_escape_string($conn, $string) function will take two arguments, the MySQLi connection, and the string and will properly escape the user’s input to block an sql injection attack. The exact function you use depends on the database type and php library you are using check the php library’s documentation for more information on escaping user input.

More on PHP:

  • PHP best practices
  • Best PHP code examples
  • How to prevent a slow loris attack on a PHP server
  • How to set up a local debugging environment in PHP