Nasıl Yerel Dosya İçerme ve web sitenize korumak yapmak SQL Enjeksiyon (PHP)?
Alınması gereken çok sayıda önlemler vardır. Veritabanında saklanması önce tüm girdileri emin olun. Ben saklanan tüm veriler üzerinde mysql_real_escape_string() kullanmanızı öneririz. Makul uzunlukları karakter girişi sınırlamak ve bu alan için bekliyoruz veri TİP aldığınızdan emin olun. Verilerin belirli alanlar için birden göndererek girişimleri kilitleyin. Kötü amaçlı desen arıyor yüklenen dosyaların içeriğini sürün.
Vikikitap SQL Injection bir bölüm vardır;
Liste uzayıp gidiyor. Neyse ki, bu alanda bile biraz çaba açıkları çok sayıda yama olabilir.
SQL için hazırlanan tablolar (bkz. PDO::prepare()
) veya uygun öncelemeli (PDO::quote()
).
Ya da tamamen yolları güvenilmeyen verileri kullanarak (kullanım kimlikleri, önceden tanımlanmış dizeler, vb) kaçının: Yerel yolları için dikkatle (preg_replace('/[^a-z]/','',$str)
acımasız, ama güvenli) girdiyi gerekir
SQL enjeksiyon karşı korumak için ben PDO kullanarak tavsiye ediyorum (http://us3.php.net/pdo). Eğer kabul engelleyebilirsiniz hangi gerekir ama iyi şeyler var uzantıları vb var.
Şahsen ben güzel-to-var en dahil mysql_real_escape_string()
bir demet uygulayan hangi aracılığıyla tüm sorgular gidip bir ev demlenmiş DB erişim katmanı kullanın
"Yerel dosya dahil" ederek, bu tür benzer çok basit bir dosya tabanlı CMS veya gibi, sen include()
veya kullanıcı girişi yapılmış bir yolda benzeri çağrı davasını anlama geliyor? Eğer öyleyse, cevabı temelde SQL enjeksiyon için aynıdır - Eğer girdiyi var.
Dosya yolları Sanitising dosyaların ekleneceğini nerede hakkında bazı kurallar koymamız ve acımasızca uymayan herhangi bir giriş reddetmek gerektirir. Eğer sadece bir alt dizinine dosyaları isim dahil konum Örneğin, o zaman aşağıdaki temel algoritma geçerli olabilir:
.
, ..
veya /
(veya \
Windows altında) içeren dosya adlarını ReddetPHP belgelerine filesystem security hakkında biraz daha fazla bilgi var. Ayrıca open_basedir
, belirli bir dizin ağacındaki dosya erişimini sınırlandırmak kurmak olabilir, ama bunun sayesinde, itiraz edildi (ve PHP 6.0 silinecektir) PHP'nin "güvenli mod", parçasıdır gerçekten çok güvenli değil.
Diğerleri gibi söylediler, mysql\_real\_escape\_string()
SQL enjeksiyonu önlemek için en güvenli yöntemdir. Ben bir sanitize()
fonksiyonu sayesinde tüm gerekli değişkenleri geçer tüm SQL için özel bir arayüz DB sınıfını kullanın. Burada ister ona bakmak durumunda sınıfından elimden bu sterilize fonksiyon.
/**
* Sanitize variable for querying
*
* @param mixed $var The variable to sanitize
* @param bool $deep Will inspect the string deeper, converting 'null' to NULL and adding '' around strings
* @param mixed $numstrings Whether or not to treat numbers as strings (ie add quotes)
* @return $var
*/
function sanitize($var, $deep = true, $numstrings = false) {
if (is_array($var)) { //run each array item through this function (by reference)
foreach ($var as $key=>$val) {
$var[$key] = sanitize($val, $deep, $numstrings);
}
}
else if (is_null($var) || ( $deep && preg_match('/^null$/i', $var) > 0 ) ) { //convert null variables to SQL NULL
$var = "NULL";
}
else if (is_bool($var)) { //convert boolean variables to binary boolean
$var = ($var) ? 1 : 0;
}
else if ($numstrings && is_string($var)) {
$var = mysql_real_escape_string($var);
if ($quotes) {
$var = "'". $var ."'";
}
}
else if (!is_numeric($var)) { //clean strings
$var = mysql_real_escape_string($var);
if ($deep) {
$var = "'". $var ."'";
}
}
return $var;
}
"Yerel dosya dahil" gelince, ben iki farklı yöntem kullanabilirsiniz. Güvenli tekniği web üzerinden erişilebilir bir yerde hassas dosyaları tutmak olduğunu unutmayın.
Sadece bir dosya ya da dünya görmek istemiyorum eğer, ben sadece dosya adına '. Ht' ekleyin. Apache, varsayılan olarak, '. Ht ile başlayan dosyalara erişimi reddeder. Sadece dosyaları Apache yapılandırma dosyaları (. Htaccess. Htpasswd, vb) gibi aynı isim değil emin olun.
Eğer sitenizin bir alt-dizinde hepsini tutmak, erişilen istemiyorum birden fazla dosya varsa (yine, hassas dosyaları başka bir yerde olmalıdır.) Ardından alt dizininde, (onlar PHP ile hala erişilebilir) dizinine erişimi engelleyen bir. Htaccess dosyası ekleyin.
#this is all you need in the file
Order Allow , Deny
Deny from all