php - lineer olmayan adresler oluşturmak

9 Cevap

Update:

Ok.. I have read a lot of solutions... Thank you so much everybody. I think I will keep it simple and avoid the encryption and just rely on two fields matching in the database. I can keep the id as it is (sequential) but add for example a timestamp (with : removed). Then I can put both through the youtube style url generator... leaving me with a really short, unique and not easily guessed url. e.g

youtube url gen önce blah.com? id = 10345 & s = 134025

blah.com? id = H2s & s = tL2s sonra

I log the unique views to each id anyway... so I will record unsucessful ones too and if a user hits 10 non matching url's in an hour then I can block his ip (I know a proxy will evade this...but it makes it more difficult).

Sen ne düşünüyorsun?

Bu tuhaf bir soru, bir parça gibi gelebilir ... ne elde etmek için arıyorum tahmin veya hesaplanan edilemez bir url kullanılacak bir kimliği oluşturmak için bir yoldur. Demek istediğim id = 1, = 2 id değil mi ...

Ben youtube tarzı komut bakıyordu here. Hangi dolgu seçeneği vardır, ama dolgu wTTTa ve b666o gibi adresler ile çok açıktır. Ben MD5 id ing kabul ... ama neredeyse kusursuz şu ve oldukça uzun URL'ler için yapar.

Çözelti url bazlı (çerez veya oturum tabanlı olamaz) olmalı ve panik ve benim yönetici sayfasını güvenli bir şekilde çalışmak için çalışıyorum düşünüyorum önce - i, ben geliştiriyorum bir oyun onun bir parçası değilim.

9 Cevap

Herhalde damga MD5'ing sonra, bir zaman damgası alarak bu mücadele, ve sonra (sizin tercihinize bağlı) son 4-8 karakterleri almak için substr () çalışıyor olacaktır. Zaten ID teklik garanti (basit MySQL tablo ile) oluşturulmuş olanlar ile oluşturulan kimliğini karşılaştırın.

Ayrıca daha da benzersizliğini artırmak için tuz kimliği ile zaman damgası, ya da kimliği bir MD5 ile isteyebilirsiniz.

Ne id ve rastgele bir dize md5 eğer

$id = md5( $id . uniqid( mt_rand(), true ) );

İşte bu tahmin edilemeyen yapmak gerekir.

Sonra bu id olup olmadığını görmek için veritabanı kontrol.

$db = mysql_connect('localhost', 'username', 'password');
mysql_select_db( 'table' );
$id = 223;

do {

    $unique_id = substr( md5( $id . uniqid( mt_rand(), true ) ), 0, 8 );
    $q = mysql_query( sprintf( "select id from ids where id='%s'", intval($unique_id) ) );
    $c = mysql_num_rows( $q );

} while ( $c > 0 );

echo $unique_id;

Id karakter sayısını sınırlayacak ederken, benzersizliğini garanti etmenin tek yolu

Sadece bu sınıftan () rasgele kullanın

https://gallery.svn.sourceforge.net/svnroot/gallery/trunk/eval/gx/kohana/kohana/helpers/text.php

Farklı formatta rasgele dizeleri oluşturur. Sadece kimliği olarak kullanabiliriz. Benim URL kullanmak,

  random('distinct', 10)

Eğer benzersiz olmak istiyorsanız, ben size bir şekilde bunu karma zorunda gidiyoruz düşünüyorum. Sen sayfasında (örneğin başlık) bazı diğer tanımlayıcı ile sıralı id bağlamak olabilir.

ne salyangozlar? kullanmayla ilgili, biz hep kurşunla kimlikleri yerine, bu yüzden kullanıcılar ve arama motorları için ve aynı zamanda DB anahtarları uzak vermez hem de güzel URL'ler var.

"php-üretmek-non-lineer-URL'ler:" salyangozlar bu çok aynı sorunun bir benzeri normalize ve eşsiz dizeleri

Ben bir PHP adam değilim, ama rastgele oluşturulmuş GUID gerekir gibi geliyor.

This could help ama çıktı karmaşıklığı çok emin değilim.

Alternatif olarak, PHP biri varsa rastgele bir dize jeneratör deneyebilirsiniz, ya da bir rasgele sayı üreteci kullanarak kendi rulo olabilir. % 100 garanti teklik isterseniz, muhtemelen bir look-up tablosu istiyorsanız, ya da millis geçerli tarih / zaman bazı ifadesi olur.

SugarCRM gelen create_guid bir göz () atın.

It really create unique id's. It's in include/utils.php (a round line 1300)

Sen bir "tahmin edilemeyen anahtarı" oluşturmak gerekiyor. Eğer base64 karakter 20 (ya da 12 ya da öylesine) karakterler oluşturmak varsa, çoğu sistemler için sadece para cezası olmalıdır.

Onunla rahat olduğundan emin olmak için temel matematik ile çalışın. 64 ^ 20 olası anahtarları önüne alındığında, ne kadar geçerli bir takılmaları bir hacker alacak? Peki, kaç onlar saniyede tahmin edebilir, ve kaç olacak? Birçok site URL'leri sağlamak için bu tekniği kullanın.

Bu kullanarak bazı tavsiyeler:

  • Ben bir şekilde bu "geçici" yapabilir olmadığını düşünmek istiyorum. Belki de sadece bir ay için var olmalıdır, ya da daha sonra bir kaç ay, ve yaratıcısı tarafından yenilenmesi gerekir?
  • Ben sizin veritabanında düzenli kimlikleri tutmanızı öneririz, ve kayıtları erişebileceğiniz bir ikinci anahtar olarak eklersiniz. Bu uygun olacağından içten, sequencial kimlikleri kullanın ve URL'leri üreten ve işlerken sadece tahmin edilemeyen tuşlarını kullanın.

Yukarıdaki bağlantıları gibi bir şey kullanmak CAN:

http://www.oreillynet.com/pub/a/php/2002/12/05/one%5Ftime%5FURLs.html

(Ruby ve Java, PHP konusunda emin değilim. Bunun için kütüphaneler vardır. Bak http://api.rubyonrails.org/classes/ActiveSupport/SecureRandom.html.)