أمان تطبيقات C#: أهم 10 ثغرات للمبتدئين
\n\nتطوير تطبيقات آمنة بلغة C# ليس مجرد موضة، بل ضرورة. كل يوم يتم اكتشاف آلاف الثغرات في العالم، وقد يكون تطبيقك الهدف التالي. في هذه المقالة، سنستعرض 10 من أكثر الثغرات شيوعًا في تطبيقات C# (.NET) التي يواجهها المطورون المبتدئون. ستتعلم كيفية اكتشافها، والأهم من ذلك، كيفية حماية كودك.
\n\n1. حقن SQL (SQL Injection)
\n\nأقدم ثغرة وما زالت خطيرة حتى الآن. تنشأ عندما يتم إدخال إدخال المستخدم مباشرة في استعلام SQL.
\n\nالكود الضعيف:
\nstring userName = Request["username"];\nstring query = "SELECT * FROM Users WHERE Name = '" + userName + "'";\nSqlCommand cmd = new SqlCommand(query, connection);\n\nالحماية: استخدم الاستعلامات المُعلمة أو Entity Framework.
\nstring userName = Request["username"];\nstring query = "SELECT * FROM Users WHERE Name = @name";\nSqlCommand cmd = new SqlCommand(query, connection);\ncmd.Parameters.AddWithValue("@name", userName);\n\n2. البرمجة النصية عبر المواقع (XSS)
\n\nتسمح هجمات XSS للمهاجم بحقن سكريبت ضار في صفحة يتم عرضها لمستخدمين آخرين.
\n\nالكود الضعيف:
\nstring comment = Request["comment"];\nResponse.Write("<div>" + comment + "</div>");\n\nالحماية: قم دائمًا بترميز المخرجات. استخدم HttpUtility.HtmlEncode():
string comment = Request["comment"];\nResponse.Write("<div>" + HttpUtility.HtmlEncode(comment) + "</div>");\n\n3. غياب المصادقة والتفويض
\n\nينسى العديد من المبتدئين التحقق من صلاحيات الوصول إلى الموارد. على سبيل المثال، يمكن للمستخدم الوصول إلى ملف تعريف مستخدم آخر بمجرد تغيير المعرف في عنوان URL.
\n\nالكود الضعيف:
\npublic IActionResult Profile(int userId)\n{\n var user = _context.Users.Find(userId);\n return View(user);\n}\n\nالحماية: تحقق دائمًا من أن المستخدم الحالي لديه الحق في الوصول إلى المورد المطلوب:
\npublic IActionResult Profile(int userId)\n{\n var currentUserId = User.FindFirst(ClaimTypes.NameIdentifier).Value;\n if (userId != currentUserId) return Forbid();\n var user = _context.Users.Find(userId);\n return View(user);\n}\n\n4. تسرب البيانات الحساسة عبر الاستثناءات
\n\nغالبًا ما يعرض المطورون معلومات كاملة عن الأخطاء، بما في ذلك تتبع الاستدعاءات وسلاسل الاتصال.
\n\nالكود الضعيف:
\ntry\n{\n // code\n}\ncatch (Exception ex)\n{\n Response.Write(ex.ToString()); // خطير!\n}\n\nالحماية: في بيئة الإنتاج، استخدم رسائل خطأ عامة، وسجل التفاصيل في مكان آمن:
\ntry\n{\n // code\n}\ncatch (Exception ex)\n{\n _logger.LogError(ex, "خطأ أثناء معالجة الطلب");\n return StatusCode(500, "حدث خطأ داخلي في الخادم");\n}\n\n5. تخزين كلمات المرور غير الآمن
\n\nتخزين كلمات المرور بنص واضح أو باستخدام تجزئة ضعيفة (MD5، SHA1) هو خطأ فادح.
\n\nالكود الضعيف:
\nstring passwordHash = MD5.Hash(password); // لا يجوز!\n\nالحماية: استخدم خوارزميات تجزئة حديثة مع ملح، مثل BCrypt أو ASP.NET Core Identity:
var passwordHasher = new PasswordHasher<IdentityUser>();\nstring passwordHash = passwordHasher.HashPassword(user, password);\n\n6. الحماية غير الكافية من CSRF (تزوير الطلب عبر المواقع)
\n\nهجوم يجبر فيه المهاجم متصفح الضحية على تنفيذ إجراء غير مرغوب فيه على موقع آخر، حيث