PHP'de Referer Belirleme


102

Geçerli sayfanın hangi sayfanın gönderildiğini veya çağrıldığını (AJAX aracılığıyla) belirlemenin en güvenilir ve güvenli yolu nedir? $_SERVER['HTTP_REFERER']Güvenilirliğinden (eksikliğinden) dolayı kullanmak istemiyorum ve çağrılan sayfanın yalnızca sitemden gelen isteklerden gelmesi gerekiyor.

Düzenleme: Web sitemdeki bir sayfadan bir dizi eylemi önceden oluşturan bir komut dosyasının çağrıldığını doğrulamak istiyorum.


5
Neden $ _SERVER ['HTTP_REFERER'] güvenilir değil diyorsunuz?
Milan Babuškov

9
PHP uygulaması güvenilirdir. Sorun şu ki, hiçbir tarayıcı bunu göndermiyor ve isterseniz onu değiştirebilirsiniz. Dolayısıyla, müşteri açısından doğru olan güvenilir değildir.
Biri

2
Olası bir yol, sayfanızın bir alanına benzersiz bir anahtar (örneğin bir GUID) koymak ve sonraki istekte bunu geri göndermektir.
PhiLho

Sunucunun IP adresini bulun ve kullanın $_SERVER[REMOTE_ADDR].

Yanıtlar:


93

REFERER, istemcinin tarayıcısı tarafından HTTP protokolünün bir parçası olarak gönderilir ve bu nedenle gerçekten güvenilmezdir. Orada olmayabilir, sahte olabilir, güvenlik nedenleriyle güvenemezsiniz.

Sitenizden bir talep gelip gelmediğini doğrulamak istiyorsanız, bunu yapamazsınız, ancak kullanıcının sitenize gittiğini ve / veya kimliğinin doğrulandığını doğrulayabilirsiniz. Çerezler, buna güvenebilmeniz için AJAX istekleriyle gönderilir.


5
Bu yöntemi kullanmak istiyorsanız, CSRF en.wikipedia.org/wiki/Cross-site_request_forgery
JD Isaacks

17
İdeal olarak, CSRF saldırılarını önlemek için kullanıcı başına oturum başına (paranoyaksanız istek başına) benzersiz bir belirteç kullanmanız gerekir. Yönlendireni kontrol etmek sadece gizleme yoluyla güvenliktir ve tam anlamıyla gerçek bir çözüm değildir.
Seldaek

3
@ Seldaek hayır, yönlendireni kontrol etmek 'gizleme yoluyla güvenlik' değildir. Kurbanın tarayıcısı tarafından gönderilen Yönlendireni kontrol edemez bir CSRF saldırısı gerçekleştirmek için çalışıyor Saldırgan, bu nedenle kontrol yapar CSRF'e karşı korumak. Bununla birlikte, bunun yerine bir CSRF belirteci kullanmanız gerektiği sonucuna sahip olacağım, çünkü başvuru denetimi yaklaşımının, sitenizde açık bir yeniden yönlendirmeniz varsa sizi savunmasız bırakma ve yönlendireni soyan kullanıcı aracılarını kırma gibi dezavantajları vardır .
Mark Amery

@MarkAmery her şey neye karşı savunmaya çalıştığınıza bağlıdır, ancak istemciye özgü http başlıklarını kullanmak genel olarak çok güçlü bir güvenlik modeli değildir.
Seldaek

23

En iyi bulduğum şey bir CSRF belirtecidir ve yönlendireni doğrulamanız gereken bağlantılar için oturumda kaydedin.

Dolayısıyla, bir FB geri araması oluşturuyorsanız, o zaman şuna benzer:

$token = uniqid(mt_rand(), TRUE);
$_SESSION['token'] = $token;
$url = "http://example.com/index.php?token={$token}";

Sonra index.php şöyle görünecek:

if(empty($_GET['token']) || $_GET['token'] !== $_SESSION['token'])
{
    show_404();
} 

//Continue with the rest of code

Tüm güvenli sayfaları için buna eşdeğer olan güvenli siteler biliyorum.


1
İşte CSRF belirteçleri hakkında daha fazla bilgi için bir bağlantı: en.wikipedia.org/wiki/Cross-site_request_forgery
We0

7
Öyle olduğundan emin misin, $_GET['token'] == $_SESSION['token']değil $_GET['token'] !== $_SESSION['token']mi?
Timo Huovinen

17

Kullanılması $ _SERVER [ 'HTTP_REFERER']

Kullanıcı aracısını geçerli sayfaya yönlendiren sayfanın (varsa) adresi. Bu, kullanıcı aracısı tarafından belirlenir. Tüm kullanıcı aracıları bunu ayarlamaz ve bazıları HTTP_REFERER'ı bir özellik olarak değiştirme yeteneği sağlar. Kısacası, gerçekten güvenilemez.

if (!empty($_SERVER['HTTP_REFERER'])) {
    header("Location: " . $_SERVER['HTTP_REFERER']);
} else {
    header("Location: index.php");
}
exit;

0

Bunu kontrol etmenin güvenilir bir yolu yok. Size nereden geldiğini söylemek gerçekten müşterinin elinde. Web sitenizin yalnızca bazı sayfalarına yerleştirilen çerez veya oturum bilgilerini kullanmayı hayal edebilirsiniz, ancak bunu yapmak kullanıcı deneyimini yer imleriyle bozabilir.


0

Tüm sahte yönlendirici problemlerini okuduktan sonra tek bir seçeneğimiz kaldı: Örneğin, yönlendiren olarak izlemek istediğimiz sayfa oturumda tutulmalı ve ajax çağrıldığında yönlendiren sayfa değerine sahip olup olmadığını kontrol etmeli ve eylemi başka türlü yapmamalı aksiyon.

Öte yandan, farklı bir sayfa talep ederken, yönlendiren oturum değerini null yapın.

Oturum değişkeninin yalnızca arzu sayfası isteğinde ayarlandığını unutmayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.