SQL Injection önlemek için mysql_real_escape_string kullanmak nerede?

4 Cevap php

Ben hacker bir grup ile dertte. onlar benim müşterinin sitesi birkaç kez hacklenmiş ve müvekkilim daha fazla kızıyor: (müvekkilim veritabanını kaybetti (yüzlerce kayıtları vardır), ve tüm girmek zorunda kaldı: (

şimdi biraz daha tanıtımları takip ediyorum;

  • sabit dosya izinleri
  • Değiştirilen ftp ve ana giriş info
  • Tüm uzak MySQL girişler temizlenir

Şimdi SQL Injection konu üzerinde çalışıyor. Ben Admin paneli giriş parametrelerinde için mysql_real_escape_string ekledi. Peki başka ben bu mysql_real_escape_string kullanmalıyım? Ben, ben orada eklemeniz gerekiyor bence yerinde birkaç e-posta formları Yüklü var ...

Bir Ana Sayfa Künye olarak index.php sahiptir. Ben gibi url ile herhangi bir SQL enjeksiyon saldırıları önlemek için bu sayfa için bir şey yapmak gerektiğini index.php?somesql=?

Bana bildiriniz! Ben çok takdir! (


örneğin:

Ben böyle bir kod var;

public function showDetails($id) {

    // SQL Jobs Details
    $this->sql_job = "SELECT * FROM jobs WHERE id=".mysql_real_escape_string($id);
    $this->rst_job = mysql_query($this->sql_job);           
    $this->row_all = mysql_fetch_assoc($this->rst_job);     

    // SQL State
    $this->sql_state = "SELECT title FROM state WHERE id=" . $this->row_all[$this->tbl_jobs['f4']];
    $this->rst_state = mysql_query($this->sql_state);   
    $this->row_state = mysql_fetch_assoc($this->rst_state);
........

yeterli $ id mysql_real_escape_string kullanmaktır. değil $ this-> row_all [$ this-> tbl_jobs ['f4']]

4 Cevap

Temelde, her zaman, bir SQL sorgusunda bazı güvensiz veri (kullanıcı girişi, bir veritabanından bir değer, bir dosya veya harici bir web sitesi, bunun güvenli olduğunu 100% emin değil yani herhangi bir veri) kullanın Eğer mysql_real_escape_string kullanarak kaçmak gerekir. according to OWASP, bu fonksiyon dinamik tablo adlarını kaçmak için güvenli değildir (ama bu kadar az ortak "temel" kullanıcı girişi ekleme daha) olduğunu unutmayın.

Sana OWASP article on SQL injection bütününe bir göz ve aynı zamanda web sitesinin geri kalanını göz öneririz. Bu web uygulamaları güvenliği konusunda büyük bir bilgi kaynağıdır.

IMO, SQL enjeksiyon önlemek tercih edilen yolu kullanmaktır prepared statements.

Please remember that if you do choose to use mysql_real_escape_string() it only works when used inside a string that is delimited by quotes. Never use it on any unquoted values. This includes numeric values; instead, validate that the user-input is actually numeric.

SQL enjeksiyonu önlemek için en iyi yolu, hazırlanan tabloların ve bind değişkenleri kullanımı ile. MySQL hangi sürümü kullanıyorsunuz? Hazırlanan tablolar 4.1 ve daha yüksek bulunmaktadır.

Kullanıcı girişi ile yapmak en büyük iki şey vardır

  1. Girdi Filtreleme
  2. Çıktı Kaçış

Girdi Filtreleme data / [önce] / bu veritabanında depolanan dönüştürme süreckimlikir. Yürütülüyor mysql_real_escape_string() (db yerleştirilmesi için kullanıcı verilerini sterilize etmek için daha iyi yollar var olmasına rağmen) Bu adımda altına düşer, ama bu adım, aynı zamanda beyaz boşluk, küfür filtreleme, biçimlendirme dönüşüm, ve daha kırparak içerebilir.

Eğer kötü niyetli davranış izin vermez tarayıcı kullanıcı-içerik göndermek Çıkışı Kaçan bakım alıyor. Bu htmlentities() ya da diğer seçici tarama sürecinin yürütülmesi anlamına gelir.

Vb kaynak gibi yapabileceğiniz başka şeyler, daraltma (DOS önleme), form belirteçleri (CSRF koruması), OWASP Git ve okumaya başlamak vardır.

Web geliştirme altın kurallarından biri (EVER!) güven kullanıcı girişi ASLA. Bu nedenle, her yerde veritabanına girmeden veri var, siz) (mysql_real_escape_string aramalısınız.

Ayrıca, gelecekte kızgın müşterilerine önlemek için, size veritabanı düzenli olarak yedeklenmesi gerekir. Ben müşteri olsaydım, şu anda öfkeli olurdu.

Sitenizi güvence İyi şanslar.