مقدمه
امنیت یکی از مهمترین جنبههای توسعه نرمافزار است. علی سلمانیان در این مقاله، تهدیدات امنیتی رایج و راهکارهای محافظت از سایتها و اپلیکیشنهای موبایل را بررسی میکند. این راهنمای جامع امنیت به شما کمک میکند تا پروژههای خود را در برابر حملات محافظت کنید.
تهدیدات امنیتی رایج
1. OWASP Top 10
لیست 10 تهدید امنیتی برتر OWASP:
🔒 OWASP Top 10 2021:
- A01: Broken Access Control Critical
- A02: Cryptographic Failures Critical
- A03: Injection Critical
- A04: Insecure Design High
- A05: Security Misconfiguration High
- A06: Vulnerable Components High
- A07: Authentication Failures High
- A08: Software Integrity Failures Medium
- A09: Logging Failures Medium
- A10: Server-Side Request Forgery Medium
امنیت در برنامه نویسی وب
1. SQL Injection
یکی از خطرناکترین حملات:
⚠️ مثال خطرناک
کد زیر در برابر SQL Injection آسیبپذیر است:
// کد خطرناک - PHP
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$result = mysqli_query($connection, $sql);
✅ راهحل امن
استفاده از Prepared Statements:
// کد امن - PHP
$username = $_POST['username'];
$password = $_POST['password'];
$stmt = $connection->prepare("SELECT * FROM users WHERE username=? AND password=?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$result = $stmt->get_result();
2. XSS (Cross-Site Scripting)
محافظت در برابر XSS:
// Laravel - Escape کردن خروجی
// JavaScript - Sanitize کردن
function sanitizeInput(input) {
return input
.replace(/&/g, '&')
.replace(//g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
3. CSRF Protection
محافظت در برابر Cross-Site Request Forgery:
// Laravel - CSRF Token
<form method="POST" action="/submit">
<input type="text" name="data">
<button type="submit">ارسال</button>
</form>
// JavaScript - اضافه کردن CSRF Token
const token = document.querySelector('meta[name="csrf-token"]').getAttribute('content');
fetch('/api/data', {
method: 'POST',
headers: {
'X-CSRF-TOKEN': token,
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
});
امنیت در اپلیکیشنهای موبایل
1. Secure Storage
ذخیره امن دادههای حساس:
// Android - استفاده از Keystore
public class SecureStorage {
private static final String KEY_ALIAS = "MyKeyAlias";
public void storeSecret(String secret) {
try {
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
KeyGenerator keyGenerator = KeyGenerator.getInstance(
KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
KeyGenParameterSpec keyGenParameterSpec = new KeyGenParameterSpec.Builder(
KEY_ALIAS,
KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
.setBlockModes(KeyProperties.BLOCK_MODE_GCM)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
.build();
keyGenerator.init(keyGenParameterSpec);
keyGenerator.generateKey();
} catch (Exception e) {
e.printStackTrace();
}
}
}
2. Certificate Pinning
محافظت در برابر Man-in-the-Middle:
// Android - Certificate Pinning
public class CertificatePinning {
public static void setupPinning() {
String hostname = "api.example.com";
CertificatePinner certificatePinner = new CertificatePinner.Builder()
.add(hostname, "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")
.build();
OkHttpClient client = new OkHttpClient.Builder()
.certificatePinner(certificatePinner)
.build();
}
}
3. Biometric Authentication
احراز هویت بیومتریک:
// Android - Biometric Authentication
public class BiometricAuth {
private BiometricPrompt biometricPrompt;
public void setupBiometric() {
Executor executor = ContextCompat.getMainExecutor(context);
biometricPrompt = new BiometricPrompt(activity, executor,
new BiometricPrompt.AuthenticationCallback() {
@Override
public void onAuthenticationSucceeded(
@NonNull BiometricPrompt.AuthenticationResult result) {
// احراز هویت موفق
}
@Override
public void onAuthenticationError(int errorCode,
@NonNull CharSequence errString) {
// خطا در احراز هویت
}
});
}
}
رمزنگاری و Hash
1. Hash کردن پسوردها
استفاده از الگوریتمهای امن:
// PHP - Password Hashing
$password = 'user_password';
$hashedPassword = password_hash($password, PASSWORD_ARGON2ID);
// بررسی پسورد
if (password_verify($password, $hashedPassword)) {
// پسورد صحیح است
}
// Laravel - استفاده از Hash facade
$hashedPassword = Hash::make($password);
$isValid = Hash::check($password, $hashedPassword);
2. Encryption دادهها
رمزنگاری دادههای حساس:
// Laravel - Encryption
use Illuminate\Support\Facades\Crypt;
// رمزنگاری
$encrypted = Crypt::encryptString('sensitive_data');
// رمزگشایی
$decrypted = Crypt::decryptString($encrypted);
// Android - AES Encryption
public class AESUtil {
private static final String ALGORITHM = "AES";
private static final String TRANSFORMATION = "AES/GCM/NoPadding";
public static String encrypt(String data, String key) throws Exception {
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
byte[] encryptedData = cipher.doFinal(data.getBytes());
return Base64.encodeToString(encryptedData, Base64.DEFAULT);
}
}
HTTPS و SSL/TLS
1. تنظیم HTTPS
استفاده از گواهی SSL معتبر:
// Nginx Configuration
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /path/to/certificate.crt;
ssl_certificate_key /path/to/private.key;
# SSL Security Headers
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
}
2. HSTS (HTTP Strict Transport Security)
اجبار استفاده از HTTPS:
// Laravel - Security Headers
public function handle($request, Closure $next)
{
$response = $next($request);
$response->headers->set('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
$response->headers->set('X-Frame-Options', 'DENY');
$response->headers->set('X-Content-Type-Options', 'nosniff');
$response->headers->set('X-XSS-Protection', '1; mode=block');
return $response;
}
Authentication و Authorization
1. JWT (JSON Web Token)
استفاده از JWT برای احراز هویت:
// Laravel - JWT Implementation
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
class AuthController extends Controller
{
public function login(Request $request)
{
$credentials = $request->only('email', 'password');
if (Auth::attempt($credentials)) {
$user = Auth::user();
$payload = [
'user_id' => $user->id,
'email' => $user->email,
'exp' => time() + (60 * 60 * 24) // 24 ساعت
];
$token = JWT::encode($payload, config('jwt.secret'), 'HS256');
return response()->json(['token' => $token]);
}
return response()->json(['error' => 'Unauthorized'], 401);
}
}
2. OAuth 2.0
احراز هویت با سرویسهای خارجی:
// Laravel Socialite
use Laravel\Socialite\Facades\Socialite;
class AuthController extends Controller
{
public function redirectToGoogle()
{
return Socialite::driver('google')->redirect();
}
public function handleGoogleCallback()
{
$user = Socialite::driver('google')->user();
// ایجاد یا بهروزرسانی کاربر
$localUser = User::updateOrCreate([
'google_id' => $user->id,
], [
'name' => $user->name,
'email' => $user->email,
]);
Auth::login($localUser);
return redirect('/dashboard');
}
}
نظارت و Logging
1. Security Logging
ثبت رویدادهای امنیتی:
// Laravel - Security Logging
use Illuminate\Support\Facades\Log;
class SecurityLogger
{
public static function logFailedLogin($email, $ip)
{
Log::warning('Failed login attempt', [
'email' => $email,
'ip' => $ip,
'timestamp' => now(),
'user_agent' => request()->userAgent()
]);
}
public static function logSuspiciousActivity($activity, $details)
{
Log::critical('Suspicious activity detected', [
'activity' => $activity,
'details' => $details,
'ip' => request()->ip(),
'timestamp' => now()
]);
}
}
2. Rate Limiting
محدود کردن درخواستها:
// Laravel - Rate Limiting
Route::middleware(['throttle:5,1'])->group(function () {
Route::post('/login', [AuthController::class, 'login']);
Route::post('/register', [AuthController::class, 'register']);
});
// Custom Rate Limiting
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->ip());
});
🚨 نکات مهم امنیتی
- همیشه از HTTPS استفاده کنید
- پسوردها را Hash کنید
- دادههای حساس را رمزنگاری کنید
- از Prepared Statements استفاده کنید
- CSRF Protection فعال کنید
- ورودی کاربران را Validate کنید
- بهروزرسانیهای امنیتی را نصب کنید
مقالات مرتبط
برای یادگیری بیشتر، مقالات زیر را مطالعه کنید:
- برنامه نویسی بکاند با Laravel و PHP
- توسعه اپلیکیشن اندروید با Java و Kotlin
- راهنمای کامل طراحی سایت با React.js
نتیجهگیری
امنیت یک فرآیند مداوم است، نه یک هدف یکباره. با رعایت اصول امنیتی و بهروزرسانی مداوم، میتوانید از سایتها و اپلیکیشنهای خود در برابر تهدیدات محافظت کنید. علی سلمانیان آماده کمک به شما در پیادهسازی اصول امنیتی در پروژههایتان است.