GET ile DB eylemleri gerçekleştirmek için, hızlı, kolay ve güvenli bir yöntemdir

3 Cevap php

Bir yöntemleri / en iyi uygulamalar Sıralama Eminim ele alınmıştır olduğumu burada soru, ama ben girmek belirsiz arama terimleri dayalı bir çözüm bulamıyor.

Ben "Hızlı ve kolay" muhtemelen birkaç inliyor dışarı çıkartalım ile soru kapalı başlangıç ​​biliyorum, bu yüzden özür dilerim.

İşte anlaşma.

Ben bir ADMIN kendi profiline ilişkin veri girişi için POST işlemleri bir bütün ana yapabileceği alanda bir giriş var. Bu admin kimliği ile ilgilidir gibi veri yapılandırdık yolu çoğu tablolar oldukça farklı ve iyi parçalı olduğunu.

Şimdi, ben içine bir türde bir veri dökümü ve her kayıt için ADMIN benzersiz kimliği atayarak bu verileri ayırmak bir tablo var. Diğer bir deyişle, tüm Yöneticiler Bu tabloya veri yazma bu bir tür var. Ben sadece her kayıtla ADMIN kimliği tarafından ayırt.

Ben ADMIN bir sorgu dizesi ile bir bağlantıya tıklayarak bu kayıtları kaldırmak icar was planlama - Açıkçası GET kullanarak. Açıkçası, sorgu yapısı çok admin açmış sonra herhangi bir URL istismar ve rakibin kayıtları silebilir bağlantı olduğunu.

Güvenli POST veya üzerinden bunu yapmak için tek yolu ben şifresini içerir ve silmek istemektedir ADMIN kimliği karşı doğrulamak oturum bilgi geçmesi gerekir mi?

Bu tabii ki benim için çok daha eseridir.

Hızlı, İyi ve ucuz: onlar içeri çalışmak için kullanılan oto tamir biz de söylediğim gibi .. Bir işi yapmak için 3 yol vardır. Sen sadece bir seferde iki tane olabilir. Hızlı ve ucuz iyi olmayacaktır. İyi ve ucuz hızlı geri dönüş olmaz. Hızlı ve iyi ucuz olmayacaktır. haha

Ben burada geçerli ... ;) her seferde, hızlı, kolay ve güvenli olması asla tahmin

Şimdiden teşekkürler ...

3 Cevap

Genel bir kural olarak, (onun oturum durumu, veya veritabanı devlet olsun) POST kullanmalısınız durumunu değiştiren herhangi bir işlem. Yani GET ile gerçekleştirebilirsiniz sadece 'güvenli' SQL işlemi SELECT anlamına gelir. Yalnızca bir arka uç admin şeyi kullanıyor olsanız bile, sen get kullanmamalısınız. Tarayıcınızı yeniden açılması ve firefox kapalı son kez her şey tekrar silinen sonuçlanan için 'her şeyi silmek' GET-> silmek sayfada olduğunu bulma düşünün.

Bunun temel nedenlerinden biri, cross-site istek sahte engelliyor. Böyle http://example.com/account?action=logout gibi bir GET değişkeni aldı bir sayfa olsaydı Örneğin, bir saldırganın bu gibi sitenizde bir görüntü post olabilir:

<img src="http://example.com/account?action=logout" />

ve bu görüntü etiketi içeren bir sayfa açtı herkes hemen onlar bir yönetici olsa bile, dışarı günlüğe olacaktır. Daha sonra bu veriler için ham veri tabanı üzerinden arama ve çıkarmak için çok can sıkıcı olurdu.

POST işlemleri 'neredeyse' kurma gibi kolay, herhangi bir web güvenlik sorunu ile genel bir kural olarak olsa birini veya diğerini seçmek zorunda gidiyoruz, böylece, ticaret-off, güvenlik vs hız / basitliği.

Siz oturumu çeşit kurmak olmalıdır.

GET üzerinden POST kullanarak kadarıyla güvenlik söz konusu olduğunda size somut hiçbir şey alır. Mesajlar GETler gibi sahte olabilir.

Yani yönetici olarak oturum kez varsayarak, sen oturumda tanımlayıcı çeşit var, sadece bunu kaldıraç.

Bu kabaca benzer bir şey düşünün:

<?PHP
session_start();

if (empty ($_SESSION['admin_id'])) die("Log in, son.");

if (empty($_GET['record_id'])) die("You've got to tell me which record to delete!");

if (! is_numeric($_GET['record_id'])) die("Invalid record ID");

//just to be totally safe, even though we just enforced that it's numeric.
$record_id = mysql_real_escape_string($_GET['record_id']));

$sql = "DELETE FROM table WHERE record_id='{$record_id}' AND admin_id = {$_SESSION['admin_id']}";

mysql_query($sql);

echo "Record was deleted (assuming it was yours in the first place)";
?>

Bu örnekte, biz DELETE sorguda WHERE yan tümcesi yararlanarak "başkasının kayıtlarını silmek" sorunu kaçıyorsun. Tabii ki, daha kullanıcı dostu olmak, sonra $ _SESSION admin_id için kaydında admin_id karşılaştırmak, ilk kaydını almak isterdim, onlar maç yoksa, bir hata atmak, bir şeyler yapın, şikayet vb

HTH

Sen söylüyorsun: "What if Admin 123 access the URL of Admin 321 directly, thus deleting his stuff?" hayır?

Böylece daha sonra ise, kesilen her yönetici olduğunu admin bazı benzersiz bir tanımlayıcı ile en az bir oturum olmalıdır. Değilse, o ilk etapta admin bölümünde olması mümkün olmamalıdır. Sadece oturumda tanımlayıcı ile URL tanımlayıcı karşılaştırmak değil miyim?

Herhangi bir kullanıcı, sadece bir yönetici, bu 'beni sil' URL'leri erişmek Eğer o verilerin orijinal 'sahibi' (admin) olarak oturum tarafından tespit edilmelidir.