تكرار السؤال: …
الإجابة المختصرة
FromSqlInterpolated آمن تلقائياً لأنه يحول متغيرات السلسلة النصية إلى معلمات SqlParameter مجهزة، بينما FromSqlRaw يعامل السلسلة كنص خام ويعرضك للحقن إذا دمجت متغيرات.
الشرح
يقوم FromSqlInterpolated باستغلال نوع FormattableString في C#؛ فعندما تكتب $"WHERE Name = {input}"، لا يقوم بدمج النص بل يستخرج المعامل ويستبدله بـ @p0 ويرسل القيمة كمعامل منفصل محمي تماماً. في المقابل، إذا استخدمت FromSqlRaw ودمجت النصوص بـ +، سيتم حقن الأوامر التخريبية مباشرة في محرك قاعدة البيانات.
مثال بالكود
// آمن تماماً ضد SQL Injection (يولد SqlParameter تلقائياً)
var users = await db.Users
.FromSqlInterpolated($"SELECT * FROM Users WHERE City = {city}")
.ToListAsync();أخطاء شائعة
- استخدام FromSqlRaw مع string concatenation بحجة أن القيمة تم فحصها مسبقاً.