CGI proxy, Common Gateway Interface (CGI) betiği olarak gerçeklenmiş, web tabanlı bir proxy hizmetidir; istekleri proxy sunucusu üzerinden yönlendirerek kullanıcıların dış siteleri bir web tarayıcısı üzerinden açmasına imkân verir. Bu yöntem, hedef URL'yi proxy'nin web sayfasındaki bir forma girerek internette anonim gezinmeyi ya da temel içerik filtrelerini aşmayı mümkün kılar.
CGI proxy'ler nasıl çalışır
CGI proxy'ler uygulama katmanında çalışır; istemci tarafında tarayıcı veya işletim sistemi ayarı gerektiren geleneksel HTTP ya da SOCKS proxy'lerinden bu yönüyle ayrılır. Bir kullanıcı CGI proxy üzerinden bir siteye erişmek istediğinde, proxy'nin URL'sine gider ve genellikle hedef URL'yi bir web formuna girer.
İşleyiş akışı şöyledir:
1. Kullanıcı isteği: Kullanıcının tarayıcısı, hedef URL'yi içeren bir HTTP GET veya POST isteğini CGI proxy sunucusuna gönderir.
2. Betiğin çalıştırılması: CGI proxy'yi barındıran web sunucusu, proxy betiğini (örneğin PHP, Perl veya Python ile yazılmış) çalıştırır.
3. İçeriğin çekilmesi: Proxy sunucusunda çalışan CGI betiği, belirtilen hedef siteye bir HTTP isteği başlatır.
4. İçeriğin değiştirilmesi: Hedef sitenin içeriğini (HTML, CSS, JavaScript, görseller) aldıktan sonra CGI betiği bunu ayrıştırır ve değiştirir. Bu değişiklik kritiktir ve genellikle şunları içerir:
* Tüm mutlak ve göreli URL'lerin (bağlantılar, görsel kaynakları, betik kaynakları, CSS import'ları) yeniden yazılarak CGI proxy betiğinin kendisine yönlendirilmesi. Böylece sonraki isteklerin (bir bağlantıya tıklama, bir görselin yüklenmesi) de proxy üzerinden geçmesi sağlanır.
* Proxy'lenen ortamda işlevselliği korumak için çerezlerin, başlıkların veya JavaScript'in gerektiğinde ayarlanması.
5. İçeriğin teslimi: Değiştirilen içerik, CGI proxy sunucusundan kullanıcının tarayıcısına geri gönderilir. Kullanıcının tarayıcısı bu içeriği, hedef siteyle doğrudan etkileşimde olduğunu sanarak işler; oysa tüm trafik aslında CGI proxy tarafından aracılanmaktadır.
URL yeniden yazma örneği
images/logo.png adlı bir görsele ve about.html sayfasına bağlantı içeren example.com adlı bir hedef site düşünün.
Proxy olmadan tarayıcı http://example.com/images/logo.png ve http://example.com/about.html adreslerini ister.
Bir CGI proxy bunları şöyle yeniden yazar:
Özgün HTML parçası:
<img src="/images/logo.png">
<a href="/about.html">About Us</a>
CGI proxy tarafından yeniden yazılmış hâli (proxy betiğinin proxy.php olduğu ve hedefin kodlandığı varsayılarak):
<img src="/proxy.php?url=http%3A%2F%2Fexample.com%2Fimages%2Flogo.png">
<a href="/proxy.php?url=http%3A%2F%2Fexample.com%2Fabout.html">About Us</a>
Bu, sonraki tüm kaynak isteklerinin ve gezinmelerin proxy.php betiği üzerinden geçmesini sağlar.
Kullanım senaryoları ve avantajları
CGI proxy'ler belirli senaryolarda somut avantajlar sunar:
- Temel içerik filtrelerini aşma: Belirli sitelere doğrudan erişimi engelleyen kısıtlayıcı güvenlik duvarları veya ağ filtreleri bulunan ortamlarda, proxy sunucusunun kendisi engellenmemişse bir CGI proxy bu engelleri çoğu zaman aşabilir.
- İstemci tarafında yapılandırma gerektirmemesi: Kullanıcıların tarayıcı ayarlarını değiştirmesi, yazılım kurması veya işletim sistemi ağ ayarlarını yapılandırması gerekmez. Erişim tamamen standart bir tarayıcı arayüzü üzerinden olur. Bu da onları halka açık bilgisayarlar veya yazılım kurulumunun yasak olduğu kısıtlı ortamlar için uygun kılar.
- Geçici anonimlik: Tüm istekler proxy sunucusunun IP'sinden çıktığı için kullanıcının IP adresi hedef siteden gizlenir. Bu bir anonimlik katmanı sağlar, ancak proxy operatörünün tüm trafiği gördüğünü unutmamak gerekir.
- Coğrafi kısıtlı içeriğe erişim (sınırlı): CGI proxy sunucusu farklı bir coğrafi bölgede bulunuyorsa, bazen o bölgeye özel içeriğe erişim sağlayabilir. Ancak modern coğrafi engelleme, proxy kullanımını tespit edebilen çok daha gelişmiş yöntemler kullanır.
- Web geliştirme ve test: Geliştiriciler, karmaşık bir kurulum yapmadan bir sitenin farklı bir IP adresinden veya farklı bir ağ perspektifinden nasıl göründüğünü CGI proxy ile inceleyebilir.
Kısıtlar ve dezavantajlar
Faydalarına rağmen CGI proxy'lerin ciddi kısıtları vardır:
- Performans yükü: İçeriğin çekilmesi, ayrıştırılması, yeniden yazılması ve yeniden sunulması gecikme yaratır. Bu da gezinmeyi doğrudan erişime veya daha performanslı bir proxy türüne kıyasla belirgin biçimde yavaşlatır.
- Bozulan işlevsellik: JavaScript, AJAX, WebSockets veya karmaşık CSS'e yoğun şekilde dayanan siteler proxy'lendiğinde sık sık bozulur. URL yeniden yazma süreci betik çalışmasına, JavaScript içindeki göreli yollara veya dinamik içerik yüklemeye müdahale edebilir.
- Sınırlı protokol desteği: CGI proxy'ler öncelikle HTTP ve HTTPS trafiğini destekler. FTP, SMTP veya genel TCP/UDP bağlantıları gibi diğer protokolleri proxy'leyemezler.
- Güvenlik endişeleri:
- Man-in-the-Middle (MitM) riski: CGI proxy sunucusu, hedef siteden gelen HTTPS trafiğini çözer ve ardından kullanıcıya yeniden şifreleyerek (veya HTTP üzerinden) sunar. Bu, kullanıcı proxy üzerinden hassas sitelere girerse, kimlik bilgileri dahil şifresiz verilere proxy operatörünün tam erişimi olduğu anlamına gelir.
- Kayıt tutma: Proxy operatörleri, ziyaret edilen URL'ler, IP adresleri ve potansiyel olarak gönderilen veriler dahil tüm kullanıcı etkinliğini kaydedebilir. Bu, gizlilik avantajlarını ortadan kaldırır.
- Zafiyetler: Kötü yazılmış CGI proxy betikleri, istismar edilebilecek güvenlik zafiyetleri (örneğin XSS, enjeksiyon açıkları) barındırabilir.
- Tespit edilebilirlik ve engellenme: Kendine özgü URL yeniden yazma desenleri ve yaygın betik adları (örneğin
glype/browse.php) nedeniyle CGI proxy'lerin ağ yöneticileri veya hedef siteler tarafından tespit edilip engellenmesi görece kolaydır. - Bant genişliği tüketimi: Proxy sunucusu içeriği hem çekerken hem yeniden sunarken bant genişliği harcar; bu da doğrudan erişime kıyasla trafik yükünü neredeyse iki katına çıkarabilir.
- Çerez yönetimi sorunları: Birden fazla proxy'lenen alan adı arasında çerezleri yönetmek sorunlu olabilir ve oturum sorunlarına veya giriş hatalarına yol açabilir.
Diğer proxy türleriyle karşılaştırma
CGI proxy'ler diğer yaygın proxy teknolojilerinden temelde farklıdır:
| Özellik | CGI Proxy | HTTP/S Proxy | SOCKS Proxy | VPN (Virtual Private Network) |
|---|---|---|---|---|
| Katman | Uygulama (HTTP/HTML) | Uygulama (HTTP/S) | Oturum (TCP/UDP) | Ağ (IP) |
| Yapılandırma | Proxy sitesindeki web formu | Tarayıcı/İS ağ ayarları | İstemci uygulaması/İS ağ ayarları | İS düzeyinde istemci yazılımı |
| İşlenen trafik | HTTP/S (içerik yeniden yazılır) | HTTP/S (ham istekler) | Her türlü TCP/UDP trafiği | Tüm ağ trafiği (İS düzeyinde tünel) |
| Şifreleme | İsteğe bağlı (kullanıcı-proxy; proxy-hedef arası) | İstemci-proxy (HTTPS ise), proxy-hedef | Yok (istemci-proxy) | Uçtan uca (istemci-VPN sunucusu) |
| İçerik değişimi | Evet (URL'leri, betikleri yeniden yazar) | Hayır (şeffaf) | Hayır (şeffaf) | Hayır (şeffaf) |
| Performans | Düşük (yüksek gecikme, işlem yükü) | Yüksek (asgari yük) | Yüksek (asgari yük) | Orta (şifreleme yükü) |
| Kullanım alanı | Temel atlatma, istemci ayarı gerekmez | Web gezintisi, belirli uygulama proxy'si | Genel uygulama proxy'si, P2P, oyun | Tüm ağın şifrelenmesi, coğrafi engel açma, gizlilik |
| Tespit edilebilirlik | Yüksek (belirgin URL desenleri) | Orta (başlıklardan tespit edilebilir) | Düşük (genel trafik) | Düşük (VPN sunucusundan doğrudan bağlantı gibi görünür) |
Gerçekleme ve yaygın yazılımlar
Bir CGI proxy kurmak genellikle CGI betiklerini çalıştıracak şekilde yapılandırılmış bir web sunucusu (örneğin Apache, Nginx) ile PHP veya Perl gibi bir dilde yazılmış bir betik gerektirir.
Çekme ve çıktı verme mantığını gösteren temel bir PHP örneği (URL yeniden yazma olmadan, oldukça basitleştirilmiş):
<?php
// Bu son derece basitleştirilmiş bir örnektir; kritik güvenlik ve yeniden yazma mantığı yoktur.
// Kapsamlı geliştirme yapmadan üretimde kullanmayın.
if (isset($_GET['url'])) {
$target_url = $_GET['url'];
// Temel URL doğrulaması (gerçek bir senaryoda çok daha sağlam olurdu)
if (filter_var($target_url, FILTER_VALIDATE_URL) && preg_match('/^https?:\/\//', $target_url)) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $target_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0); // Başlıkları çıktıdan hariç tut
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // Yönlendirmeleri takip et
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // Tehlikeli, yalnızca örnek amaçlı
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // Tehlikeli, yalnızca örnek amaçlı
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // User-agent'ı ilet
$content = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$content_type = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
curl_close($ch);
if ($content !== false) {
header("Content-Type: " . $content_type);
echo $content;
} else {
http_response_code(500);
echo "Error fetching content.";
}
} else {
http_response_code(400);
echo "Invalid URL provided.";
}
} else {
// URL girişi için basit bir form göster
echo '
<form method="GET" action="">
<input type="text" name="url" placeholder="Enter URL here">
<input type="submit" value="Browse">
</form>';
}
?>
Yaygın açık kaynaklı CGI proxy betikleri şunlardır:
- Glype: Sağlam URL yeniden yazma ve eklenti desteğiyle bilinen, özellik açısından zengin, PHP tabanlı bir proxy betiği.
- PHProxy: Daha basit web tabanlı proxy'leme için sıkça kullanılan bir diğer yaygın PHP proxy betiği.
Bu betikler, modern sitelerle uyumluluğu artırmak için URL yeniden yazma, çerez yönetimi ve başlık iletme karmaşıklıklarını üstlenir. Ancak bunları sürekli gelişen web teknolojilerine ayak uyduracak şekilde bakımlı ve güncel tutmak zor olabilir.
