PHP ile sorumlu oturum güvenliğini sürdürmek için bazı yönergeler nelerdir? İnternetin her yerinde bilgi var ve hepsinin tek bir yere konmasının zamanı geldi!
PHP ile sorumlu oturum güvenliğini sürdürmek için bazı yönergeler nelerdir? İnternetin her yerinde bilgi var ve hepsinin tek bir yere konmasının zamanı geldi!
Yanıtlar:
Oturumunuzu güvende tutmak için yapmanız gereken birkaç şey var:
$_SERVER['HTTP_USER_AGENT']
. Bu, oturum kaçırmaya küçük bir engel ekler. Ayrıca IP adresini de kontrol edebilirsiniz. Ancak bu, birden fazla internet bağlantısında yük dengeleme vb.Nedeniyle değişen IP adresi olan kullanıcılar için sorunlara neden olur (buradaki ortamımızda durum budur).Bir kılavuz, bir oturumun güvenlik seviyesi her değiştiğinde session_regenerate_id'yi çağırmaktır . Bu, oturum kaçırmanın önlenmesine yardımcı olur.
İki (veya daha fazla) sentim:
Bu konuyla ilgili küçük ama güzel bir kitap var: Chris Shiflett tarafından yazılan Temel PHP Güvenliği .
Temel PHP Güvenliği http://shiflett.org/images/essential-php-security-small.png
Kitabın ana sayfasında bazı ilginç kod örnekleri ve örnek bölümler bulacaksınız.
Yukarıda belirtilen tekniği (IP ve KullanıcıAracısı) burada açıklanan tekniği kullanabilirsiniz: Kimlik hırsızlığı nasıl önlenir
Bence en büyük problemlerden biri (PHP 6'da ele alınan) register_globals. Şu anda kaçınmak register_globals
için kullanılan standart yöntemlerden biri $_REQUEST
, $_GET
veya $_POST
dizilerini kullanmaktır.
Bunu yapmanın "doğru" yolu (5.2'den itibaren, biraz hatalı olmasına rağmen, ancak 6 itibariyle kararlı, yakında gelecek olan) filtrelerden geçer .
Yani bunun yerine:
$username = $_POST["username"];
yaparsın:
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
hatta sadece:
$username = filter_input(INPUT_POST, 'username');
Bu oturum sabitleme kağıdının , saldırının gelebileceği çok iyi işaretçileri var. Ayrıca Wikipedia'daki oturum sabitleme sayfasına bakın .
IP adresini kullanmak, deneyimlerime göre gerçekten en iyi fikir değil. Örneğin; Ofisimde yüke bağlı olarak kullanılan iki IP adresi var ve IP adreslerini kullanırken sürekli sorunlarla karşılaşıyoruz.
Bunun yerine, oturumları sunucularımdaki etki alanları için ayrı bir veritabanında depolamayı seçtim. Bu şekilde dosya sistemindeki hiç kimse bu oturum bilgilerine erişemez. Bu 3.0 öncesi phpBB ile gerçekten yardımcı oldu (o zamandan beri bunu düzelttiler) ama yine de iyi bir fikir olduğunu düşünüyorum.
Bu oldukça önemsiz ve açıktır, ancak her kullanımdan sonra session_destroy yaptığınızdan emin olun . Kullanıcı açıkça oturumu kapatmazsa bunu uygulamak zor olabilir, bu nedenle bunu yapmak için bir zamanlayıcı ayarlanabilir.
İşte setTimer () ve clearTimer () hakkında iyi bir öğretici .
PHP oturumları ve güvenliği ile ilgili temel sorun (oturum kaçırmanın yanı sıra) hangi ortamda olduğunuzla ilgilidir. Varsayılan olarak PHP, oturum verilerini işletim sisteminin geçici dizinindeki bir dosyada depolar. Herhangi bir özel düşünce veya planlama olmaksızın, bu tüm dünyada okunabilir bir dizindir, bu nedenle tüm oturum bilgileriniz sunucuya erişimi olan herkes için halka açıktır.
Oturumları birden çok sunucu üzerinden sürdürmeye gelince. Bu noktada PHP'yi, sağladığınız işlevleri CRUD'a çağırdığı (oluşturma, okuma, güncelleme, silme) kullanıcı tarafından yönetilen oturumlara geçirmek daha iyi olacaktır. Bu noktada, tüm uygulama sunucularının verilere erişebilmesi için oturum bilgilerini bir veritabanında veya memcache benzeri bir çözümde depolayabilirsiniz.
Paylaşılan bir sunucu üzerindeyseniz, kendi oturumlarınızı saklamak da avantajlı olabilir, çünkü onu veri tabanında saklamanıza izin verir, bu da çoğu zaman dosya sistemi üzerinde daha fazla kontrole sahip olursunuz.
Seanslarımı böyle ayarladım-
giriş sayfasında:
$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR']);
(yapılandırma sayfasında tanımlanan ifade)
daha sonra sitenin geri kalan kısmındaki başlıkta:
session_start();
if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR'])) {
session_destroy();
header('Location: http://website login page/');
exit();
}
session.cookie_httponly = 1
change session name from default PHPSESSID
X-XSS-Protection 1
X-XSS-Protection
gerçekten yararlı olmadığının farkında olun . Aslında, koruma algoritmasının kendisi aslında kötüye kullanılabilir, bu da onu eskisinden daha kötü hale getirir.
Değişip değişmediklerini görmek için hem IP'yi hem de Kullanıcı Aracısını kontrol ederdim
if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
|| $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
//Something fishy is going on here?
}
Session_set_save_handler () kullanıyorsanız , kendi oturum işleyicinizi ayarlayabilirsiniz. Örneğin, oturumlarınızı veri tabanında saklayabilirsiniz. Veritabanı oturumu işleyicisi örnekleri için php.net yorumlarına bakın.
Birden fazla sunucunuz varsa DB oturumları da iyidir, aksi takdirde dosya tabanlı oturumlar kullanıyorsanız, her web sunucusunun oturumları okumak / yazmak için aynı dosya sistemine erişimi olduğundan emin olmanız gerekir.
Oturum verilerinin güvende olduğundan emin olmanız gerekir. Php.ini dosyanıza bakarak veya phpinfo () kullanarak oturum ayarlarınızı bulabilirsiniz. _session.save_path_, nereye kaydedildiklerini size söyler.
Klasörün ve üstlerinin iznini kontrol edin. Herkese açık olmamalı (/ tmp) veya paylaşılan sunucunuzdaki diğer web siteleri tarafından erişilebilir olmamalıdır.
Hala php oturumunu kullanmak istediğinizi varsayarsak, _session.save_path_ değiştirerek php'yi başka bir klasörü kullanacak şekilde ayarlayabilir veya _session.save_handler_'ı değiştirerek verileri veritabanına kaydedebilirsiniz.
Sitenizin kök klasöründe bir .htaccess dosyasında, php.ini _session.save_path_ ayarlamak mümkün (bazı sağlayıcılar buna izin) ya da apache + mod_php için olabilir:
php_value session.save_path "/home/example.com/html/session"
. Ayrıca _session_save_path () _ ile çalışma zamanında da ayarlayabilirsiniz.
Kontrol Chris Shiflett en öğretici veya Zend_Session_SaveHandler_DbTable seti ve alternatif Oturum kayıt için.