2009-07-22 31 views
1

這是最好的方法嗎?使用mysql_real_escape_string清除我的查詢

我應該對每個查詢中的每個值都這樣做嗎? GET和POST?

addslashes(mysql_real_escape_string())矯枉過正?

+0

[停止SQL注入PHP的最佳方法](http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php) – outis 2012-03-26 02:07:18

回答

6

如果你使用的是mysql_query(),那麼是的,mysql_real_escape_string()是最好的方法。是的,你必須將它應用到你混入你的sql語句的每個參數。例如。

$query = " 
    SELECT 
    x,y,z 
    FROM 
    foo 
    WHERE 
    a = '". mysql_real_escape_string($_POST['a'], $mysql) . "' 
    AND b = '". mysql_real_escape_string($_POST['b'], $mysql) . "' 
"; 

但是,您也可以使用準備好的語句,例如,與pdo模塊。這些參數是從sql語句中分離出來的,因此不需要轉義。它更安全(因爲你不能忘記逃跑或做錯了/錯誤的字符集),往往比參數混合語句更快,甚至更簡單。例如

$pdo = new PDO('mysql:host=localhost;dbname=test', '..', '..'); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$stmt = $pdo->prepare(" 
    INSERT INTO 
    foo (x,y,z) 
    VALUES 
    (:x,:y,:z) 
"); 

$stmt->bindParam(':x', $x); 
$stmt->bindParam(':y', $y); 
$stmt->bindParam(':z', $z); 

// insert all records (0,0,0) ... (0,1,0) ... (9,9,9) 
for($x=0; $x<10; $x++) { 
    for($y=0; $y<10; $y++) { 
    for($z=0; $z<10; $z++) { 
     $stmt->execute(); 
    } 
    } 
} 

編輯:和addslashes(mysql_real_escape_string())不僅是矯枉過正,但也是錯誤的。

+1

+1用於提示準備好的報表/ PDO – karim79 2009-07-22 19:31:45

1

您需要在腳本中建立一個mysql連接以使用mysql_real_escape_string()。

您是否嘗試過PDO?
它可以自動防止mysql注入攻擊。

$db = new PDO("mysql:host=$dbhost;dbname=$default_dbname", $dbusername, $dbuserpassword); 

$st = $db->prepare ('SELECT * from my_table WHERE owner= ? and dog = ?'); 
$st->execute (array('Bob', 'Rex')); 

$data = $st->fetchAll(); 

雖然可能想在輸出上使用htmlentities()。

相關問題