2010-05-23 58 views
3

可能重複:
Do I have to use mysql_real_escape_string if I bind parameters?快速庫MySQLi安全問題

我有相關的問題,一個快速的MySQLi安全...

例如,看看這個代碼(從用戶那裏獲得輸入,並根據數據庫檢查它是否存在用戶名/密碼組合):

$input['user'] = htmlentities($_POST['username'], ENT_QUOTES); 
$input['pass'] = htmlentities($_POST['password'], ENT_QUOTES); 

// query db 
if ($stmt = $mysqli->prepare("SELECT * FROM members WHERE username=? AND password = ?")) 
{ 
    $stmt->bind_param("ss", $input['user'], md5($input['pass'] . $config['salt'])); 
    $stmt->execute(); 
    $stmt->store_result(); 

    // check if there is a match in the database for the user/password combination 
    if ($stmt->num_rows > 0) 
    {} 
} 

在這種情況下,我在表單數據上使用htmlentities(),並使用MySQLi準備好的語句。我還需要使用mysql_real_escape_string()嗎?

+0

我想我還應該問......除了使用MySQLi準備的語句和htmlentities()還有什麼我應該做的,安全明智嗎? – 2010-05-23 19:08:26

+0

這不是編輯你的原始問題,但足夠好:) – 2010-05-23 19:11:06

+4

'htmlentities'旨在顯示給客戶端。你不應該真的在數據庫查詢中使用它 - 這是多餘的。 – ceejayoz 2010-05-23 19:11:36

回答

1

是的,因爲有非HTML相關的實體可能會導致真正的轉義字符串捕獲的數據庫的損害。像UTF-8字符一樣。

但正如您在使用mysqli prepare的評論中所述,這已經足夠了。

BTW MySQLi有it's own escape string function.如果你有興趣。

+0

雖然不會使用預先準備的語句修復程序?老實說,'htmlentities()'調用似乎沒有必要。我不確定他爲什麼這麼做,除非是因爲非數據庫原因 – 2010-05-23 19:06:44

+0

對不起yea沒有看到那裏的準備。是的,這是正確的。 – 2010-05-23 19:07:47

+0

如果我在頁面上顯示$ _POST數據,使用htmlentities()有意義,正確嗎? 但是,如果我只是使用MySQLi查詢中的$ _POST數據,MySQLi會自動轉義一切? – 2010-05-23 19:11:35

2

不,如果您使用預準備語句綁定參數,則不需要使用mysql_real_escape_string。實際上使用它會給你錯誤的結果,因爲轉義數據將被插入到數據庫中。當參數直接寫入SQL字符串而不使用參數時需要mysql_real_escape_string