Neden eksik () filter_input edilir?

3 Cevap php

Ben şu anda bir PHP tabanlı CMS üzerinde çok çalışıyorum, ve ben ona olduğum sürece tek bir merkezi yerde kullanıcı girişi tüm kullanım ve sanitasyon taşımak istiyorum. (Şu anda, o kadar üzerinde bir $ _GET var, burada bir $ _REQUEST, ve).

Ben çok filter_input () gibi ve temel sağlık için kullanmak istiyorum, ama bu işlev gerçekten hazır üretim olup olmadığı konusunda şüphelerim var. Örneğin, documentation isimleri $ türü için aşağıdaki parametreler

INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV, INPUT_SESSION (not implemented yet) and INPUT_REQUEST (not implemented yet).

fonksiyonu 5.2.0 'dan beri, neden iki önemli unsurları henüz uygulanmadı var? Ben $ _REQUEST veri almak istiyorsanız, size bir not kullanıcıdan bir çözüm kullanmak zorunda. Bunun özel bir nedeni var mı? Bu fonksiyon beta çeşit hala var mı? Bu gelen verileri işlemek için ilk çağrı olarak güvenilir mi?

Belki PHP geliştirme süreci ile tanıdık birileri bu biraz ışık tutabilir.

3 Cevap

Ben tek bir merkezi yerde kullanıcı girişi tüm kullanım ve sanitasyon taşımak istiyoruz

Evet, bu ne kadar güzel olurdu. Bu yapılamaz. Bu metin işleme nasıl çalıştığını değil.

Eğer başka içine bir bağlamda metin ekleme iseniz doğru kaçar kullanmanız gerekir. (MySQL dize hazır mysql_real_escape_string, belirli bağlamlar için URL parametreleri, diğerleri için HTML içeriği, urlencode için htmlspecialchars). Eğer filtreleme konum senaryonuzun başında, giriş sonuna kadar nereye gittiğini bilmiyorum, o yüzden kaçmak için nasıl bilmiyorum.

Belki bir giriş dizesi veritabanına hem gidiyor (SQL-kaçtı olması gerekir) doğrudan (HTML öncelemeli olması gerekiyor) sayfa üzerine. Bu durumlarda her ikisini de kapsar kimse kaçış yok. İkiniz de birbiri ardına kaçar kullanabilirsiniz, ama sonra HTML değeri garip tersbölüler ona görünen ve veritabanı kopyalama işaretlerinden dolu olacak olacaktır. Birkaç Bu misencoding turlarını ve size bir şey düzenlemek her zaman, \\\\\\\\\\\\\\\\\\\\ ve uzun dizeleri & çıkıp bu durumu olsun.

Eğer güvenli bir başlangıç ​​saatinde tek seferde filtre tek yolu tamamen any Onları içeri kullanarak gidiyoruz bağlamlarda kaçan gereken tüm karakterleri kaldırarak 'Ancak hiçbir kesme anlamına gelir veya HTML, veritabanındaki herhangi bir 'işareti veya daha az-thans ve muhtemelen diğer URL düşmanca noktalama bütün bir yük tersbölüler de gitmek zorunda. Rasgele metin almaz basit bir site için, belki o uzak alabilir. Ama genelde değil.

Metnin bir tür başka bir gider Yani sadece sinek kaçabilir. Sorunu önlemek için en iyi strateji ile olduğu kadar yerine SQL dizesi binanın Parametrelenmiş sorguları kullanarak, örneğin, muhtemelen olabildiğince çok ve ya bir echo(htmlspecialchars()) fonksiyonunu tanımlayan diğer bağlamlarda içine birleştirerek metin önlemek için daha az yazmaya çalışmak, ya da varsayılan bir alternatif çiftleşmiş sistemi HTML-kaçar kullanarak yapmak için güzel kısa adı.

Programlama, mümkün olduğunca girişi gibi kısıtlayıcı olmalıdır. Bu da veri kaynakları için de geçerli. $ _REQUEST Sorunlara yol açabilir $ _GET her şeyi, $ _POST ve $ _COOKIE içerir.

İYS'niz bir eklenti başka bir eklenti anlamlı bir anahtar olarak var olur bunlardan birinde yeni bir özel anahtar tanıttı Örneğin için ne olur sence?

So DON'T ever use $_REQUEST. Use $_GET, $_POST or $_COOKIE, whichever fits your scenario. It's a good practice to be as strict as possible, and that has nothing to do with PHP, but with programming in general.