هجمات حقن PHP وSQL [2]
اقتباسات سحرية
كما ذكرنا أعلاه، يقوم حقن SQL بشكل أساسي بإرسال بيانات غير آمنة إلى قاعدة البيانات لتحقيق غرض الهجوم. من أجل منع هجمات حقن SQL، تأتي PHP مع وظيفة يمكنها معالجة سلسلة الإدخال وإجراء معالجة أمنية أولية على الإدخال في المستوى الأدنى، أي Magic Quotes. (php.ini magic_quotes_gpc). إذا Magic_quotes_gpc
إذا تم تمكين الخيار، فسيتم تلقائيًا أن تُسبق علامات الاقتباس المفردة وعلامات الاقتباس المزدوجة والأحرف الأخرى في سلسلة الإدخال بشرطة مائلة عكسية .
لكن Magic Quotes ليس حلاً عالميًا للغاية، فهو لا يمنع جميع الشخصيات التي يحتمل أن تكون خطرة، ولا يتم تمكين Magic Quotes على العديد من الخوادم. لذلك، نحتاج أيضًا إلى استخدام طرق أخرى مختلفة لمنع حقن SQL.
توفر العديد من قواعد البيانات وظيفة معالجة بيانات الإدخال هذه محليًا. على سبيل المثال، تحتوي وظيفة تشغيل MySQL الخاصة بـ PHP على وظيفة تسمى mysql_real_escape_string()، والتي يمكنها الهروب من الأحرف الخاصة والأحرف التي قد تسبب أخطاء في تشغيل قاعدة البيانات.
الرجوع إلى:
http://cn2.php.net/mysql_real_escape_string
إذا كنت مهتمًا، يمكنك قراءة التعليقات أدناه :)
انظر إلى هذا الرمز:
// إذا تم تمكين وظيفة Magic Quotes
إذا (get_magic_quotes_gpc()) {
$name = stripslashes($name);
}آخر{
$name = mysql_real_escape_string($name);
}
mysql_query("SELECT * FROM users WHERE name='{$name}'");
لاحظ أنه قبل أن نستخدم الوظائف التي توفرها قاعدة البيانات، يجب علينا تحديد ما إذا كانت Magic Quotes قيد التشغيل، تمامًا كما في المثال أعلاه، وإلا سيتم تكرار المعالجة مرتين. إذا تم تمكين MQ، فسنحتاج إلى إزالة المضاف للحصول على البيانات الحقيقية.
بالإضافة إلى المعالجة المسبقة لبيانات نموذج السلسلة المذكورة أعلاه، عند تخزين البيانات الثنائية في قاعدة البيانات، يجب عليك أيضًا الانتباه إلى المعالجة المسبقة. وإلا، فقد تتعارض البيانات مع تنسيق تخزين قاعدة البيانات نفسها، مما يتسبب في تعطل قاعدة البيانات، أو فقدان سجلات البيانات، أو حتى فقدان قاعدة البيانات بأكملها. توفر بعض قواعد البيانات، مثل PostgreSQL، وظيفة pg_escape_bytea() تُستخدم خصيصًا لتشفير البيانات الثنائية، والتي يمكنها تشفير البيانات المشابهة لـ Base64.
يحب:
// لاستخدام بيانات النص العادي:
pg_escape_string($regular_strings);
// لاستخدام البيانات الثنائية:
pg_escape_bytea($binary_data);
وفي حالة أخرى، نحتاج أيضًا إلى استخدام مثل هذه الآلية. أي اللغات متعددة البايت مثل الصينية واليابانية وغيرها والتي لا يدعمها نظام قاعدة البيانات نفسه. يحتوي بعضها على نطاقات ASCII تتداخل مع نطاقات البيانات الثنائية.
ومع ذلك، قد يؤدي ترميز البيانات إلى فشل استعلامات مثل LIKE abc%.