الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

إعداد النصوص قبل إرسالها إلى Mysql

بدأه asm-soft في 29 أغسطس 2008 · 1 رد · 799 مشاهدة · في منتدى تطوير المواقع بـ PHP
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاتة

يوجد مشكلة فى إرسال أى نص إلى MySQL يحتوى على " و ' و \ و NULL فيجب وضع \ قبل كل حرف منهم قبل إرسال النص إلى MySQL

فأنظر ماذا سيحدثة هذا المتغيير

$text = "Slashes 'Example";

لو أرسلناه إلى MySQL عند تكوين سطر SQL

mysql_query("insert into t1 (f1) values ('$text')");

بالتأكيد سينتج هذا SQL

insert into t1 (f1) values ('Slashes 'Example')

و هنا تكمن المشكلة فى وجود الرمز ' فى النصف و بسببة سوف لم يتم تنفيذ سطر SQL

و لحل هذة المشكلة يجب وضع \ قبل الرموز التى قمت بذكرها فى الأعلى بواسطة الدالة addslashes هكذا

mysql_query("insert into t1 (f1) values ('" . addslashes($text) . "')");

و فى هذة الحالة يتنج هذا السطر

insert into t1 (f1) values ('Slashes \'Example')

و بهذة الطريقة سيتم حل المشكلة بوضع \ قبل الرمز ' و لكن ماذا نفعل لو أننا نستخدم متغييرات كثيرة ناتجة من Form فبالتأكيد هذا سيعتبر متعب جداً فالحل هو كتابة حلقة تكرارية تقوم بوضع \ تلقائياً لكل المتغيرات للمصفوفة GET و POST و COOKIE هكذا

if( is_array($_GET) )
	{
		while( list($k, $v) = each($_GET) )
		{
			if( is_array($_GET[$k]) )
			{
				while( list($k2, $v2) = each($_GET[$k]) )
				{
					$_GET[$k][$k2] = addslashes($v2);
				}
				@reset($_GET[$k]);
			}
			else
			{
				$_GET[$k] = addslashes($v);
			}
		}
		@reset($_GET);
	}

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

و طبعاً تطبق هذة الحلقة مع POST و COOKIE و يتم و ضع هذة الحلقات فى بداية الصفحات بواسطة إدراجها فى ملف مستقل ثم إدراج الملف فى بداية كل الصفحات.

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

و طبعاً ستحتوى كل المتغيرات على \ زائده فإذا كنت تريد طباعه ما بداخل المتغيير فقم بإستدعاء الدالة stripslashes لإزالة \ الزائدة هكذا

echo(stripslashes ($POST['name']));

بالتوفيق للجميع

forum-signature-01.gif
#2

شكرا اخي asm-soft على الموضوع .

هناك داله mysql_real_escape_string التي تستخدم للغرض ذاته , وهو عمل escaping للبيانات قبل ارسالها لتنفيذ الاستعلام , وهذا كله يقي من هجمات الـ SQL Injection .

مثال على الداله mysql_real_escape_string :

$product_name= $_POST['product_name'];
$product_description = $_POST['product_description'];

// Make a safe query
 $query = sprintf("INSERT INTO products (`name`, `description`, `user_id`) VALUES ('%s', '%s', %d)",
			   mysql_real_escape_string($product_name, $link),
			   mysql_real_escape_string($product_description, $link),
			   $_POST['user_id']);

تم تعديل هذه المشاركة بواسطة محمد معاشر في 29 أغسطس 2008 في 23:51

لا إله الإ الله وحده لا شريك له الملك وله الحمد يحي ويميت وهو على كل شئ قدير

------------------------------------------------------------------------------------------------

gazabigBanner.jpg

------------------------------------------------------------------------------------------------

مواضيع مشابهة