2010-11-22 23 views
1

dan SQL enjeksiyonunu nasıl önleyebilirim bazı php betiklerine sahibim ve bunun çok fazla hata olduğunu düşünüyorum. birleştirme ve SQL enjeksiyonu konusundaki sınırlı bilgilerim nedeniyle. İlk defa, hiç bir sorunum yok çünkü bu betik PHP-Mysql kullanıyor.

Ancak Interbase'e geçmeye çalıştığımda çok fazla sorunla karşılaşıyorum. Lütfen hatayı tanımlamak için yardım edin.

bu benim aşağıdaki sorgu:

$sLimit = ""; 
     if (isset($_POST['iDisplayStart'])) 
     { 
       $sLimit = " FIRST ".$_POST['iDisplayStart']." SKIP ".$_POST['iDisplayLength']; 
     } 
$sOrder =""; 
     $sOrder = " ORDER BY LINE_NAME "; 
$sWhere = ""; 
     if (postVar('sSearch') !="") 
     { 
       $sWhere = " WHERE (LINE_NAME LIKE '%".$_POST['sSearch']."%' OR 
           MODEL_ONLY LIKE '%".$_POST['sSearch']."%' OR ". 
           " VER_ONLY LIKE '%".$_POST['sSearch']."%' OR ". 
           " LOT_SIZE LIKE '%".$_POST['sSearch']."%' OR ". 
           " START_SERIAL LIKE '%".$_POST['sSearch']."%' OR ". 
           " SERIAL_NO_LOW LIKE '%".$_POST['sSearch']."%' OR ". 
           " SERIAL_NO_UP LIKE '%".$_POST['sSearch']."%' OR ". 
           " PROD_NO LIKE '%".$_POST['sSearch']."%' OR ". 
           " PROD_DATE LIKE '%".$_POST['sSearch']."%') "; 
     } 
$sQuery = "SELECT LINE_NAME, MODEL_ONLY, VER_ONLY, PROD_NO, 
        LOT_SIZE, START_SERIAL, SERIAL_NO_LOW, SERIAL_NO_UP, PROD_DATE 
      FROM DOC_TO".$sWhere.$sOrder.$sLimit.";"; 
$rResult = ibase_query($sQuery) or _doError(_ERROR30 . ' (<small>' . htmlspecialchars($sql) . '</small>): ' . ibase_errmsg()); 

$sQuery = "SELECT COUNT(*) FROM (SELECT LINE_NAME, MODEL_ONLY, VER_ONLY, PROD_NO, 
             LOT_SIZE, START_SERIAL, SERIAL_NO_LOW, SERIAL_NO_UP, PROD_DATE 
            FROM DOC_TO'.$sWhere.$sOrder.$sLimit.')"; 
$rResultFilterTotal = ibase_query($sQuery) or _doError(_ERROR30 . ' (<small>' . htmlspecialchars($sql) . '</small>): ' . ibase_errmsg()); 
$aResultFilterTotal = ibase_fetch_assoc($rResultFilterTotal); 
$iFilteredTotal = $aResultFilterTotal[0]; 

notlar: i avans concatenation.thanks hakkında daha fazla bilgi gerekir.


hatası:

Dynamic SQL Error SQL error code = -104 Token unknown - line 3, column 39 '.. ORDER BY LINE_NAME ..' 
+0

SO nasıl çalışır: belirli bir soru soruyorsunuz ve belirli bir yanıt alıyorsunuz. SO nasıl çalışır? İnsanlardan işini yapmasını istersiniz. – zerkms

+1

Ek Notlar: SQL enjeksiyon saldırıları hakkında bilgi edinin. Bu kod onlara açık. – David

+1

Burada bir yerde bir soru var mı? bir hata alıyor musun? –

cevap

-1

i AndreKR rehberliğinde gelen cevap bulduk:

$sLimit = ""; 
     if (isset($_POST['iDisplayStart'])) 
     { 
       settype($iDisplayStart,'integer'); 
       $iDisplayStart = $_POST['iDisplayStart']; 
       $iDisplayLength = $_POST['iDisplayLength']; 
       $sLimit = sprintf(" FIRST ".$iDisplayStart." SKIP ".$iDisplayLength); 
     } 

ve tüm $ _POST değiştirin: Geçen php sayfasına

$sQuery = "SELECT COUNT(*) FROM(......) 
into 
$sQuery = "SELECT COUNT(*) AS DCOUNT FROM DOC_TO".$sWhere.$sLimit.";"; //delete $sOrder 

$aResultFilterTotal = ibase_fetch_assoc($rResultFilterTotal); 
$iFilteredTotal = $aResultFilterTotal['DCOUNT']; //change from ......[0] 

ve ekleyin:

'%".$_POST['sSearch_0']."%' 
into 
''%".$_POST['sSearch_0']."%'' //this to prevent injection For databases Like Oracle, DB2, MS SQL, Firebird 

ve değişim :

3

o çalıştırabilir sanki görünüyor, bu nedenle başarısız olursa nasıl tarif edebilirsiniz.

Bununla birlikte, içinde bir hemen görünür bir hata: hatlarının

$sQuery = "SELECT COUNT(*) FROM (SELECT LINE_NAME, MODEL_ONLY, VER_ONLY, PROD_NO, 
             LOT_SIZE, START_SERIAL, SERIAL_NO_LOW, SERIAL_NO_UP, PROD_DATE 
            FROM DOC_TO'.$sWhere.$sOrder.$sLimit.')"; 

çift tırnak bir dize başlıyor ve siz işe yaramaz tek tırnak ile dize kesmek için denemek olarak. Yani kodu olmalıdır:

$sQuery = "SELECT COUNT(*) FROM (SELECT LINE_NAME, MODEL_ONLY, VER_ONLY, PROD_NO, 
             LOT_SIZE, START_SERIAL, SERIAL_NO_LOW, SERIAL_NO_UP, PROD_DATE 
            FROM DOC_TO".$sWhere.$sOrder.$sLimit.")"; 

kodunuzda önemli bir güvenlik kusur var ek olarak çevre bağlı: Örneğin doğrultusunda

$sLimit = " FIRST ".$_POST['iDisplayStart']." SKIP ".$_POST['iDisplayLength']; 

doğrudan koymak için $ _POST kullanıyor SQL enjeksiyon güvenlik deliğini açan bir SQL sorgusuna dönüştürülür.

+0

Ben PHP Uyarı var: Tanımsız ofset: 0 /var/www/html/showserial1.php satır 164, $: $ iFilteredTotal = $ aResultFilterTotal [0]; – klox

+0

SQL enjeksiyonunu engellemenin daha iyi yolu nedir? – klox

+1

bunu (muhtemelen "COUNT (*)") yerine sayısının bir adı vardır _fetch_assoc' böylece 'kullanılan çünkü muhtemelen $ aResultFilterTotal hiçbir indeks 0 yoktur çünkü bildirim yoktur. SQL enjeksiyon meselesi biraz daha karmaşıktır, ancak iyi bir başlangıç ​​'addslashes() Bir SQL sorgusunun gider' etrafında her değişken sarmak olacaktır. (O değişkenlerin sarmak için değil kendiniz öğrenmek Bakalım;.)) – AndreKR