mirror of
https://github.com/affaan-m/everything-claude-code.git
synced 2026-04-08 02:03:34 +08:00
* Add Turkish (tr) docs and update README Add a full set of Turkish documentation under docs/tr (agents, changelog, CLAUDE guide, contributing, code of conduct, and many agents/commands/skills/rules files). Update README to include a link to the Turkish docs and increment the supported language count from 5 to 6. This commit adds localized guidance and references to help Turkish-speaking contributors and users. * Update docs/tr/TROUBLESHOOTING.md Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> * Update docs/tr/README.md Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> * docs(tr): fix license link and update readmes Update Turkish docs: change license badge link to point to repository root (../../LICENSE), increment displayed language count from 5 to 6, and remove two outdated related links from docs/tr/examples/README.md to keep references accurate. * Update docs/tr/commands/instinct-import.md Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> * Update docs/tr/commands/checkpoint.md Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> --------- Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
286 lines
8.2 KiB
Markdown
286 lines
8.2 KiB
Markdown
---
|
||
name: laravel-security
|
||
description: Laravel security best practices for authn/authz, validation, CSRF, mass assignment, file uploads, secrets, rate limiting, and secure deployment.
|
||
origin: ECC
|
||
---
|
||
|
||
# Laravel Güvenlik En İyi Uygulamaları
|
||
|
||
Laravel uygulamalarını yaygın güvenlik açıklarına karşı korumak için kapsamlı güvenlik rehberi.
|
||
|
||
## Ne Zaman Aktif Edilir
|
||
|
||
- Kimlik doğrulama veya yetkilendirme ekleme
|
||
- Kullanıcı girişi ve dosya yüklemelerini işleme
|
||
- Yeni API endpoint'leri oluşturma
|
||
- Gizli bilgileri ve ortam ayarlarını yönetme
|
||
- Production deployment'ları sertleştirme
|
||
|
||
## Nasıl Çalışır
|
||
|
||
- Middleware temel korumalar sağlar (CSRF için `VerifyCsrfToken`, güvenlik başlıkları için `SecurityHeaders`).
|
||
- Guard'lar ve policy'ler erişim kontrolünü zorlar (`auth:sanctum`, `$this->authorize`, policy middleware).
|
||
- Form Request'ler servislere ulaşmadan önce girişi doğrular ve şekillendirir (`UploadInvoiceRequest`).
|
||
- Rate limiting, auth kontrolleri ile birlikte kötüye kullanım koruması ekler (`RateLimiter::for('login')`).
|
||
- Veri güvenliği encrypted cast'lerden, mass-assignment korumalarından ve signed route'lardan gelir (`URL::temporarySignedRoute` + `signed` middleware).
|
||
|
||
## Temel Güvenlik Ayarları
|
||
|
||
- Production'da `APP_DEBUG=false`
|
||
- `APP_KEY` ayarlanmalı ve tehlikeye girdiğinde döndürülmelidir
|
||
- `SESSION_SECURE_COOKIE=true` ve `SESSION_SAME_SITE=lax` ayarlayın (veya hassas uygulamalar için `strict`)
|
||
- Doğru HTTPS algılama için güvenilir proxy'leri yapılandırın
|
||
|
||
## Session ve Cookie Sertleştirme
|
||
|
||
- JavaScript erişimini önlemek için `SESSION_HTTP_ONLY=true` ayarlayın
|
||
- Yüksek riskli akışlar için `SESSION_SAME_SITE=strict` kullanın
|
||
- Login ve ayrıcalık değişikliklerinde session'ları yeniden oluşturun
|
||
|
||
## Kimlik Doğrulama ve Token'lar
|
||
|
||
- API kimlik doğrulama için Laravel Sanctum veya Passport kullanın
|
||
- Hassas veriler için yenileme akışları ile kısa ömürlü token'ları tercih edin
|
||
- Logout ve tehlikeye girmiş hesaplarda token'ları iptal edin
|
||
|
||
Örnek route koruması:
|
||
|
||
```php
|
||
use Illuminate\Http\Request;
|
||
use Illuminate\Support\Facades\Route;
|
||
|
||
Route::middleware('auth:sanctum')->get('/me', function (Request $request) {
|
||
return $request->user();
|
||
});
|
||
```
|
||
|
||
## Parola Güvenliği
|
||
|
||
- `Hash::make()` ile parolaları hash'leyin ve asla düz metin saklamayın
|
||
- Sıfırlama akışları için Laravel'in password broker'ını kullanın
|
||
|
||
```php
|
||
use Illuminate\Support\Facades\Hash;
|
||
use Illuminate\Validation\Rules\Password;
|
||
|
||
$validated = $request->validate([
|
||
'password' => ['required', 'string', Password::min(12)->letters()->mixedCase()->numbers()->symbols()],
|
||
]);
|
||
|
||
$user->update(['password' => Hash::make($validated['password'])]);
|
||
```
|
||
|
||
## Yetkilendirme: Policy'ler ve Gate'ler
|
||
|
||
- Model seviyesi yetkilendirme için policy'leri kullanın
|
||
- Controller'larda ve servislerde yetkilendirmeyi zorlayın
|
||
|
||
```php
|
||
$this->authorize('update', $project);
|
||
```
|
||
|
||
Route seviyesi zorlama için policy middleware kullanın:
|
||
|
||
```php
|
||
use Illuminate\Support\Facades\Route;
|
||
|
||
Route::put('/projects/{project}', [ProjectController::class, 'update'])
|
||
->middleware(['auth:sanctum', 'can:update,project']);
|
||
```
|
||
|
||
## Validation ve Veri Temizleme
|
||
|
||
- Her zaman Form Request'ler ile girişleri doğrulayın
|
||
- Sıkı validation kuralları ve tip kontrolleri kullanın
|
||
- Türetilmiş alanlar için request payload'larına asla güvenmeyin
|
||
|
||
## Mass Assignment Koruması
|
||
|
||
- `$fillable` veya `$guarded` kullanın ve `Model::unguard()` kullanmaktan kaçının
|
||
- DTO'ları veya açık attribute mapping'i tercih edin
|
||
|
||
## SQL Injection Önleme
|
||
|
||
- Eloquent veya query builder parametre binding kullanın
|
||
- Kesinlikle gerekli olmadıkça raw SQL kullanmaktan kaçının
|
||
|
||
```php
|
||
DB::select('select * from users where email = ?', [$email]);
|
||
```
|
||
|
||
## XSS Önleme
|
||
|
||
- Blade varsayılan olarak çıktıyı escape eder (`{{ }}`)
|
||
- `{!! !!}` sadece güvenilir, temizlenmiş HTML için kullanın
|
||
- Zengin metni özel bir kütüphane ile temizleyin
|
||
|
||
## CSRF Koruması
|
||
|
||
- `VerifyCsrfToken` middleware'ini etkin tutun
|
||
- Formlara `@csrf` ekleyin ve SPA istekleri için XSRF token'ları gönderin
|
||
|
||
Sanctum ile SPA kimlik doğrulaması için, stateful isteklerin yapılandırıldığından emin olun:
|
||
|
||
```php
|
||
// config/sanctum.php
|
||
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', 'localhost')),
|
||
```
|
||
|
||
## Dosya Yükleme Güvenliği
|
||
|
||
- Dosya boyutunu, MIME tipini ve uzantısını doğrulayın
|
||
- Mümkün olduğunda yüklemeleri public path dışında saklayın
|
||
- Gerekirse dosyaları malware için tarayın
|
||
|
||
```php
|
||
final class UploadInvoiceRequest extends FormRequest
|
||
{
|
||
public function authorize(): bool
|
||
{
|
||
return (bool) $this->user()?->can('upload-invoice');
|
||
}
|
||
|
||
public function rules(): array
|
||
{
|
||
return [
|
||
'invoice' => ['required', 'file', 'mimes:pdf', 'max:5120'],
|
||
];
|
||
}
|
||
}
|
||
```
|
||
|
||
```php
|
||
$path = $request->file('invoice')->store(
|
||
'invoices',
|
||
config('filesystems.private_disk', 'local') // bunu public olmayan bir disk'e ayarlayın
|
||
);
|
||
```
|
||
|
||
## Rate Limiting
|
||
|
||
- Auth ve yazma endpoint'lerinde `throttle` middleware'i uygulayın
|
||
- Login, password reset ve OTP için daha sıkı limitler kullanın
|
||
|
||
```php
|
||
use Illuminate\Cache\RateLimiting\Limit;
|
||
use Illuminate\Http\Request;
|
||
use Illuminate\Support\Facades\RateLimiter;
|
||
|
||
RateLimiter::for('login', function (Request $request) {
|
||
return [
|
||
Limit::perMinute(5)->by($request->ip()),
|
||
Limit::perMinute(5)->by(strtolower((string) $request->input('email'))),
|
||
];
|
||
});
|
||
```
|
||
|
||
## Gizli Bilgiler ve Kimlik Bilgileri
|
||
|
||
- Gizli bilgileri asla kaynak kontrolüne commit etmeyin
|
||
- Ortam değişkenlerini ve gizli yöneticileri kullanın
|
||
- Maruz kalma sonrası anahtarları döndürün ve session'ları geçersiz kılın
|
||
|
||
## Şifreli Attribute'lar
|
||
|
||
Bekleyen hassas sütunlar için encrypted cast'leri kullanın.
|
||
|
||
```php
|
||
protected $casts = [
|
||
'api_token' => 'encrypted',
|
||
];
|
||
```
|
||
|
||
## Güvenlik Başlıkları
|
||
|
||
- Uygun yerlerde CSP, HSTS ve frame koruması ekleyin
|
||
- HTTPS yönlendirmelerini zorlamak için güvenilir proxy yapılandırması kullanın
|
||
|
||
Başlıkları ayarlamak için örnek middleware:
|
||
|
||
```php
|
||
use Illuminate\Http\Request;
|
||
use Symfony\Component\HttpFoundation\Response;
|
||
|
||
final class SecurityHeaders
|
||
{
|
||
public function handle(Request $request, \Closure $next): Response
|
||
{
|
||
$response = $next($request);
|
||
|
||
$response->headers->add([
|
||
'Content-Security-Policy' => "default-src 'self'",
|
||
'Strict-Transport-Security' => 'max-age=31536000', // tüm subdomain'ler HTTPS olduğunda includeSubDomains/preload ekleyin
|
||
'X-Frame-Options' => 'DENY',
|
||
'X-Content-Type-Options' => 'nosniff',
|
||
'Referrer-Policy' => 'no-referrer',
|
||
]);
|
||
|
||
return $response;
|
||
}
|
||
}
|
||
```
|
||
|
||
## CORS ve API Erişimi
|
||
|
||
- `config/cors.php`'de origin'leri kısıtlayın
|
||
- Kimlik doğrulamalı route'lar için wildcard origin'lerden kaçının
|
||
|
||
```php
|
||
// config/cors.php
|
||
return [
|
||
'paths' => ['api/*', 'sanctum/csrf-cookie'],
|
||
'allowed_methods' => ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'],
|
||
'allowed_origins' => ['https://app.example.com'],
|
||
'allowed_headers' => [
|
||
'Content-Type',
|
||
'Authorization',
|
||
'X-Requested-With',
|
||
'X-XSRF-TOKEN',
|
||
'X-CSRF-TOKEN',
|
||
],
|
||
'supports_credentials' => true,
|
||
];
|
||
```
|
||
|
||
## Loglama ve PII
|
||
|
||
- Parolaları, token'ları veya tam kart verilerini asla loglamayın
|
||
- Yapılandırılmış loglarda hassas alanları redakte edin
|
||
|
||
```php
|
||
use Illuminate\Support\Facades\Log;
|
||
|
||
Log::info('User updated profile', [
|
||
'user_id' => $user->id,
|
||
'email' => '[REDACTED]',
|
||
'token' => '[REDACTED]',
|
||
]);
|
||
```
|
||
|
||
## Bağımlılık Güvenliği
|
||
|
||
- Düzenli olarak `composer audit` çalıştırın
|
||
- Bağımlılıkları dikkatle sabitleyin ve CVE'lerde hızlıca güncelleyin
|
||
|
||
## Signed URL'ler
|
||
|
||
Geçici, kurcalamaya dayanıklı bağlantılar için signed route'ları kullanın.
|
||
|
||
```php
|
||
use Illuminate\Support\Facades\URL;
|
||
|
||
$url = URL::temporarySignedRoute(
|
||
'downloads.invoice',
|
||
now()->addMinutes(15),
|
||
['invoice' => $invoice->id]
|
||
);
|
||
```
|
||
|
||
```php
|
||
use Illuminate\Support\Facades\Route;
|
||
|
||
Route::get('/invoices/{invoice}/download', [InvoiceController::class, 'download'])
|
||
->name('downloads.invoice')
|
||
->middleware('signed');
|
||
```
|