Nasıl sorgu dizeleri eğik kabul Apache / PHP yapılandırmak mı?

7 Cevap php

PHP iki Apache sunucuları çalışan var. Bir sorgu dizesinde ileri eğik kabul eder ve örneğin, beklenen şekilde PHP için birlikte geçer:

http://server/index.php?url=http://foo.bar

çalışır ve PHP bu ifade doğrudur:

$_REQUEST['url'] == "http://foo.bar"

Ancak, other Apache sunucu, bir 403 Forbidden hata aynı URL sonuçlar! Sorgu dizesi doğru (yani yerine ileriye eğik çizgi {[) (2]}) ile URL kaçan ise, o zaman her şey çalıştığını unutmayın.

Açıkçası orada bu neden Apache ya da PHP yapılandırmasında bazı farklar var, ama ne anlamaya olamaz!

Ben, onu reddetmek değil, her iki durumda URL accept bu formu istiyorum.

7 Cevap

http://server/index.php?url=http://foo.bar geçerli bir url değildir. Sen bölü kodlamak zorunda. Ben tarayıcılar automagically bunu düşünüyorum, belki farklı tarayıcılar ile test edildi?

Ya da belki AllowEncodedSlashes ayardır?

Burada birkaç mesaj OP'ın kullanılması yanlış olan, yanlış olduğunu düşündürmektedir.

Sam152 yorumuna genişletilmesi, sorgu dizeleri hem içeren izin verilir? ve / karakterleri, temelde Tim Berners-Lee ve web nasıl çalışması gerektiğini düzenleyen arkadaşlar tarafından yazılmış spec http://www.ietf.org/rfc/rfc3986.txt bölüm 3.4, bkz.

Sorun şu ki, kötü yazılmış (ya da kötü yapılandırılmış, ya da yanlış) ayrıştırıcılarda sorgu dizesi yol bileşenlerinin ayrılması gibi eğik yorumlamak olduğunu.

Ben URL ayrıştırmak için kullanılan PHP'nin pathinfo fonksiyonu örneklerini gördük. Pathinfo bir URL ayrıştırma yazılı değildi. Ancak parse_url sonra yoldan ayrıntıları almak için fileinfo kullanmak kullanarak yolunu elde edebilirsiniz. Bunu parse_url kolları görmek ve / olacak? sorgu dizeleri sadece iyi.

Her durumda, genel sorunu bu alan kötü hatta deneyimli geliştiriciler arasında çepeçevre anlaşılmış olmasıdır, ve çoğu kişi (ben yakın zamana kadar dahil) sadece açıkça yanlış olan dosya sonra bir şey urlencoded gerektiğini varsayalım size eğer dikkate standartlarını alır.

tl, dr spec okuyun :)

Apache config:

AllowEncodedSlashes On

See the documentation for more information:
http://httpd.apache.org/docs/2.2/mod/core.html#allowencodedslashes

Edit: Hmm, bu zaten çalışıyor ne olabilir ... Bu aynı sorunu vardı ve ne benim için sabitleme sona erdi ben gerekli verileri vardı sadece $_SERVER['REQUEST_URI'] kullanmak olmuştur.

PHP bu url ile ne belirtmek yok. Bu sayfaya yönlendirebilir veya okumak için çalışıyor mu?

Çift bölü kaldırmak, ya da bir yere bu olmamalı bu yönlendirmek için çalışır başka bir amaç için bazı mod_rewrite kural muhtemelen vardır.

Http:// önce ^ olmadan belki regex

Sorgu dizesi doğru URL-kaçtı ise (yani% 2F yerine ileriye çizgiyle), sonra her şey çalıştığını unutmayın.

Yani sorgu dizesi doğru biçimlendirilir çalışır ve değilken çalışmaz. Sorun ne?

Eğer mod_security yüklü mü? Bu konuyu bakınız:

403 Forbidden on PHP page called with url encoded in a $_GET parameter

Bu varsayılan magic_quotes_gpc başka bir durumda gibi geliyor. Sunucuda sorunlara neden php.ini kontrol edin ve emin olun

magic_quotes_gpc = Off