Test dize URL PHP kodlanmış ise

9 Cevap php

Hey guys, ben PHP Dokümanlar aracılığıyla baktım ve bu ile ilgisi göremiyorum, bu yüzden bir dize URL kodlanmış olup olmadığını nasıl test edebilirim? O değil kodlanmış olacaktır karakterler için dize aramak ve sonra herhangi biri eğer onun kodlanmış değil, ya da ben yaptım böyle bir şey kullanmak daha iyidir


function is_urlEncoded($string){
 $test_string = $string;
 while(urldecode($test_string) != $test_string){
  $test_string = urldecode($test_string);
 }
 return (urlencode($test_string) == $string)?True:False; 
}

$t = "Hello World > how are you?";
if(is_urlEncoded($sreq)){
 print "Was Encoded.\n";
}else{
 print "Not Encoded.\n";
 print "Should be ".urlencode($sreq)."\n";
}

Çalıştığı, ancak durumlarda bu oluşabilir değil nerede


$t = "Hello%2BWorld%2B%253E%2Bhow%2Bare%2Byou%253F";

Yani dize iki kat belki bu dize kodlanmış veya olmuştur nerede


$t = "Hello+World%2B%253E%2Bhow%2Bare%2Byou%253F";

Yani burada en çok iki misli bir alan dışında, kodlanmış olmuştur. (Evet bu dize hiç ortaya ne zaman bilmiyorum, ama asla bilemezsiniz)

9 Cevap

Bir dize URL-kodlanmış ya da bunun içinde dizisini %2B olması gerekiyordu eğer. Eğer kesin olarak biliyorum asla Bunun yerine, muhtemelen dize geldi nereye bağlıdır, öyleydi yani eğer el yapımı ya da uygulama.

O değil kodlanmış olacaktır karakterler için dize aramak için daha iyi olduğunu ve herhangi bir sonra varsa onun kodlanmış değil.

Ben (uygulama arkasında kodlanmamış karakterini terk etmezdi varsayarak) programlı yapılmış şeyler dikkat çekmek, çünkü bu, daha iyi bir yaklaşım olduğunu düşünüyorum.

Bu nihai değer mevcut olacak eğer özel bir karakter olduğu için burada kafa karıştırıcı olacak bir şey ... Teknik olarak, %, kodlanmış "olmalıdır". Sen-olmalı-kodlanmış karakterleri aramak yanı sıra hiçbiri bulunursa dize başarıyla deşifre ettiği doğrulama için yaklaşımlar birleştirmek zorunda kalabilirsiniz.

ben bir hile var:

you can do this to prevent doubly encode. Every time first decode then again encode;

$string = urldecode($string);

Sonra tekrar yapmak

$string = urlencode($string);

Bu şekilde gerçekleştirme biz çift kodlamak önleyebilirsiniz :)

Kodlama sürecinde aynı kalmak dizeleri olduğu gibi bunu yapmak için güvenilir bir yol var, yani kodlanmış "abc" veya değil? Net bir cevap yok. Karşılaştığınız gibi Ayrıca, bazı karakterler birden kodlamalar ... Ama ...

Sizin decode-check-encode-kontrol düzeni nedeniyle bazı karakterler birden fazla şekilde kodlanmış olabilir aslında başarısız. Ancak, işlevi hafif bir değişiklik yaparsa, bu kodlanmış, decode dize değiştirir eğer sadece kontrol, oldukça güvenilir olmalıdır.

"10 +20 = 30" döner gibi, elbette aptal kanıt olmayacak true (+ alana dönüştürülmüş olur), ama biz aslında sadece aritmetik yapıyoruz. Ben mükemmel bir çözüm var sanmıyorum söylemek için üzgünüm, bu şema karşı çalışıyor konum ne olduğunu varsayalım.

HTH.

Edit:
As I entioned in my own comment (just reiterating here for clarity), a good compromise would probably be to check for invalid characters in your url (e.g. space), and if there are some it's not encoded. If there are none, try to decode and see if the string changes. This still won't handle the arithmetic above (which is impossible), but it'll hopefully be sufficient.

Ben bunu yapmak için hiçbir kusursuz bir yolu olduğunu düşünüyorum. Örneğin, aşağıdakileri dikkate alın:

$t = "A+B";

"AB" veya kodlanmış bir URL o, "A% 2BB" kodlanmış gerekiyor olmadığını mı?

iyi, terim "kodlanmış url" biraz belirsiz, belki de basit bir regex onay kandırmasına yapacak

$is_encoded = preg_match('~%[0-9A-F]{2}~i', $string);

Ne hakkında:

if (urldecode(trim($url)) == trim($url)) { $url_form = 'decoded'; }
  else { $url_form = 'encoded'; }

Çift kodlama ile çalışmak ama bu herhalde zaten kapsam dışında değil mi?

bir değişken göndermek bayrakları zaten bir url den veri alma çözecektir.

?path=folder/new%20file.txt&decode=1

Burada ben sadece araya bir şeydir.

if ( urlencode(urldecode($data)) === $data){
    echo '$data is urlencoded';
} else {
    echo '$data is NOT urlencoded';
}

Ben dizeleri urlencoded olup olmadığını görmek için aşağıdaki testi kullanıyorum:

if(urlencode($str) != str_replace(['%','+'], ['%25','%2B'], $str))

Bir dize zaten urlencoded olmuşsa, çift kodlama tarafından değiştirildi edecek tek karakterler% (tüm kodlanmış karakter dizeleri başladığı) ve + (boşluk yerine geçer.) Onları geri değiştirin ve özgün dize olmalıdır.

Bu sizin için çalışır varsa bana bildirin.