Bir PHP geliştiricisi https / güvenli yuva katmanı bağlantıları hakkında bilmeniz gerekenler nelerdir nedir?

8 Cevap php

Bu https bağlantı nasıl ve neden söz konusu olduğunda ben yanında hiçbir şey biliyorum. Ben şifreleri veya özellikle kredi kartı bilgileri gibi güvenli veri aktarımı olduğumda Açıkçası, https kritik bir araçtır. Ne olsa, bunu bilmek gerekiyor? Kendi projelerinde uygulamak zaman geliştiriciler yapma görmek en yaygın hatalar nelerdir? Https sadece kötü bir fikir olduğu zamanlar var mı? Teşekkürler!

8 Cevap

HTTPS, veya Güvenli Yuva Katmanı (SSL) sertifikası bir site için servis edilir ve genellikle etkili siteniz hakkında bazı temel bilgilerini doğrular güvenilir 3. taraf bir sertifika yetkilisi (CA) tarafından imzalanır ve kullanım için onaylar tarayıcılarda. Tarayıcınız CA güveniyorsa, o zaman bu CA tarafından imzalanan herhangi bir sertifikaları (bu güven zinciri olarak da bilinir) güvenir.

Bir istek ve yanıt: Her HTTP (veya HTTPS) isteği, iki bölümden oluşur. Eğer HTTPS yoluyla bir şey talep ettiğinde, arka planda oluyor bir kaç şey var aslında:

  • The client (browser) does a "handshake", where it requests the server's public key and identification.
    • Bu noktada, tarayıcı (site adı eşleşmiyor? Tarih aralığı geçerli mi? Bunun güvenen bir CA tarafından imzalanmış?) Geçerliliği için kontrol edebilirsiniz. Hatta CA başvurun ve sertifikanın geçerli olduğunu emin olabilirsiniz.
  • İstemci daha sonra sunucunun ortak anahtarını kullanarak talebini şifreler ve sadece sunucu kendi özel anahtarını kullanarak bu mesajı deşifre edebilirsiniz. Aynı zamanda (genellikle, anında oluşturulan) kendi ortak anahtarını gönderir.
  • Sunucu daha sonra normal isteği işler ve sonra müşterinin ortak anahtarını kullanarak yanıt şifreler ve sadece istemci çözebilir.

Certificates and Hostnames

Sertifikalar HTTPS için alan adı olan bir Ortak Ad (CN), atanır. CN, tam örneğin maç var, "domain.com" bir CN ile bir sertifika "www.domain.com" etki eşleşMEyecektir ve kullanıcılar tarayıcılarında bir uyarı alırsınız.

Bu bir IP üzerinde birden fazla alan adları barındırmak mümkün değildir. Müşteri bile gerçek HTTP isteği gönderir, ve HTTP isteği Sunucuyu içeren önce sertifika getirilen Çünkü: Başlık satırı kullanmak için ne URL sunucuya bildirir, belirli bir hizmet için hangi sertifika bilmek sunucu için hiçbir yolu yoktur istek - Bu nedenle, güvenli olan her alanı kendi IP adresine ihtiyaç duyar. Ancak, aynı IP üzerinde diğer HTTPS olmayan siteleri hizmet edebilir.

Bunun tek istisnası Joker sertifikaları ile. Bu ".domain.com" in which case "www.domain.com" and "foo.domain.com" will both be valid for that certificate. However, note that "domain.com" does not match ". Domain.com" gibi bir sertifika almak mümkündür ve ne yapar "foo.bar.domain.com". Eğer sertifika için "www.domain.com" kullanırsanız, siz için "domain.com" Birine yönlendirmelidir "www." bir site. Onlar https://domain.com istiyorsa ayrı bir IP üzerinde host ve iki sertifika yoksa, bir sertifika hatası alırsınız.

Forms

Strictly sürece teslim URL https:// URL'ye gider gibi, bir form göndererek eğer form sayfası kendisi şifreli değilse, o önemli değil, konuşma. Gerçekte, kullanıcılar küçük bir "kilit simgesini" görmeden sayfaları göndermek için değil (en azından teoride) eğitim almış, bu yüzden bile formun kendisi bu almak için HTTPS ile servis edilmelidir.

Traffic and Server Load

HTTPS trafiği (nedeniyle şifreleme ve sertifika havai) eşdeğer HTTP trafiği çok daha büyük olduğunu ve aynı zamanda (şifrelemek ve şifresini) sunucu üzerinde büyük bir yük koyar. Eğer ağır yüklü sunucu varsa, bu içerik HTTPS kullanan servis edilir konusunda çok seçici olmak istenebilir.

Best Practices

  • Siteniz otomatik olarak HTTPS ve HTTP gerektiği gibi arasındaki yönlendirmelidir. Eğer HTTPS kullanıyor olmalıdır (diğer insanların görmediği gerektiğini herhangi verilere bakarak, kullanıcıların şifreleri kurma, giriş) hassas verileri içeren bir şey yapıyorsun zaman.

  • Sayfada herhangi kaynaklar sayfası için kullanılan aynı düzeni gelmelidir. Eğer sayfa HTTPS ile yüklendiğinde http:// görüntüleri alıp denerseniz, kullanıcının güvenlik uyarıları alacak. Sen tam olarak nitelenmiş URL'leri kullanmalısınız, ya başka bir kolay yolu her ikisi için çalıştıkları için hostname (örn., src = "/ images / foo.png") dahil değildir mutlak URL'ler kullanmaktır.

    • Bu dış kaynaklar (örneğin, Google Analytics) içerir
  • HTTP, HTTPS değişen zaman (form gönderdiğinde) Mesajlar yapmayın. Tarayıcıların çoğu, bir güvenlik uyarısı olarak bayrak bu olacak.

Ben genel olarak SSL derinlemesine gitmek için gitmiyorum, GregMac ;-), bu büyük bir iş yaptı aşağıya bakın.

Ancak, SSL / TLS kullanımı açısından (değil özellikle PHP) yapılan en yaygın (ve eleştirel) bazı hatalar:

  1. HTTPS zorlanarak gerekirken HTTP izin
  2. HTTPS sayfasından HTTP üzerinden bazı kaynaklar alınıyor (örneğin görüntüler, ıframe'ler, vb)
  3. HTTPS sayfasından HTTP sayfasına Yönetmenlik istemeden - Bu Böyle "about: blank" olarak "sahte" sayfalarını içerir unutmayın (ben IFRAME tutucu olarak kullanılan bu gördüm), bu gereksiz ve hoş olmayan bir uyarı penceresini açar.

  4. Web server configured to support old, unsecure versions of SSL (e.g. SSL v2 is common, yet horribly broken) (okay, this isn't exactly the programmer's issue, but sometimes noone else will handle it...)

  5. Web server configured to support unsecure cipher suites (I've seen NULL ciphers only in use, which basically provides absolutely NO encryption) (ditto)

  6. Kendinden imzalı sertifikalar - sitenin kimliğini doğrulayarak engeller.

  7. HTTPS sayfasına göndererek bile bir HTTP sayfasından kullanıcının kimlik bilgilerini, isteme. Şifreli OLACAK bile ya - Yine, bu şifre şifreli iletilen bile, kullanıcı o sahte bir sitede ise bilmenin bir yolu vardır ... o onun şifre vererek ÖNCE sunucunun kimliğini doğrulayarak bir kullanıcı önler.

  8. Güvenli olmayan cookie - (oturum, kimlik doğrulama belirteci, erişim belirteci, vb gibi) güvenlikle ilgili kurabiyeler MUST set "güvenli" özniteliği ile ayarlanır. Bu çok önemli! Bu güvenli ayarlanmış değilse, güvenlik çerez, örneğin (!) SessionId, HTTP üzerinden iletilen olabilir - ve saldırganların bu olacak sağlayabilirsiniz - (bu doğrudan ilgili değil Tho) ona yaparken ve böylece vb oturum ele izin HttpOnly de, çerezleri özniteliğini ayarlayın (bazı XSS ​​azaltmaya yardımcı olur).

  9. Overly permissive certificates - say you have several subdomains, but not all of them are at the same trust level. For instance, you have www.yourdomain.com, dowload.yourdomain.com, and publicaccess.yourdomain.com. So you might think about going with a wildcard certificate.... BUT you also have secure.yourdomain.com, or finance.yourdomain.com - even on a different server. publicaccess.yourdomain.com will then be able to impersonate secure.yourdomain.com.... While there may be instances where this is okay, usually you'd want some separation of privileges...

Yani, ben şimdi hatırlıyorum hepsi sonradan yeniden düzenlemek olabilir ...

Bildiğim kadarıyla SSL / TLS kullanmak için kötü bir fikir olduğu gibi - belirli bir kitleye (tek bir kullanıcı veya kayıtlı üyeleri de) için tasarlanmıştır DEĞİLDİR kamu bilgi var, ve onlardan özellikle onu alma hakkında belirli değilseniz uygun bir kaynak (örneğin, hisse senedi değerleri, kimliği doğrulanmış bir kaynaktan gelmelidir ...) - o (ve sadece performans ... dev / test / CERT / etc) yormayan için gerçek bir neden yoktur.

Sitenizde ve başka DAHA DUYARLI sitesi arasındaki kaynaklarını (örneğin aynı server) ortak varsa Ancak, daha sonra daha duyarlı sitesi burada kurallar ayarı gerekmektedir.

Ayrıca, parolaları (ve diğer kimlik bilgileri), kredi kartı bilgileri, vb DAİMA SSL / TLS üzerinde olmalıdır.

Ne zaman bir HTTPS sayfasında, sayfadaki tüm öğeleri bir HTTPS adresinden gelen, emin olun. Bu unsurlar protokolü protokol bulmak için her sayfada bir kontrol yapmak için gereken kalıtsal veya böylece (örneğin "/ images / banner.jpg") göreceli yolları var, ve tüm elemanlar için kullanan gerektiği anlamına gelir.

NB: Bu (Google Analytics javascript dosyaları gibi) dışında tüm kaynakları içerir!

Aklıma Sadece aşağı tarafı tarayıcı ve sunucu için (neredeyse ihmal edilebilir) işlem süresini ekler olmasıdır. Ben olması gereken sadece transferler şifreleyerek öneririm.

SSL etkin sitesinde vardır çalışırken ben en yaygın hatalardan söyleyebilirim

  1. Site yanlışlıkla kullanıcıların https gibi bir sayfa http yönlendirir
  2. Gerektiği zaman site otomatik https geçiş değil
  3. Bir https sayfa görüntüleri ve diğer varlıklar tarayıcıdan bir güvenlik uyarısı tetikleyeceğini, http üzerinden yükleme ediliyor. Tüm varlıkları https belirtmek tam nitelikli URI'lere kullandığınızdan emin olun.
  4. Güvenlik sertifikası yalnızca (www gibi) bir alt etki alanı için çalışır ama sitenizin gerçekten birden çok alt etki kullanır. Ihtiyacınız eğer bir joker sertifika almak için emin olun.

Ben her zaman any kullanıcı verileri bir veritabanında saklanır ve iletilir, https kullanmak öneririz. Bu sıradan ayrıntıları bile diğer birçok web sitelerinde kendilerini tanımlamak için o kullanıcı tarafından kullanılan çünkü kullanıcı verileri, sıradan olsa bile, bu gereksinimi düşünün. Banka (gibi ne sokak üzerinde yaşıyorsun?) Sorar tüm rastgele güvenlik soruları düşünün. Bu gerçekten kolay adres alanlarından alınabilir. Bu durumda, verileri bir parola düşünün ne değildir, ama aynı zamanda olabilir. Ayrıca, verileri başka bir yerde bir güvenlik sorusu için kullanılacak ne kullanıcı tahmin asla. Ayrıca ortalama bir web kullanıcı istihbarat ile bilgi bu nefis lokma başka bir yerde bu kullanıcının şifre parçası yapmak olabilir ki (senin büyükannesi düşünüyorum) bekleyebilirsiniz.

Bir işaretçi https kullanırsanız

make it so that if the user types http://www.website-that-needs-https.com/etc/yadda.php they will automatically get redirected to https://www.website-that-needs-https.com/etc/yadda.php (personal pet peeve)

Eğer sadece düz bir html web sayfası yapıyoruz Ancak, bu aslında kullanıcıya sunucudan bir bilgi tek yönlü iletim olacak, bu konuda endişelenmeyin.

All very good tip here... but I just want to add something..
Ive seen some sites that gives you a http login page and only redirect you to https after you post your username/pass.. This means the username is transmitted in the clear before the https connection is established..

Kısacası yerine ssl sayfasına gönderme, sen SSL giriş sayfası yapmak.

Ben bir varolmayan stil sayfasına <link> çalışırken aynı zamanda güvenlik uyarıları neden olduğu bulunmuştur. Ben doğru yolu kullanıldığında, kilit simgesi çıktı.

Yani, örneğin, güvenli bir sayfada kullanıcı giriş için güvenli değildir https://yadayada.com/login.php ve sucessful giriş yaptıktan sonra, (Avid 8. kurşunuyla göre) olağan oturumu mgmt sıradan bir php sayfası kullanıcıyı yönlendirme?

ordinarypage.php:

Bu durumda, nasıl o oturumda "güvenli" özniteliği ayarlarım?