Kullanıcılarına bir PHP dosyası yöneticisi Güvenliğini

2 Cevap php

Ben CodeIgniter PHP framework kullanarak fotoğraf paylaşım web sitesi geliştiriyorum. Fikri insanların, kendi fotoğraf yüklemek ve (yeniden boyutlandırma, döndürme ve başlamak için kırpma gibi temel bazı şeyleri bunları düzenlemek (onları alt klasörler, çevresinde sürükleyin dosyaları, vb oluşturmanıza olanak sağlar dosya tarayıcısı çeşit yoluyla) onları yönetmek ve olmasıdır daha sonra, I) bazı gelişmiş özellikler ekleyeceğiz.

Zaten CI için üçüncü parti kimlik doğrulama çözümü (Redux Authentication 2 Beta) uygulanan ettik ve ben artık bir JS / PHP dosya yöneticisi (AjaxExplorer) entegre ediyorum, ama sorun olduğunu PHP dosyaları (taşıma, kopyalama, vb) yönetmek için arka uç ajax aramaları kullanıcı girişi çok fazla güvenmektir. Örneğin, (açıklık uğruna basitleştirilmiş) bu gibi şeyler yapıyor:

move_uploaded_file($_FILES['upload']['tmp_name'], $root.$username.$_POST['destination_dir']);

Gördüğünüz gibi körü körüne kullanıcı atar hangi yolu kabul eder gibi, bariz güvenlik endişeleri vardır! Ben zaten kimse böyle bir şey gönderme görebilirsiniz ".. / AnotherUser /" $ _POST ['destination_dir'] değeri olarak.

Benim soru: What's the best way to "sandbox" a user, in order to only allow him to manage his own data? Ben sadece saldırı her girişimi yakalamak umuduyla, filtre + girişlerini doğrulamak mı? Belirli bu sorunu gidermek için özel kütüphaneler / paketleri var mı?

Ben bu sorun her nasılsa, kullanıcılara web tarayıcısı yoluyla dosyaları yönetme gücü verir proje, (yeterince olgun) herhangi çözülmesi gerekir düşünüyorum, bu yüzden SQL Injection hakkında bir yeri vardır (bu çevrede bazı net kurallar bulmak için bekleniyor XSS, CSRF, vb) ama ben doğru anahtar kelimeleri kullanarak değilim sanırım.

2 Cevap

Sadece onu kendi verilerini yönetmek için izin vermek için "sandbox" bir kullanıcı için en iyi yolu nedir?

Kullanıcının istediği herhangi bir dosya adları / dizin adlarını izin, ama sadece sunucu tarafında dosya sistemi üzerinde bunları kullanmayın. Bunun yerine, birincil anahtar ile bir veritabanına yol adlarını yazmak ve '34256 gibi bir dosya adı olarak birincil anahtar kullanın. Dat 'düz bir depolama dizininde (hatta isterseniz veritabanındaki bir BLOB gibi). Sonra istenen dosya URL görünmesi için bir indirme komut dosyası veya URL yeniden yazma yoluyla kadar hizmet vermektedir.

Gelen dosya adlarını Sanitising olan hard. Algılama '..' sadece başlangıçtır. Çok uzun dosya isimleri; çok kısa dosya isimleri; ön ve arka noktalar kombinasyonları; lider ve sonlarındaki boşluk kombinasyonları; farklı platformlarda farklı dizin ayırıcılar; Bazı platformlarda geçersiz karakterler; denetim karakterleri; Unicode karakterler ve onları ele çevre özgü yolları; ADS; dosya adları ('htaccess.') veya uzantıları web sunucusu 'özel' olabilir ('php.', 'cgi.'); Windows'ın ayrılmış dosya adları ...

Çeşitli platformlarda filepath kuralları komik küçük tuhaflıklar izini bir ömür geçirmek, ya da sadece bunu unutmak ve veritabanı kullanabilirsiniz.

Ben senin destination_dir gibi görünüyor emin değilim, ama ne düşündüm dizinleri tuşları atama oldu, ve o anahtarına dayalı dizin alıyorum. Örneğin:

//$_POST['destination_dir'] = '4hg43h5g453j45b3';
*_query('SELECT dir FROM destinations WHERE key = ? LIMIT 1'); //etc.

Ancak elden önce anahtarlarını önceden tanımlamak zorunda. Başka bir alternatif tersi olabilir: MD5/SHA1 giriş ve destination_dir gibi, daha sonra ilişkili etiket ile veritabanında bu anahtarı saklamak olduğunu kullanın.