Bir URL içinde 1 içine birden Değişkenler

6 Cevap php

Ben bir URL karşısında geçirilen argümanların bir listesini arıyorum.

$url['key1']=1;
$url['key2']=2;
$url['key3']=3;
$url['key4']=4;
$url['key5']=5;
$url['key6']=6;
$url['key7']=7;

Ben 1 GET değişkeni içinde URL bu geçirmek için çalışıyorum dikkat edin. Ben bunu daha iyi vs? Anahtar1 = 1 & key2 = 2 & KEY3 = 3 ... ama denemek ve bu formatta olamaz açıklamak için çok karmaşık nedenlerle yapılabilir biliyorum.

Herhangi bir URL dizesinde 1 olsun var olarak kabul edilebilir bir şey içine bu diziyi dönüştürme nasıl bir öneriniz?

Şimdiden teşekkürler.

6 Cevap

Kullanmak için tavsiye serialize() iyi. Alan bir sorun varsa, o zaman bzcompress() ve serialize() bir arada kullanın.

Ancak, o kadar getirilmiş değil düşünen bir güvenlik var, o da son kullanıcı (kim bu url görebilir ve düzenleyebilirsiniz) içindeki verileri manipüle olabilir bu. Bunu zor olduğunu düşünüyorum, ama vahşi PHP-saldıran solucanlar çoğu bazı lisans veya başka bunu.

Kullanıcı doğrudan any tuşları veya değerler (veya bir tamsayı, ya da bir nesne, ya da başka bir şey ile değiştirilmesi) işlemek izin varsa, o zaman bu saldırıdan komut (ve kullanıcıların) korumak gerekir.

Basit bir çözüm sadece paylaşılan bir sır kullanmaktır. Bu herhangi bir şey olabilir; sadece çok uzun benzersiz ve gerçekten sır olarak (belki de rastgele kurulum süresi de bunu oluşturmak gerekir). Diyelim ki, bu gibi yapılandırma dosyası bir şey var diyelim:

define('SECRET', 'unoqetbioqtnioqrntbioqt');

Ardından, dijital ile oluşturulan seri hale verileri oturum açabilirsiniz: $s=serialize($m) ile $k=sha1($s.SECRET) ve url değeri yapmak $k.$s

Ardından, önce unserialize() bunu:

$v=substr($input,0,40);
$s=substr($input,40);
if ($v != sha1($s.SECRET)) { die("invalid input"); }
$m=unserialize($s);

Bu şekilde, $m Eğer tefrika özgün değeri olarak aynı olduğunu biliyoruz.

Eğer isterseniz, aşağıdaki-düşüş değiştirmeler kullanabilirsiniz:

define('SECRET','buh9tnb1094tib014'); // make sure you pick something else
function secureserialize($o) {
  $s=serialize($o);
  return sha1($s.SECRET).$s;
}
function secureunserialize($i) {
  $v=substr($i,0,40);$s=substr($i,40);
  if ($v!=sha1($s.SECRET)){die("invalid input");}
  return unserialize($s);
}

Eğer olabilir serialize them as key-value pairs when constructing the URL, putting the resultant serialized value in a single $_GET değişken (örneğin, data=sfsdfasdf98sdfasdf), sonra da unserialize the $_GET["data"] değişken. Kullanmak gerekir urlencode to make sure the resultant serialized values are URL-safe. Make sure you watch out for maximum URL lengths - 2083 characters in IE.

Eğer really (sorunuzun başına) URL'leri anahtar-değer çiftleri kullanamazsınız sürece Ancak, key1=foo&key2=bar... gitmek için yolu kesinlikle.

Eğer anahtar adları bırakarak sakıncası yoksa, kullanabilirsiniz

http://example.com?url[]=1&url[]=2&url[]=3

EDIT anahtar adları tutulması:

http://example.com?values[]=1&values[]=2&values[]=3&keys[]=1&keys[]=2&keys[]=3

Sonra PHP komut:

$url = array_combine($_GET['keys'], $_GET['values']);

Eğer bir HTML çerez olarak verileri kaydederek sorunu çözmek olabilir? Bu şekilde tüm URL'sini değiştirmeniz gerekmez.

Eğer önceden değerlerini biliyorsanız bunu hedef bağlantı ile kullanıcıya sayfa göndermek zaman, sunucu tarafında onları ayarlayabilirsiniz.

If you won't know the values until the user fills out a form it can still be done using JavascriptL When the user clicks the form submit you can set multiple cookies by making multiple javascript calls like: document.cookie = 'key1=test; expires=Mon, 7 Sept 2009 23:47:11 UTC; path=/'

Eğer olsa başka bir etki alanından bu verileri geçmek için çalışıyorsanız güvenlik modeli biraz sıkıntı verebilir.