Güvenle PHP diziye kullanıcı tarafından sağlanan dizi dize dönüştürmek?

4 Cevap php

Kullanıcılar parametreleri PHP dizi girmek gerekiyor.

Şu anda, onlar bir dizi tanımlar PHP kodu girmek için beklenen bir metin alanı görürsünüz:

<textarea name="foo">
$bar = array( 'key' => 'value' );
</textarea>

Örneğin ben olarak metin alanının değerini, string $ _GET ['foo'] olsun.

Ben dizi $ çubuğunu kullanın böylece nasıl bu ayrıştırmak? Ben yardımcı olabilir eğer ben değil eval kullanmak istemem.

Teşekkürler!

4 Cevap

Kesinlikle kullanıcı bu şekilde dizi tanımlamak gerekiyorsa, bunları json olarak tanımlamak izin vererek çok daha iyi olacaktır. Bu dönüştürmek kolay ve php kodu gibi Lex zorunda kalmazsınız; eval çok daha güvenlidir. Artı, json dizileri tanımlamak için hafif ve kolay bir yoludur, bu yüzden de onlar için güzel bir kullanıcı deneyimi olacak :)

Garip oh. Evet eval sakınmak, bu sorun için soruyor. Ben muhtemelen sadece giriş uygun formatta olduğunu doğrulamak için bir karakter-karakter ayrıştırma fonksiyonu yazmak, ve sonra 'anahtar' ve 'değer' ulaşmamın ve dizi bu şekilde inşa etmek php dize işleme fonksiyonlarını kullanmak istiyorum.

Ben bunu size açıklayan amaç için tam olduğundan, eval kullanmak istemiyorum emin değilim. Ancak, kullanıcı girişi eval'ing çok tehlikeli olduğundan, neden bunu önlemek için çalışıyor olmasıdır? Eğer öyleyse, tek seçenek olasılıkla $_GET['foo'], herhangi bir tehlikeli veya istenmeyen kodu kaldırmak, ve sonra eval bunu değerini ayrıştırmak olacaktır.

[Edit] - Yeni cevap

Şimdi giriş dizisi tabanlı veri kullanıcı için basit bir çözüm gerekiyorsa ben bunu düşünüyorum, en parse_ini_string bak - http://us3.php.net/parse_ini_string. Bu aşağıdaki biçimde bir dize almak ve size bir ilişkisel dizi verecektir. Eğer ihtiyacınız varsa bile, çok-boyutlu diziler kullanabilirsiniz.

one = 1
five = 5
animal = BIRD
phpversion[] = "5.0"
phpversion[] = "5.1"
phpversion[] = "5.2"
phpversion[] = "5.3"

Kullanma parse_str() is the best option if you don't want to use eval(),

$str = 'first=value&arr[]=foo+bar&arr[]=baz';

parse_str($str, $arr);

echo $arr['first'];  // value
echo $arr['arr'][0]; // foo bar
echo $arr['arr'][2]; // baz

tokenizer fonksiyonlar da bir seçenek olabilir, ancak daha karmaşık olacak.