سؤال

عند تنفيذ استعلام SQL، يجب عليك تنظيف سلاسلك وإلا يمكن للمستخدمين تنفيذ SQL ضار على موقع الويب الخاص بك.

عادةً ما يكون لدي وظيفة escape_string(blah)، وهي:

  • يستبدل الهروب (\) مع هروب مزدوج (\\).
  • يستبدل علامات الاقتباس المفردة (') مع اقتباس مفرد هروب (\').

هل هذا كاف؟هل هناك ثغرة في الكود الخاص بي؟هل هناك مكتبة يمكنها القيام بذلك بسرعة وبشكل موثوق بالنسبة لي؟

أود أن أرى حلولاً رائعة في لغة Perl وJava وPHP.

هل كانت مفيدة؟

المحلول

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

https://stackoverflow.com/questions/1973/what-is-the-best-way-to-avoid-sql-injection-attacks

نصائح أخرى

أود أيضًا الهروب من التعليقات (شرطة مزدوجة)

--

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

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

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

على سبيل المثال، PHP لديه mysql_real_escape_string و addlashes.

من الأفضل استخدام البيانات المعدة مع العناصر النائبة.هل تستخدم PHP أو .NET... وفي كلتا الحالتين، ستوفر البيانات المعدة مزيدًا من الأمان، ولكن يمكنني تقديم عينة.

في PHP، أستخدم هذا وسأقدر كل تعليق حوله:

function quote_smart($valeur) 
{ 
    if (get_magic_quotes_gpc()) 
        $valeur = stripslashes($valeur); 

    if (!is_numeric($valeur)) 
        $valeur = mysql_real_escape_string($valeur); 

    return $valeur; 
}


$IdS = quote_smart($_POST['theID']); 
$sql = " 
SELECT * FROM Students 
WHERE IdStudent={$IdS}; 
";

يحتاج إلى تحقق إضافي إذا كان من الممكن أن يكون الحقل NULL :

$picture = NULL;
$theidyouwant = 7;
$Name = 'WOOD';


if(is_null($picture)) 
    $p = 'NULL'; 
else
    $p = "'".quote_smart($picture)."'"; 

$IdS = quote_smart($theidyouwant);

$requete = "SELECT * FROM Students
    WHERE IdStudent={$IdS} AND
    PictureStudent={$p} AND
    NameStudent='{$Name}';
    ";

هذا كل شيء استمتع!(آمل أن يرسل المنشور الشرطة السفلية بشكل صحيح وليس _)

استخدم الاستعلامات المعدة/المعلمة!

استخدام البيانات المعدة.

في استعلام MySQL، عند استخدام LIKE، تأكد أيضًا من الهروب من الأحرف "_" حيث لم يتم تجاوزها بواسطة mysql_real_escape_string.

للرجوع إليها، تحقق هنا

تمتلك MySQL C API خصائصها الخاصة mysql_escape_string().سيكون من الأفضل استخدامه أو ما يعادله.

لست متأكدًا مما إذا كان MySql يدعم الاستعلامات ذات المعلمات، إذا كان الأمر كذلك، فيجب عليك بذل جهد للسير في هذا الطريق.سيضمن هذا أن مدخلات المستخدمين لا يمكنها فعل أي شيء ضار.

وإلا فإن بعض الأحرف "السيئة" بالإضافة إلى ما ذكرته ستكون فاصلة منقوطة (؛) وتعليقات (-- و /* */).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top