Nasıl sadece benim web sitesi içerisinde sayfalarından bazı PHP sayfalara erişimi kısıtlayabilirsiniz?

4 Cevap php

Benim web siteme sunulacak benim veritabanından veri alan bir PHP sayfası var. Bu sayfa AJAX denir. Kim bunu istismar ve (örneğin, kendi sunucusu HTTP isteği gönderme) kendisi mümkün olmayacaktır web sitesinden bu verileri not almak isteyen kullanıcılar bunu nasıl sadece benim web sitesi içerisinde sayfalarından ona erişimi kısıtlayabilirsiniz bunu yapmak için?

4 Cevap

JavaScript başka bir sitede çalışan çünkü Same-Origin Policy for XHR sizin sitesine erişmek mümkün olacak. Ama hiçbir şey bir PHP + CURL senaryoyu bina birisi durduruluyor "vekil" kendi sunucusu üzerinde çalışan sanki görünmesi için desteklenen sizin ajax gelen verileri için. Müşterilerine Kara listeye çalışıyor dağınık, ip adresi ucuz ve ücretsiz http vekiller bol miktarda vardır.

Kısacası sizin javascript konusunda özel bir şey yoktur. Bir müşteri ne isterse yapabilir, ve uslu onu zorlayamaz, bu "müşteri site güven" temelidir. Bir hacker tamperdata ya da firebug HTTP isteklerini tespit etmek gibi bir şey kullanabilirsiniz ve o bunları tekrar veya CURL ile onları taklit etmek mümkün olacak.

Sen obfuscating javascript deneyebilirsiniz. Ama günün sonunda, bir saldırganın sadece http isteği tekrar gidiyor, ve bu konuda yapabileceği bir şey var kesinlikle.

Bu ben ne olduğunu,

  1. Kendi web sitesinde, gizli bir dize oluşturun. Ben HMAC (anahtar $ _SERVER ['REMOTE_ADDR']) kullanın.
  2. Javascript var içinde gizli yazın.
  3. AJAX çağrısı üzerine, bir parametre olarak bu dizesi iletirsiniz.
  4. AJAX sunucu üzerinde, yine karma yapmak. Bu parametre ile eşleşen varsa, çağrı sayfanızdan olduğunu.

EDIT: Kod örnekleri,

Web sitenize, bunu,

$key = 'supersecretkey'; // This is your security, don't expose this
$nonce = rand();
$timestamp = time();
$signature = hash_hmac('sha1', $_SERVER['REMOTE_ADDR'] . $nonce . $timestamp, $key);

Sayfaya değişkenler yazdırın,

<script type="text/javascript">
<?php
echo "  var signature = '" . $signature . "';\n";
echo "  var nonce = '" . $nonce . "';\n";   
echo "  var timestamp = '" . $timestamp . "';\n";
?>
</script>

AJAX arama yaptığınızda, sunucu 3 parametreleri geçirmek,

  http://example.com?signature=...&nonce=...&timestamp=...

AJAX sunucu üzerinde, tekrar hesaplama yapmak,

$key = 'supersecretkey'; // This is your security, don't expose this
$nonce = $_REQUEST['nonce'];
$timestamp = $_REQUEST['timestamp'];
$signature = hash_hmac('sha1', $_SERVER['REMOTE_ADDR'] . $nonce . $timestamp, $key);

if ($signature == $_REQUEST['signature'])
   // the call if from my page.

Ayrıca replay (oturum veya veri mağaza gerekir) için para ve seferlik damgası Çek değildir olabilir.

Yukarıda belirtildiği gibi, bu gerçekten yapılamaz, kimlik doğrulama şeması çeşit yeniden ve uygulamak gerekir, ancak bu bile taklit edilebilir. Kısa cevap, bir web tarayıcısı erişebilirsiniz eğer o şey gibi uzun bir tarayıcı gibi davrandığı olarak ulaşabiliyor.

Böyle Referer'a ve User-Agent HTTP başlık alanları doğrulayarak, ve AJAX çağrıları oturum doğrulama uygulanması gibi birisi için zor yapmak için yapabileceği şeyler vardır.

Bu temel ihtiyacı olan bir hizmet, sadece dahili bir şey vs, başkalarının erişimine izin olup olmayacağı, ne olduğuna bağlı olarak çeşitli seçenekler vardır. Burada bazı seçenekler iyi derinlemesine bir açıklama ile bir makale.

http://java.sun.com/developer/technicalArticles/J2EE/usingapikeys/