2010-02-17 27 views
17

Aşağıdaki kod var:Parametrelere bağlanırsam mysql_real_escape_string kullanmalı mıyım?

function dbPublish($status) 
{ 
global $dbcon, $dbtable; 

if(isset($_GET['itemId'])) 
{ 
    $sqlQuery = 'UPDATE ' . $dbtable . ' SET active = ? WHERE id = ?'; 
    $stmt = $dbcon->prepare($sqlQuery); 
    $stmt->bind_param('ii', $status, $_GET['itemId']); 
    $stmt->execute(); 
    $stmt->close(); 
} 
} 

Ben bu durumda mysql_real_escape_string veya i iyiyim gerekiyor mu? DB motoru kendisi yapacak:

+1

Yalnızca parametrelerin SQL enjeksiyonuna karşı bağışık olduğunu unutmayın; Değer, kullanıcı girdisinden geliyorsa, sorgu dizesine ("$ dbtable" gibi) doğrudan enterpolasyon yapılan herhangi bir değişken potansiyel bir vektördür. Tabii ki, tablo ve sütun adları gibi şeyler doğrudan kullanıcı girdisinden doğrudan gelmemelidir. – outis

cevap

27

Hayır, kendinizi sen hazırlanmış deyimleri kullanırken, (yani hayır mysqli_real_escape_string aramaya gerek yok) değerine kaçmak yok.

(eğer mysql_real_escape_string arayarak ve sınır parametreleri kullanılarak olsaydı Aslında, senin dizeleri iki kez kaçış alacağı - büyük olmaz ki: her yerde karakterleri kaçan ile bitirmek istiyorum ...)


Bir sidenote olarak: değerleriniz ('ii' ile belirtildiği gibi) olarak iletilir, bu nedenle hazır ifadeleri kullanmasanız bile mysql_real_escape_string'u aramak zorunda kalmazsınız: adının gösterdiği gibi, bu işlev kullanılır kaçmak ... dizeleri.

Tamsayılar için, SQL sorgularıma enjekte ettiğim verilerin gerçekten tamsayı olduğundan emin olmak için genellikle yalnızca intval kullanın.

(Ama, hazırlanan sorguları kullanarak gibi, bir kez daha, kendini kaçan bu tür yapmak zorunda değilsiniz)

1

Hayır, yapmamalısın. İkisini birleştirmek, verilerinizde görünen görünür kaçış karakterinde sonucunu verir.

0
function dbPublish($status)  
{  
global $dbcon, $dbtable;  

if(isset($_GET['itemId']))  
{  
    $sqlQuery = 'UPDATE ' . $dbtable . ' SET active = ? WHERE id = ?';  
    $stmt = $dbcon->prepare($sqlQuery);  
    $stmt->bind_param('ii', $status, $_GET['itemId']);  
    $stmt->execute();  
    $stmt->close();  
}  
} 
İlgili konular