Form gönderimler arasında base64_encoded tefrika verileri geçirmeden

4 Cevap php

Ben kullanıcı girişleri almak için formların bir sihirbaz tabanlı serisi oluşturma. Bu sihirbaz için şartlardan biri kullanıcı 'Kaydet' düğmesini oturana kadar komut (PHP) veritabanına girişleri (MySQL) tasarruf edemez, bu yüzden cihaza başka bir form kullanıcı girişlerini taşımak için bir mekanizma var zaman kullanıcı tıklamaları 'Önceki' veya 'İleri' düğmeler. Ben kurabiye, oturumlar, geçici dosyalar vb dahil olmak üzere çeşitli yöntemler kullanarak içine baktım, ama ben base64_encoded serideki tüm formlarda var gizli bir alana veri serialize gömmek için yerleşti. Bu alandaki değeri form tabanlı gönderimleri üzerinde çözümlenmiş ve mevcut haliyle diğer değerler takıldıktan sonra bir sonraki formda koymak için yeniden kodlanmış olacaktır.

İşte gizli alan görünüyor nasıl bir örnek:

<input type="hidden" name="wizard:presave" value="YTo2OntzOjU6InRpdGxlIjtzOjEwOiJRdWVzdGlvbiAyIjtzOjQ6InRleHQiO3M6MTk6IlllcyBpdCdzIGEgcXVlc3Rpb24iO3M6NDoidHlwZSI7czo2OiJjaG9pY2UiO3M6NzoiY2hvaWNlcyI7YTowOnt9czo1OiJwb2ludCI7aToxO3M6Mjoib3AiO3M6MTM6ImVkaXRfZXhlcmNpc2UiO30=" />

Yani sorular şunlardır:

  1. Bir iyi / kötü uygulama olarak kabul edilir?

  2. HtmlForm gizli alanlardan herhangi bir uzunluk limiti var mı?

  3. Olası güvenlik sorunları nelerdir?

  4. Ve daha iyi alternatifler vardır? (Tercihen javascript kullanmadan açıklamalar ile)

Şimdiden teşekkürler!

4 Cevap

  1. Benim kariyerimde geçen parametrenin bu özel yöntemi görmedim, bu yüzden iyi ya da kötü olup olmadığını söyleyemem. Kesinlikle "standart" değil. Standart yöntemler ya olur gizli girdileri kullanarak (şifresiz / normalde) birlikte teslim yöntemini geçen, ya oturumda depolamak. Ben sizin için iş yapma olabileceğini düşünüyorum, bu yüzden bu anlamda bu "ideal değil" meyledeceğini.

  2. Sürece formları için POST kullanarak gibi, ben HTTP şartnamelerde farkındayım boyuttaki veriler için tanımlanmış bir sınır yoktur. Eski sunucular pratik sınırları olabilir, ancak böyle medya dosya yükleme gibi aşırı bir şey yapıyoruz sürece, onlar bir endişe olmamalıdır.

  3. Olası güvenlik sorunları normal bir web güvenlik açıkları vardır. Bir sayfaya bir kullanıcı ve yeniden çıktı almak her şey (her şeyi kodlama yapıyorsanız, bu biraz tartışılır) cross-site scripting açıkları içerebilir ve düzgün dezenfekte edilmesi gerekir. Kullanıcılar kendi verilerini zanaat ve onlar gibi eğer sunabilirsiniz. Temelde, işlemek tüm veriler güvensiz ve kusurlu olduğunu varsayalım.

  4. Oturumlar burada çok daha iyi çalışacak. Veriler kullanıcının gönderdiği uzun bir kodlama işlemi geçmesi olmazdı. Yanı sıra, sadece bir kez doğrulamak zorunda olurdu. Bu teslim ve valide oldu sonra, sadece $ _SESSION sunucuda depolamak ve son butonuna basılana kadar yalnız bırakabilirsiniz. Aksi takdirde, onu yeniden çıktısı yeniden alınmasını ve her adımda onu yeniden doğrulama hakkında endişelenmenize gerek. Kötü niyetli bir kullanıcı, tek bir veri kümesi teslim olabilir işaretli ve yeniden çıktı kodlanmış verisi olarak, ama sonra unencoding tarafından bir sonraki form gönderme zanaat, verileri değiştirme, ve yeniden kodlama.

Ben çok bir "do-bir zamanlar" senaryo içine tüm veri işlemleri basitleştiren gibi, oturumları yeniden öneriyoruz.

Bir iyi / kötü uygulama olarak kabul edilir?

Amacına bağlıdır. Bildiğim kadarıyla sadece büyük ajax tabanlı uygulamalar (onlar bookmarkable böylece) ve daha sonra sık sık aynı zamanda daha kısa yapmak için GZipped içinde seçimleri durumunu hatırlamak için bir istemci tarafı URL karma gibi yapıları gördüm. Lütfen speficic durumda diyebilirim: HTTP oturumu faydalanmak ve oturumdan ilgili bilgi almak böylece sadece gizli bir alanda (aynı zamanda token denir) bir istek tabanlı tanımlayıcı geçmektedir.

HtmlForm gizli alanlardan herhangi bir uzunluk limiti var mı?

GET tam sorgu dizesi (tüm parametre adları ve değerleri ve ayırıcılar birlikte), genellikle 2048 karakterle sınırlıdır, ancak iyi 256 karakter bir işgüzar sınırını yapışırlar. POST o sunucu konfigürasyonuna bağlıdır. 2GB etrafında sık sık bu varsayılan.

Olası güvenlik sorunları nelerdir?

Eh, tabii ki decode-yapabiliyor.

Ve daha iyi alternatifler vardır? (Tercihen javascript kullanmadan açıklamalar ile)

Bunu daha kısa ve daha az belirgin yapmak için gzip olabilir. Ya da, daha önce bahsedilen gibi, talep göre tanımlayıcı ile kombinasyon halinde oturumun kullanır.

Peki, seri hale tarafından ya da sadece ona her adımı için bir yol saklamak ya oturumuna saklayabilirsiniz. Kullanıcı Kaydet tıkladığında, yakala ve oturumdaki tüm adımları verileri doğrulamak.

tsk tsk :)

  1. Is it considered a good/bad practice? subjectively - bad practice..you're using the wrong hammer for the job.

  2. HtmlForm gizli alanlardan herhangi bir uzunluk limiti var mı? - Emin değilim bir sınır varsa.

  3. Olası güvenlik sorunları nelerdir? - Muhtemelen, epeyce, ancak sterilize edebilirsiniz veriler her istek için aldı. (Ben kullandığınız json onun çeşit :) görebilirsiniz) Ayrıca, veri çözmek için oldukça kolaydır ve kolayca istemci tarafında modifiye edilebilir

  4. Ve daha iyi alternatifler vardır? (Tercihen javascript kullanmadan açıklamalar ile) - sessions belki .. doğru aracı kullan?

Ve evet ... Büyük olasılıkla, biçimlendirme ve güvenlik kodu her istek için çalışan, ayrıştırma, bütün bu hijyenikleştirmeye ile (Eğer önemli bir kullanıcı yükü olmalıdır) performans ve ölçeklenebilirlik sorunları ile karşı karşıya olacak.