نکته: دیتابیس اوراکل قابلیت PREPARE STATEMENT رو ساپورت میکنه
هرگاه بخواهیم در دستور SELECT خود، از کاربر ورودی دریافت نماییم، از & استفاده میکنیم. برای این مثال، از جدول PERSON استفاده خواهیمکرد.
دستور زیر تمام رکوردهای جدول PERSON را به شرطی که فیلد NAME آن مساوی با ورودی کاربر باشد لیست میکند. دقت داشته باشید، بعد از اجرای کوئری پایگاهداده از شما مقدار ورودی را خواهد پرسید، به دستور زیر توجه کنید:
در پرسوجوی فوق از کاربر ورودی گرفته میشود، سپس جستجو در جدول PERSON آغاز میگردد و در انتها خروجی را به کاربر نمایش میدهد:
SELECT * FROM T5 WHERE AGE = &PLEASE_ENTER_YOUR_AGE;
ENTER VALUE FOR PLEASE_ENTER_YOUR_AGE: 10
AGE NAME
---- ------------
10 HOSSEIN
حالا میخوام INJECT کنم، میبینید که INJECT را قبول میکنه!!
SELECT * FROM T5 WHERE AGE = &PLEASE_ENTER_YOUR_AGE;
ENTER VALUE FOR PLEASE_ENTER_YOUR_AGE: 10 OR 1=1
AGE NAME
---- ----------
50 HAMID
20 AKBAR
10 HOSSEIN
30 HOSSEIN
15 AKBAR
در حقیقت عمل prepare statement هم همینه یعنی پارامترها جدا میره سمت دیتابیس و دستور sql جدا میره سمت دیتابیس
نکته: من از قصد علامت & رو گذاشتم تا SQL INJECT رو قبول کنه ولی در فصلهای آینده به این موضوع میرسیم که چجوری جلوی INJECT را در PREPARE STATEMENT بگیریم و دیگه دستور SQL رو به عنوان ورودی نگیره(پشت & یه علامت دیگه میذاریم):