امنیت در برنامهنویسی پایتون: محافظت در برابر SQL Injection و حملات وب
در دنیای توسعه وب، یک خط کد ناامن میتواند تمام اپلیکیشن، پایگاه داده و اطلاعات کاربران شما را در معرض خطر قرار دهد. پایتون یک زبان قدرتمند و نسبتاً امن است، اما امنیت هرگز به صورت خودکار اتفاق نمیافتد؛ این امنیت حاصل رعایت اصول و شیوههای صحیح کدنویسی توسط توسعهدهنده است. غفلت از این اصول میتواند درهای پشتی را برای مهاجمان باز بگذارد. دو مورد از رایجترین و مخربترین حملات وب که هر توسعهدهنده پایتون باید با آنها آشنا باشد، تزریق SQL (SQL Injection) و اسکریپتنویسی بین سایتی (Cross-Site Scripting – XSS) هستند. این مقاله یک راهنمای کاربردی برای درک این تهدیدها و مهمتر از آن، یادگیری روشهای استاندارد برای دفاع در برابر آنها در پایتون است.
[!] تهدید شماره یک: تزریق SQL (SQL Injection)
این حمله زمانی رخ میدهد که یک مهاجم بتواند کدهای SQL مخرب خود را از طریق ورودیهای کاربر (مانند فرم لاگین یا نوار جستجو) به پایگاه داده شما «تزریق» کند.
کد آسیبپذیر چگونه است؟
بدترین روش برای نوشتن کوئریهای SQL، استفاده مستقیم از فرمتدهی رشته (f-string یا `+`) برای چسباندن ورودی کاربر به کوئری است:
# کد بسیار خطرناک – هرگز استفاده نکنید
username = input(“Enter username: “)
query = f”SELECT * FROM users WHERE name = ‘{username}’”
cursor.execute(query)
اگر کاربر به جای نام کاربری خود، عبارت ' OR '1'='1
را وارد کند، کوئری نهایی به SELECT * FROM users WHERE name = '' OR '1'='1'
تبدیل میشود که همیشه درست است و تمام اطلاعات کاربران را برمیگرداند!
[+] راه حل طلایی: کوئریهای پارامتری (Parameterized Queries)
تنها راه صحیح و امن برای ارسال داده به پایگاه داده، استفاده از کوئریهای پارامتری است. در این روش، شما هرگز ورودی کاربر را مستقیماً در رشته کوئری قرار نمیدهید. بلکه کوئری را با یک «جانگهدار» (placeholder) مانند `?` یا `%s` نوشته و دادهها را به عنوان یک پارامتر جداگانه به تابع `execute` ارسال میکنید. درایور پایگاه داده خود وظیفه ضدعفونی کردن ورودی را بر عهده میگیرد.
# روش امن و صحیح
username = input(“Enter username: “)
query = “SELECT * FROM users WHERE name = %s”
cursor.execute(query, (username,))
[!] تهدید خاموش: اسکریپتنویسی بین سایتی (XSS)
این حمله زمانی رخ میدهد که یک مهاجم بتواند کدهای سمت کاربر (معمولاً جاوااسکریپت) را در وبسایت شما تزریق کند و این کدها در مرورگر کاربران دیگر اجرا شوند. تصور کنید در بخش نظرات یک وبلاگ، مهاجم به جای یک نظر معمولی، یک تگ `