2013-01-06 21 views
17

Tamam Verilerin PHP sunucumdan sunulduğu bir genel JSONP API'si çalıştırıyorum. Sadece bu makaleyi okuyun: (açıklama okuyunuz)PHP'de U + 2028 veya U + 2029 karakterlerini nasıl değiştirebilirim/bırakma JSONP API'mın sonunu kesmek için

(Unicode paragraf ayırıcısı), bu tam olarak geçerli JSON'dur. Ancak JSONP kullanılırken JSON, JavaScript olarak çalıştırılır ve JavaScript'de hiçbir dize, bir JavaScript U + 2028 veya bir U + 2029 içerebilir. Görünüşe göre bu, uygun bir JSON ayrıştırıcısı kullandığınız sürece sorun değil, ancak JSONP durumunda, tarayıcı , JSON ayrıştırıcısıdır.

Aslında, bu karakterler JSONP verilerimde istemciye gönderilirken dizenin içinde bulunuyorsa, bu, JavaScript'i kesecek ve yürütmeyi durduracak dizeye bir satır veya paragraf kesmesi atacaktır. Bu, API'nın bazı girilen verileri geri göndermesi gibi bir ihtimaldir. Birisi veritabanına potansiyel olarak bir U + 2028 veya bir U + 2029 girebilir, bu yüzden JSONP olarak geri gönderdiğimde, API'm kullanarak herhangi bir uygulamayı bozar.

Sorunuz, PHP'de, müşteriye göndermeden önce, U + 2028 ve U + 2029 karakterlerini silmek veya uzaklaştırmak için JSON verilerinin nasıl sanitize edilebileceğini/çıkarılacağını nasıl açıklayabilirim?

Şu an işlemim bir dizi veri üzerinde json_encode yapıyor ve bu verileri istemciye gönderiyor. Diziden döngü yaparak ve filtreleyerek veriden kaçmalı mıyım yoksa tüm JSON kodlu dizeden tek seferde kaçmalı mıyım?

Diğer şey, PHP'de U + 2028 ve U + 2029 karakterlerinden nasıl kurtulacağından emin değilim. Sadece bir str_replace yapabilir miyim? Str_replace'ın çok baytlı olup olmadığından emin değilim ve özel yapılmış bir tane kullanmazsam no mb_str_replace işlevi var. Peki bu unicode karakterleri nasıl kaldırıyorsunuz/kaçıyorsunuz?

Çok teşekkürler.

+1

Ben, sadece '\ u2028' ile değiştirin olamaz yanlış makaleyi okuyun sürece? – hafichuk

+0

'\ u2028' ve' u2029' unicode yeni satır karakterleridir. Uygulamanızın bu karakterleri dizelere izin vermesini istiyor musunuz? Anlamı, sunucunuzdaki bu metni kabul ederse, CR/LF'yi aktif olarak bu karakterlerden birine dönüştürür çünkü neredeyse hiç kimse yeni satır karakterlerini kullanmaz. Bundan şüphe ediyorum. Sanırım sadece yeni satırları, CR/LF'yi ya da yenilerini ortadan kaldırmak istiyorsunuz. Hangi durumlarda, basit kaçış dizileri eklemek yerine, bunları basitçe ortadan kaldırın. –

cevap

18

Bunu meselesi sürece (o en İdempotent) en az bir kez olduğu gibi değil, "\u2028", "\u2029" ile ya PHP tarafında veya JavaScript tarafında veya her ikisinde U+2028, U+2029 yerini alabilir.

Normal dize değiştirme işlevlerini kullanabilirsiniz. "Çok kanallı güvenli" olmalarına gerek yoktur ve bunu herhangi bir Unicode kodlamasında kolayca yapabilirsiniz (UTF-8, UTF-16, UTF-32 hepsi eşit derecede iyidir). PHP, PHP'nin bir şaka olmasına neden olan bir kez daha neden olduğunu kontrol ettiğim Unicode kaçış dizilerine sahip değildi ama UTF-8 ...

ile ilgili bir çok neden yok.

// Javascript 
data = data.replace("\u2028", "\\u2028").replace("\u2029", "\\u2029"); 

// PHP 
$data = str_replace("\xe2\x80\xa8", '\\u2028', $data); 
$data = str_replace("\xe2\x80\xa9", '\\u2029', $data); 

) olmayan bir baytlı dize işlevini yerine olarak tamamen aynı olurdu Veya PHP Unicode olmayan karakterler kaçar beri sadece, hiç bir şey yapabileceğini -. dize gereksiz olacağından fonksiyonudur yerine varsayılan olarak json_encode():

+1

Mükemmel cevap, teşekkürler! Ben sadece json_encode() kullanarak bırakarak benim için tüm kaçan iş gibi görünüyor. Bu işi yazan kişi iyi işti! – zuallauz

+0

Ama bu UTF-8'i varsayar. Farklı bir karakter kodlaması kullanırsanız bu kırılma olmaz mı? –

+0

Ama bu UTF-8'i varsayar. Farklı bir karakter kodlaması kullanırsanız bu kırılma olmaz. –

0

Bunun artık gerekli olmadığını belirtmek gerekiyor.Varsayılan olarak

, json_encode()tüm ASCII olmayan karakterler kodlar (dahil U + 2028 & U + 2029) ve aynı zamanda bu JSON spec tarafından öncelenmelidir gerek olmamasına rağmen, eğik çizgi kaçar. Kaçmak için hiçbir zararı yoktur ve belirli bağlamlarda daha güvenli olabilir. Yani, varsayılan olarak, bu karakterler zaten kaçtı.

JSON_UNESCAPED_UNICODE sabit çıktı, baytları kaydedebilen çıkışsız Unicode. Ancak, bazı bağlamlarda tehlikeli olabileceğinden dolayı bölü çizgisi karakterinden kaçış olduğu gibi, U + 2028 & U + 2029 da da kaçtı çünkü bazı bağlamlarda da tehlikelidirler. Bu, sorunuzu sorduğunuz anda durum böyle değildi: this feature has been added to PHP more recently.

(Bu ekstra kaçar sırasıyla JSON_UNESCAPED_SLASHES ve JSON_UNESCAPED_LINE_TERMINATORS ile kapatılabilir.)