Nasıl bir $ _GET değişken daha PHP sağlanacak gizleyebilirsiniz?

11 Cevap

Şimdiye kadar tüm siteler bir sayfa için veri elde etmek için çoğunlukla $ _GET kullanabilirsin.

Ex:

editad.php?posting_id=131

editaccount.php?user_id=2

-> Kullanıcı görebilirsiniz hakkında daha güvenli gizlemek veya olmak için bir yolu var mı? Onları URL türünü "editad.php? Posting_id = 40" demek için sadece mümkün istemiyorum. Ben DİREKLERİ kullanabilirsiniz biliyorum, ama değil GETler ya da bir yolu var mı?

-->I pass along data through a GET, then validating that data by checking if the user's id is equal to the page's user's id. If they are equal, it would allow the user to edit that page, if not, it would only show that page. I also make sure a number is a number, a string a string, etc. Is there any other way to make it more secure?

11 Cevap

_GET böyle sorgu parametrelerini geçen ile yanlış bir şey yok. _POST Artık güvenli.

Bir kullanıcı reklam 31 reklamı 30 düzenlemek değil, mümkün ise, kodunuzu bu kuralları uygulamak gerekiyor.

Hayır, $ _GET ile bunu yapamaz. Bilinmezlik * aracılığıyla güvenliği elde etmek için, $ _POST değişkeni kullanabilirsiniz, ancak $ _POST aynı zamanda güvensiz (ve kullanıcı tarafından değiştirilebilir). Her zaman $ _GET veya $ _POST kullanmak ister ne olursa olsun, gelen verileri doğrulamak ve kullanıcı veri erişimi için izin emin olmalıdır.

* Bu sadece rahip olmayan kimse için karanlık olacaktır. Bu herhangi bir ilgi programcı / hacker hemen şeffaf olacak.

Gizlice veri güvenliğini sağlamak için tek yol https:// üzerinde POST kullanmaktır.

Ancak, kullanıcının kolayca GET ve POST veri için değiştirebilirsiniz beri, user dan korumak için hiçbir yolu yoktur.

Güvenlik hakkında konuşmak, aşağıdakilerden birini kullanarak düşünebilirsiniz:

  1. Değişkenleri geçmek için oturumu kullanın
  2. Geçilecek url tuz + karma anahtarı ekleyin.

sender :

$hashedKey = sha1( $salt + 'posting_id=131' );
editad.php?posting_id=131&$key=$hashedKey; 

receiver :

$params = getUrlParams();
$hashedKey = sha1( $salt + params );

if ( $_POST['$key'] == $hashedKey ) 
   continue; 
else 
    displayError();

Eğer POST kullanmak, kendi soru * yanıtladı.

  • Ancak, "daha güvenli" ile ne demek emin değilim. Bir web sayfası, kaynak bakabilirsiniz ve anahtar / değer çiftleri forma nakledilen görmek.

Eğer kullanıcı parametrelerini gizlemek istiyorsanız, her zaman verilerinizi seri ve sorguda şifrelenmiş bir dize geçebileceği. POST güvenliğini artırmak değil ve sunucuya veri gönderme değilse kullanılmamalıdır.

Uygulamanıza bağlı olarak, hatta şifreleme yeterli olmadığını unutmayın. Eğer bir güvenlik belirteci geçiyoruz eğer içeriğine bakmak değil ve bir kaç başka şeylerin yanı sıra https kullanmak gerekir Örneğin, hatta çalmak için yeterince kolay. Ama bu solucanlar tamamen farklı bir kutu bulunuyor.

Belki yerine bu bilgileri izlemek için oturum durumunu kullanabilirsiniz. PHP sizin için oturum durumunu yönetecek fonksiyonları inbuilt etti.

Oturum bilgileri sadece sunucuda depolanan gibi kullanıcıların bu göremiyorum.

Sonra temelde erişmek ve $ _SESSION dizisini kullanarak bilgi deposu olabilir.

Ben burada sadece Oturum durumu hakkında google bulunan bazı web siteleri:

Firefox ve Firebug bu çağda o URL ile, özellikle eğer değerler sayfadan diğerine geçirilen ne gizlemek için o kadar kolay değil ...

Herhangi bir "ilgili taraflar" gözetlemek ve sayfa aslında nasıl bakmak tarayıcılar ile birlikte gelen geliştirici araçlarını kullanabilirsiniz ....

Tek çözüm, diğerleri yukarıda önerilen yalnızca geliştiriciler nasıl çalıştığını biliyorum ki bazı marifet ile kullanıcının kimliğini gösterir bölümünü şifrelemek için ....

Örnek: Neden .... 'user_id' olarak geçmek? 'Cxv = 32' olarak geçen deneyin ... Ayrıca en azından bu can ... Bu URL herhangi bir teşebbüs değişiklik vermeyebilir .. bir sonraki sayfada geri şifresini sonra bazı algoritması ile gerçek id şifreleyebilir ve zor olun ...!

Sadece hayal gücünüzü kullanın ...! ;)

Insanlar henüz bahsedilmeyen bir şey burada PHP uzantısı Suhosin kullanılmasıdır. Sen Suhosin takarak PHP'nin superglobals bilinen güvenlik delikleri bir dizi düzeltmek, ve ayrıca, $_GET her biri için maksimum dizi uzunluğu / derinlik / boyutunu kontrol edebilirsiniz, {[(3) }] vb Ayrıca oturum verilerinin şeffaf şifreleme sağlar. Standart suhosin.ini yapılandırma dosyasından alıntı:

The encryption key used consists of [a] user defined string (which can be altered by a script via ini_set()) and optionally the User-Agent, the Document-Root and 0-4 Octects [sic] of the REMOTE_ADDR.

Transport katmanında şifreleme kullanmadan bilgi kaybına karşı korumak için kılmanın bir yolu var gibi Suhosin hala, HTTPS üzerinden $_SESSION ile kullanılmalıdır. Ve (kullanıcıya yarı-benzersiz bir şey kullanarak ve belki zaman veya tarih çok) oturum verilerini kendisi şifrelemek için Suhosin 'ın yöntemine benzer bir şey ile oturum kimliği tuz gerekir.

Biraz daha güvenli olması için bir yolu yerine düz metin kullanıcı kimliği rastgele bir session id kullanmaktır. Bir kullanıcı günlükleri kez 41b96964c35747e19019d2d0f2efb0d1 gibi bir şey yaratmak ve kullanıcıyı tanımlamak için oturumu için kullanabilirsiniz. Bu şekilde başka bir kullanıcı sadece bir sonraki id tahmin edemez.

Ne genellikle bunu ona urldecode (sadece ham değerini almak için) ve daha sonra bu fonksiyonu çalıştırmak

function safedata($original) {
 return stripslashes(strip_tags(htmlspecialchars(trim($original))));
}

Bir cazibe gibi çalışır. Zaten bir veritabanına bağlı iseniz Ayrıca, işlevine mysql_real_escape_string () ekleyebilirsiniz.