GET parametrenin değiştirmemesi kimlikleri gizlemek (PHP)

5 Cevap php

Problem:

Ben içerik verilen id göre gösterilmektedir PHP dinamik sayfaları var. Id her zaman bir GET parametresi aracılığıyla teslim edilir:? Page.php id = X Bu bir soruna neden olur: Site ziyaretçileri kimlikleri numaralandırmak ve sadece tüm farklı içerik sayfaları üzerinden yürüyebilir. Bu, tabii ki, mümkün olmamalıdır.

How could this be solved?

Benim yaklaşım daha sonra bir GET parametre olarak kullanılan bağlantıları ve formlarda tüm kimlikleri kodlamak için olduğunu. Her sayfanın başında verilen id veritabanında kullanılan "gerçek" kimliği içine çözülür. Bu iyi bir yaklaşım mı? Eğer başka bir yol seçmek istiyorsunuz?

Possible solution of my approach:

Ben bir baz 38 tamsayı tamsayı id dönüştürmek ve belirli bir liste karakterleriyle basamak yerini alacak. Ben kodlanmış dize kimliği için bu karakterleri kullanırsınız:

a-z 0-9 - _

Siz de diğer karakterler kullanabilir misiniz? Bu karakterler için benim senaryom bu olurdu:

function id2secure($old_number) {
	$alphabet_en = array(0=>'1', 1=>'3', 2=>'5', 3=>'7', 4=>'9', 5=>'0', 6=>'2', 7=>'4', 8=>'6', 9=>'8', 10=>'a', 11=>'c', 12=>'e', 13=>'g', 14=>'i', 15=>'k', 16=>'m', 17=>'o', 18=>'q', 19=>'s', 20=>'u', 21=>'w', 22=>'y', 23=>'b', 24=>'d', 25=>'f', 26=>'h', 27=>'j', 28=>'l', 29=>'n', 30=>'p', 31=>'r', 32=>'t', 33=>'v', 34=>'x', 35=>'z', 36=>'-', 37=>'_');
	$new_number = '';
	while ($old_number > 0) {
		$rest = $old_number%38;
		if (!isset($alphabet_en[$rest])) { return FALSE; }
		$new_number .= $alphabet_en[$rest];
		$old_number = floor($old_number/38);
	}
	$new_number = strrev($new_number);
	return $new_number;
}

Additional question:

Ne benim fonksiyon için ters fonksiyonu olacaktır?

Bana yardımcı olur umarım. Teşekkür ederiz!

5 Cevap

Kullanıcıların Web Sitesi üzerinden sayfalarına alabilir miyim? Cevabınız evet ise, bu gerçekten bir sorun olup olmadığını o zaman kendinize sormalısınız.

Eğer iyi bir hamle olan asla, güvenlik için bilinmezlik dayanarak konum: Eğer değilse o zaman sorun sayfalarınızı güvenliğini değiliz ya da başka bir deyişle olmasıdır.

Benim tavsiyem? Sayfalarınızı güvenli Ya doğru kullanıcıların bu yüzden sadece onlara erişebilir veya bu konuda endişelenmeyin.

Eğer gerçekten bu konuda endişe gerekir, sadece bir sayfa için doğru olması gereken ekstra alan geçmektir. Ben kimliği bu inşa etmem. Eğer veritabanında sayfası girişini oluşturduğunuzda Belki başka bir sayı veya bir GUID oluşturmak. Her iki alanları doğru değilse o sayfayı görüntülemek yok.

Basit bir karakter ikamesi ve diğer naif şaşırtmaca tekniklerini unutun. Bunlar zaman kaybı demektir.

Eğer aynı uzunlukta ardışık olmayan kimlikleri sonra eğer Edit:, UUIDs yerine otomatik artış birincil tuşlarını kullanarak düşünün. Temelde bu uygulama düzeyinde yapılır:

  • (36) char birincil anahtar değiştirme;
  • Lütfen insert deyimi, anahtarını ayarlayın ve MySQL UUID () fonksiyonu ile doldurmak zorunda.

To UUID or not to UUID ? ve UUID as a primary key bir göz atın. (Siz aramaları için karakterler yerine tamsayı kullanarak konum nedeniyle özellikle) bu performans düşüşü ama büyük (1 milyon + satırlar) ya da veri yoksa muhtemelen pratikte bir sorun olmayacaktır.

Kullanın checksum algorithm like Luhn:

$id = 1337;

$_GET['id'] = Luhn($id, 3); // 1337518, adds 3 checkdigits
$_GET['id'] = Luhn_Verify($_GET['id'], 3); // 1337, returns the original number of false if validation fails

echo $_GET['id']; // 1337

EDIT: Ben söylemeyi unuttum, ama bir kimlik bile veritabanı, örnek sorgulamak zorunda olmadan geçerli olup, bu yöntemi kullanarak kontrol edebilirsiniz:

$id = Luhn_Verify($_GET['id'], 3);

if ($id === false)
{
    // someone is trying to guess the ID
}

else
{
    // $id is valid, do the DB stuff here
}

Bu desen tahmin etmek zor olsa da yine de, sırayla, sayfaları üzerinden yürümek mümkün olacaktır. Sürece kök desen sonunda bir sorununuz olacak sıralı olarak (o ilk etapta aslında bir sorun var varsayarak, ve sadece bir şey size fikrini sevmiyorum değil).

Sen kimlikleri için rastgele sayı kullanabilirsiniz. (Bu konularda, yine) o sayfa kimlikleri ve sayfa düzeni kolay tahmin önleyecektir.

Ben, bu "sorun" hakkında rahatsız olmaz, ama yine de benim projeleri böyle yönteminin biri kullanılır:

DB yeni sayfayı kaydettikten sonra, ben oluşturulan md5 of (record_id + page_title) ve özel alana koymak pagecode. Sonra yerine id bu sayfa kodu ile sayfaları erişilebilir. Ve bu veritabanında pagecode alan indeksi daha iyidir.

Site visitors can enumerage the ids and simply walk through all the different content pages. This shouldn't be possible, of course.

Ben neden bu bir sorun olmalı emin değilim - insanlar sadece onlar aracılığıyla Google'da site:domain.com yazarak, ve döngü ile bir web sitesinde tüm (kamu, Googlebot-endeksli) sayfaların bir listesini görebilirsiniz gerektiğini onlar diliyorum. Kullandığınız benzersiz dizin değiştirme değiştirmek olmaz.

Eğer gerçekten ziyaretçilerin doğrudan sayfalara erişmek istemiyorsanız Ancak, basit bir hızlı düzeltme yerine GET POST kullanmaktır.