با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن ، و کاربرانی که دوره آموزش MySQL را دنبال می کنند. در بسیاری از برنامه ها و وب سایت ها یک صفحه ی ورودی یا Login برای اعتبار سنجی و ورود اعضاء ایجاد می شود، در اینگونه صفحات اطلاعاتی از کاربر دریافت شده و در سمت سرور با داده هایی در دیتابیس مقایسه می شود تا اعتبار سنجی انجام شود، در اینگونه موارد احتمال حملات SQL Injection یا تزریق به دیتابیس توسط هکرها وجود دارد. که در این صورت تمام داده های ذخیره شده در دیتابیس فاش خواهد شد، احتمال SQL Injection در MySQL نیز که یک سیستم مدیریت داده ی SQL می باشد نیز وجود دارد. در ادامه ی این مبحث به چگونگی جلوگیری از حملات تزریق به دیتابیس در MySQL پرداخته ایم.
در این آموزش با کدنویسی استاندارد برای جلوگیری از تزریق به دیتابیس در MySQL آشنا خواهید شد.
تزریق به دیتابیس در MySQL معمولا زمان دریافت ورودی از کاربران رخ می دهد.
برای جلوگیری از SQL Injection در MySQL باید از یک الگوی تطبیق اعتبار سنجی کنید.
در مثال زیر ورودی دریافتی از کاربران به حروف الفبا، کاراکتر زیر خط دار و طول ورودی بین ۸ تا ۲۰ کاراکتر محدود می شود:
1 2 3 4 5 | if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)) { $result = mysql_query("SELECT * FROM users WHERE username = $matches[0]"); } else { echo "username not accepted"; } |
برای نشان دادن مشکل ، کد زیر را در نظر بگیرید :
1 2 3 | // supposed input $name = "Qadir'; DELETE FROM users;"; mysql_query("SELECT * FROM users WHERE name = '{$name}'"); |
در کد فوق ورودی $name دریافتی از کاربر می تواند شامل تمام حروف الفبا و فضاهای خالی نیز باشد.
در اینجا ما ورودی $name که ورودی کاربر است را یک دستور DELETE نوشته ایم، که تمام داده های کاربران را حذف می کند!
البته در هنگام استفاده از MySQL تابع mysql_query() اجازه نمی دهد که چنین Query هایی اجرا شوند.
با این وجود در سایر دیتابیس هایی که در PHP از جمله SQLite و PostgreSQL چنین حملاتی می تواند انجام شود.
شما می توانید تمام کاراکتر های فرار را به صورت هوشمندانه در زبان های برنامه نویسی مانند PERL و PHP اداره کنید.
MySQL در زبان PHP تابع ()mysql_real_escape_string را برای جلوگیری از حملات Injection ارائه می دهد:
1 2 3 4 5 6 | if (get_magic_quotes_gpc()) { $name = stripslashes($name); } $name = mysql_real_escape_string($name); mysql_query("SELECT * FROM users WHERE name = '{$name}'"); |
با استفاده از دستور LIKE می توانید با یک مکانیزم الگوی خاص ورودی کاربر را به رشته تبدیل کنید.
با استفاده از تابع () addcslashes نیز می توانید دامنه ای محدود از کاراکترها را تعیین کنید:
1 2 3 | $sub = addcslashes(mysql_real_escape_string("%something_"), "%_"); // $sub == \%something\_ mysql_query("SELECT * FROM messages WHERE subject LIKE '{$sub}%'"); |
تزریق به دیتابیس در MySQL یکی از حملات بسیار جدی است که دیتابیس های زبان SQL را تهدید می کند،و داده ها را در اختیار هکرها قرار می دهد. برای جلوگیری از اینگونه حملات حتما باید از کدنویسی های خاصی در سمت سرور همانند آنچه در مباحث فوق اشاره شد استفاده کنید.