İçerik Güvenliği Politikası (CSP) Rehberi
İçerik Güvenliği Politikası (CSP), modern web güvenliğinin temel taşıdır. Tarayıcıya hangi kaynakların yüklenebileceğini ve çalıştırılabileceğini söyleyen bir HTTP başlığıdır. CSP, siteniz için bir güvenlik duvarı görevi görür ve Cross-Site Scripting (XSS), clickjacking ve diğer kod enjeksiyon saldırılarının neden olduğu hasarı önler veya azaltır. CSP'nin düzgün yapılandırılması, hassas kullanıcı verileri veya finansal işlemlerle ilgilenen her site için kritik öneme sahiptir.
CSP Nedir?
CSP olmadan, bir saldırgan sitenize kötü amaçlı bir script enjekte ederse, tarayıcı bu scripti meşru site kodunuzdan ayırt edemez. CSP, bir güvenilir kaynaklar beyaz listesi tanımlar — bu listede olmayan her şey engellenir. Bu, bir saldırganın sayfanıza kötü amaçlı bir script etiketi eklemeyi başarsa bile, tarayıcının bunu yürütmeyi reddedeceği anlamına gelir.
CSP, HTTP yanıt başlığı aracılığıyla sunulur. Tarayıcı sayfayı render ederken, CSP başlığını okur ve her kaynak isteğini (script'ler, stil sayfaları, görseller, yazı tipleri vb.) politika ile karşılaştırır. Politika ile eşleşmeyen herhangi bir kaynak engellenir ve bir raporlama uç noktası yapılandırılmışsa ihlal raporu gönderilir.
Temel CSP Direktifleri
default-src, diğer fetch direktifleri için geri dönüş işlevi görür. Diğer direktiflerden herhangi biri yoksa, default-src tarafından belirtilen kaynaklar kullanılır. Çoğu politika, daha spesifik direktiflerle gerektiğinde geçersiz kılınan katı bir default-src ile başlar.
CSP Neden Önemlidir?
script-src, JavaScript'in hangi kaynaklardan yüklenip çalıştırılabileceğini kontrol eder. Bu, XSS saldırılarını önlemek için en kritik direktiftir. Katı bir script-src, CSP'nin koruma mekanizmasının kalbidir. Modern en iyi uygulama, inline script'leri ve eval() kullanımını engelleyen nonce tabanlı veya hash tabanlı bir yaklaşım kullanmaktır.
CSP Nasıl Çalışır?
style-src, CSS stil sayfalarının ve inline stillerin hangi kaynaklardan yüklenebileceğini kontrol eder. Script'lerden daha az tehlikeli olsa da, kötü amaçlı CSS veri sızdırma ve sayfa düzenini manipüle etmek için kullanılabilir. Çoğu site, kendi kaynaklarından stil sayfalarına ve güvenilir CDN'lerden yazı tiplerine izin verir.
default-src
img-src, görsellerin hangi kaynaklardan yüklenebileceğini kontrol eder. Görseller XSS'e neden olamazken, kullanıcı aktivitesini izlemek, kullanıcıları parmak izi ile tanımlamak veya diğer bilgi toplama saldırılarını gerçekleştirmek için kullanılabilir. Çoğu site, kendi alanından ve güvenilir CDN'lerden gelen görsellere izin verir.
CSP Kaynak Değerleri
connect-src, fetch(), XMLHttpRequest, WebSocket ve EventSource aracılığıyla yapılan ağ isteklerini kontrol eder. Bu, API çağrılarınızın hangi arka uç hizmetlere bağlanabileceğini kısıtlamak için önemlidir. Uygulamanızın yapması gereken uç noktaları belirtin ve geri kalan her şeyi engelleyin.
script-src
| Direktif | Kontrol Ettiği Kaynak | Örnek Değer |
|---|---|---|
| default-src | Tüm kaynak türleri için geri dönüş | 'self' |
| default-src 'self' | Tüm kaynakları aynı origin ile sınırlar | Diğer direktiflerle geçersiz kılınan temel politika |
| script-src | JavaScript | 'self' https://cdn.example.com |
| script-src 'self' https://cdn.example.com | Kendi kaynağından ve belirtilen CDN'den script'lere izin verir | XSS saldırılarını önler |
| style-src | CSS | 'self' 'unsafe-inline' |
| style-src 'self' 'unsafe-inline' | Kendi kaynağından ve inline stillerden CSS'e izin verir | Stil sayfası yüklemesini kontrol eder |
| img-src | Görseller | 'self' data: https: |
| img-src 'self' data: https: | Kendi kaynağından, data URL'lerden ve HTTPS'ten görsellere izin verir | Görsel yüklemesini kontrol eder |
| connect-src | Fetch/XHR/WebSocket | 'self' https://api.example.com |
style-src
| Değer | Anlamı | Kullanım Örneği |
|---|---|---|
| connect-src 'self' https://api.example.com | Kendi kaynağına ve API uç noktasına bağlantılara izin verir | API isteklerini kısıtlar |
| font-src | Yazı Tipleri | 'self' https://fonts.googleapis.com |
| font-src 'self' https://fonts.googleapis.com | Kendi kaynağından ve Google Fonts'tan yazı tiplerine izin verir | Web yazı tipi yüklemesini kontrol eder |
| frame-src | iframe'ler | 'self' https://www.youtube.com |
img-src
| Directive | Controls | Example |
|---|---|---|
| frame-src 'self' https://www.youtube.com | Kendi kaynağından ve YouTube'dan iframe'lere izin verir | Gömülü içeriği kontrol eder |
| media-src | Ses/Video | 'self' |
CSP Oluşturma
| Source Value | Meaning |
|---|---|
| media-src 'self' | Yalnızca kendi kaynağından medyaya izin verir |
| Medya yüklemesini kontrol eder | object-src |
| Eklentiler | 'none' |
| object-src 'none' | Tüm eklentileri engeller |
| Flash/Java'yı engeller (her zaman 'none' kullanın) | base-uri |
| Belge taban URL'si | 'self' |
| base-uri 'self' | Yalnızca aynı origin'den base etiketlerine izin verir |
| Base etiketi enjeksiyon saldırılarını önler | form-action |
| Form gönderimleri | 'self' |
| form-action 'self' | Formları yalnızca aynı origin'e göndermeye kısıtlar |
CSP Test ve Hata Ayıklama
connect-src
upgrade-insecure-requests, tarayıcıya tüm HTTP isteklerini HTTPS olarak yeniden yazmasını söyler. Bu, HTTP sayfalarındaki karışık içerik uyarılarını ortadan kaldırmanın ve tüm kaynakların güvenli bir şekilde yüklenmesini sağlamanın basit bir yoludur. block-all-mixed-content, HTTPS sayfalarında HTTP kaynaklarının yüklenmesini engeller.
Content-Security-Policy-Report-Only:
default-src 'none';
script-src 'self';
style-src 'self';
img-src 'self';
font-src 'self';
connect-src 'self';
report-uri /csp-reportfont-src
'none' hiçbir kaynağa izin vermez — en katı değerdir. 'self' aynı origin'den (şema, ana bilgisayar ve port) gelen kaynaklara izin verir. 'unsafe-inline' satır içi script'lere ve stillere izin verir — adından da anlaşılacağı gibi, bu güvensizdir ve XSS korumasını önemli ölçüde azaltır. 'unsafe-eval' eval() ve benzeri yöntemlere izin verir. 'unsafe-inline' ve 'unsafe-eval' kullanmaktan kaçının.
{
"csp-report": {
"document-uri": "https://example.com/page",
"violated-directive": "script-src 'self'",
"blocked-uri": "https://cdn.analytics.com/tracker.js",
"line-number": 42
}
}frame-src ve child-src
'strict-dynamic' kaynak değeri, güveni yetkili bir script tarafından yüklenen script'lere genişletir. Bu, geçerli bir nonce'a sahip ana uygulama script'iniz ek script'leri dinamik olarak yüklerse, bu script'lerin kaynaklarını politikanızda listelemenize gerek kalmadan otomatik olarak güvenilir hale geldiği anlamına gelir. Bu, modern uygulamalar için önerilen yaklaşımdır ve nonce tabanlı politikalarla birlikte kullanılır.
Content-Security-Policy-Report-Only:
default-src 'none';
script-src 'self' cdn.analytics.com cdn.example.com;
style-src 'self' fonts.googleapis.com;
img-src 'self' data: cdn.example.com;
font-src 'self' fonts.gstatic.com;
connect-src 'self' api.example.com;
frame-src www.youtube-nocookie.com;
report-uri /csp-reportmedia-src ve object-src
nonce-* (number used once), her sayfa yüklemesinde değişen rastgele bir değerdir. Script etiketiniz geçerli nonce'ı içeriyorsa, yürütülmesine izin verilir. sha256-* (hash), bir script veya stil sayfasının SHA-256 hash'idir. Hash, politika hash'i ile eşleşen inline içeriklerin çalışmasına izin verir. Hash'ler statik içerik için kullanışlıdır, nonce'lar ise dinamik içerik için daha iyidir.
CSP Raporlaması
https://, tüm HTTPS kaynaklarını belirli bir origin'den alır. data:, data: URL'lerine izin verir (örn. data:image/svg+xml). Görseller için kullanışlıdır ancak script'ler için data: kullanmaktan kaçının çünkü bu, XSS için bir vektör oluşturur.
// Server generates a random nonce per request
const nonce = crypto.randomUUID();
// CSP header includes the nonce
Content-Security-Policy:
default-src 'none';
script-src 'nonce-{random-nonce}' 'strict-dynamic';
style-src 'self';
img-src 'self';
font-src 'self';
connect-src 'self';
// HTML includes the same nonce on script tags
<script nonce="{random-nonce}">
// This script is allowed because its nonce matches
console.log('Hello from authorized script');
</script>Yalnızca raporlama modu, politikayı uygulamak yerine raporlamak için Content-Security-Policy-Report-Only başlığını kullanır. Bu, gerçek kullanıcıları etkilemeden politikanızı test etmenin en güvenli yoludur. Mevcut sitenize yeni bir CSP uygularken her zaman yalnızca raporlama moduyla başlayın.
Yaygın CSP Hataları
ToolHub CSP Oluşturucu, görsel bir arayüz kullanarak CSP başlıkları oluşturmanıza olanak tanır. Politikaları test etmek için CSP Evaluator (Google tarafından) kullanın. CSP'yi test ederken tarayıcı geliştirici araçları konsolunda ihlal mesajlarını izleyin.
base-uri
etiketi olarak sunabilirsiniz. HTTP başlık yaklaşımı tercih edilir çünkü tüm içerik türlerinde çalışır ve meta etiketinden daha erken işlenir. Nginx, Apache veya uygulama çerçeveniz aracılığıyla yapılandırın.
form-action
report-uri, ihlal raporlarının POST edileceği bir URL belirtir. Bu, daha yeni Reporting API tarafından değiştirilmektedir. report-to, ihlal raporlaması için Reporting API'yi kullanır. Bu daha yeni yaklaşım, rapor formatı ve teslimatı üzerinde daha fazla kontrol sağlar.
upgrade-insecure-requests
CSP ihlal raporlarını almak için bir uç nokta ayarlayın. Raporlar, engellenen kaynağın URL'sini, ihlal edilen direktifi ve sayfa URL'sini içeren JSON nesneleri olarak gönderilir. Bu raporları politikanızdaki sorunları belirlemek ve potansiyel saldırı girişimlerini tespit etmek için kullanın.
block-all-mixed-content
Inline script'lere izin vermek, CSP'nin XSS'e karşı sağladığı korumanın çoğunu ortadan kaldırır. Bunun yerine, tüm JavaScript'i harici dosyalara taşıyın ve CSP'nizde güvenilir kaynakları belirtin. Inline script'ler kesinlikle gerekliyse, nonce veya hash kullanın — asla 'unsafe-inline' kullanmayın.
'none'
Üçüncü taraf kaynakları (analitik, reklamlar, CDN'ler), politikanızda açıkça izin verilmelidir. Yalnızca ihtiyacınız olan belirli kaynakları listeleyin, joker karakterlerden kaçının. Hangi kaynakların gerekli olduğunu belirlemek için CSP Evaluator ve Raporlama URI gibi araçları kullanın.
CSP ve Diğer Güvenlik Başlıkları
Karışık içerik, HTTPS sayfalarının HTTP kaynaklarını yüklemesi durumunda ortaya çıkar. CSP, yükseltme veya engelleme yoluyla karışık içeriği kontrol etmek için upgrade-insecure-requests ve block-all-mixed-content direktiflerini sağlar. Modern siteler, kullanıcı güvenini ve SEO sıralamasını korumak için tüm HTTP kaynaklarını engellemelidir.
'self'
CSP ve reklamlar, reklam ağlarının script'leri ve izleme piksellerini dinamik olarak yüklemesi gerektiğinden tarihsel olarak çatışma yaşamıştır. Reklamlar için CSP'yi yapılandırırken, reklam sağlayıcılarınız tarafından kullanılan belirli alanları belirlemek için raporlama modunu kullanın, ardından yalnızca bu alanları beyaz listeye ekleyin.
'unsafe-inline'
X-Frame-Options, sayfanızın bir iframe içinde gömülüp gömülemeyeceğini kontrol eder. CSP'nin frame-ancestors direktifi, aynı işlevi daha fazla esneklikle sağlar. X-Content-Type-Options, MIME tipi koklamayı engeller. Referrer-Policy, Referer başlığında ne kadar bilgi gönderileceğini kontrol eder. Permissions-Policy, kamera ve mikrofon gibi tarayıcı özelliklerine erişimi kontrol eder. HSTS, HTTPS bağlantılarını zorunlu kılar.
Sıkça Sorulan Sorular
CSP olmadan, siteniz XSS saldırılarına, veri enjeksiyonuna ve clickjacking'e karşı savunmasızdır. Tarayıcı varsayılan olarak tüm script'leri ve kaynakları yürütür, bu nedenle bir saldırganın kötü amaçlı kod enjekte etmesi durumunda tarayıcı bunu engellemez. CSP, bu varsayılan davranışı kısıtlayan ek bir güvenlik katmanı sağlar.
- Veri enjeksiyon saldırılarını (XSS, clickjacking) önler
- Karma içerik sorunlarını belirlemenize ve düzeltmenize yardımcı olur
- Güvenlik ihlali tespiti için raporlama sağlar
- PCI DSS ve diğer uyumluluk standartlarını karşılamak için gereklidir
- Modern web uygulamaları için derinlemesine savunma stratejisinin bir parçasıdır
Deploying CSP
CSP, SEO'yu doğrudan etkilemez çünkü arama motoru botları genellikle CSP'yi uygulamaz. Ancak, CSP ile sağlanan güvenlik iyileştirmeleri dolaylı olarak SEO'ya fayda sağlar — Google, güvenli siteleri (HTTPS, güvenlik başlıkları) sıralama sinyali olarak kullanır. Ayrıca, CSP tarafından engellenen karışık içerik uyarıları, kullanıcı deneyimini ve hemen çıkma oranını etkileyebilir.
'unsafe-eval'
// Apache (.htaccess)
Header set Content-Security-Policy "default-src 'self'; script-src 'self' cdn.example.com"
// Nginx
add_header Content-Security-Policy "default-src 'self'; script-src 'self' cdn.example.com";
// Express.js (Node)
app.use((req, res, next) => {
res.setHeader(
'Content-Security-Policy',
"default-src 'self'; script-src 'self' cdn.example.com"
);
next();
});'strict-dynamic'
<meta http-equiv="Content-Security-Policy"
content="default-src 'self'; script-src 'self' cdn.example.com">Yalnızca raporlama moduyla başlayın ve ihlal raporlarını izleyin. Meşru kaynakların engellenmediğini doğruladıktan sonra, uygulama moduna geçin. Tarayıcı konsolunda CSP ihlal mesajlarını kontrol edin. Bu, politikanızı gerçek sitenizde test etmenin en güvenli yaklaşımıdır.
CSP OluşturucuFrequently Asked Questions
nonce-*
Nonce, her sayfa yüklemesinde değişen rastgele bir değerdir ve HTML'deki script etiketine ve CSP başlığına eklenir. Hash, bir script'in içeriğinin kriptografik hash'idir ve CSP başlığına dahil edilir. Nonce'lar dinamik olarak oluşturulan içerik için daha iyidir, hash'ler ise statik içerik için daha uygundur.
sha256-*
CSP, XSS saldırılarının riskini önemli ölçüde azaltır ancak özellikle DOM tabanlı XSS olmak üzere tüm XSS saldırılarını durdurmaz. CSP, derinlemesine savunma stratejisinin bir parçası olarak kullanılmalıdır; giriş doğrulama, çıkış kodlama ve diğer güvenlik en iyi uygulamalarıyla birlikte.
https://
No. CSP is a defense-in-depth layer, not a replacement for input validation and output encoding. You should still sanitize all user input, escape output, and follow secure coding practices. CSP provides an additional safety net that limits the damage if an XSS vulnerability is discovered, but it should not be your only line of defense.
data:
Use Content-Security-Policy-Report-Only to test your policy without breaking your site. Configure a report-uri endpoint to collect violation reports. Monitor the reports for a sufficient period (days or weeks) to identify all legitimate resources. Fix any violations by adding the necessary sources to your policy. Once no legitimate violations appear, switch to the enforcement header.
Yalnızca Raporlama Modu
Yes, a misconfigured CSP can block legitimate resources, causing broken functionality, missing images, failed API calls, and non-working scripts. This is why you should always test with report-only mode first and gradually tighten your policy. Using 'unsafe-inline' or 'unsafe-eval' weakens protection but may be necessary for legacy applications.