فصل سی و ششم :
INJECTION در SQLite
هنگامی که مقادیر ورودی را از وب سایت خود گرفته برای ذخیره انها را به دیتابیس میفرستیم همواره امکان دارد از طریق مقادیر وردی کاربر بتواند دستورات مخربی را وارد دیتابیس ما بکند و در واقع خود را در معرض ریسک امنیتی بزرگی قرار داده ایم.در این درس به به مواردی می پردازیم که امنیت دیتابیس و نرم افزار ما را بالا میبرند.
Injection معمولا هنگامی رخ میدهد که شما از کاربر مقادیری همانند نام و نام خانوادگی وی را می خواهید ولی او بجای نام خود دستورات اس کیو ال را در فیلد مورد نظر در سایت و یا نرم افزار وارد میکند. و این دستورات بوسیله دیتابیس اجرا میشوند و نتایج مخربی را بوجود می اورند. بنابراین هیچگاه به ورودی های کاربر اعتماد نکنید و قبل از درج در دیتابیس حتما انها را مورد بررسی و ارزیابی قرار دهید . بعنوان مثال در کد ذیل ما هنگامی که می خواهیم کابر نام کاربری مورد نظر خود را وارد کند آنرا محدود میکینیم که فقط از کاکاکتر های الفبا و کاراکتر "_" استفاده کند و طول نام کاربری بایستی بین 8 تا 20 کاراکتر باشد.
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)){
$db = new SQLiteDatabase('filename');
$result = @$db->query("SELECT * FROM users WHERE username=$matches[0]");
}else{
echo "username not accepted";
}
برای اینکه مساله را بوضوح بررسی کنیم فرض کنید کاربر در فیلد نام کاربری در وب سایت ما کد ذیل را وارد کرده است
$name = "Qadir'; DELETE FROM users;";
@$db->query("SELECT * FROM users WHERE username='{$name}'");
تابع ما باید لیست تمامی کاربرانی را بیاورد که username آنها بابر با ورودی کاربر است ولیکن کاربر عبارت DELETE را بعد از نام کاربر قرارداده بنابراین با اجرای دستو بالا فاجعه ایی رخ خواهد داد و تمامی کاربران مادر دیتابیس حذف خواهند شد.
بنابراین قبل از اینکه ورودی کاربر را مستقیم به دیتابیس بفرستیم حتما بررسی میکینم که شامل دستورات مخرب نباشد.
مثلا در php ما تابعی به نام sqlite_escape_string() داریم که کاراکتر هاهی غیر مجازو مخرب را از رشه ورودی خود میگیرد و یک رشته امن را را درج در دیتابیس میسازد.
مفاهیم و موضوعات این فصل عبارتند از :