2012-07-25 62 views
1

可能重複:
Best way to prevent SQL Injection in PHP何時使用mysqli_real_escape_string?

我想知道有關SQL注入,想知道何時使用mysqli_real_escape_string。

每次我在查詢中有WHERE子句時,是否需要使用它?

+0

你需要轉義特殊待遇SQL查詢中可能包含有害字符的所有參數。用戶輸入尤其如此。 – nickb 2012-07-25 15:23:58

+0

你應該幾乎總是使用綁定參數,而不是mysqli_real_escape_string – Quentin 2012-07-25 15:24:18

回答

2

對於來自用戶或不能被信任的任何數據,您應該使用mysqli_real_escape_string。

0

如果在查詢 中包含$ _REQUEST「vars」,則必須使用它。

$query = "UPDATE foo set bar = '{$_GET['var']}' ..." 

$query = "INSERT INTO foo ('{$_POST['var']}',) ..." 

$query = "SELECT bla from foo WHERE bar = '{$_COOKIE['var']}'" 

每本querys必須mysqli_real_escape_string提供打針......

+0

你的意思是我必須使用mysqli_real_escape_string,即使在更新語句的值如下:'$ query =「UPDATE foo set bar = mysqli_real_escape_string($ _ GET ['var']) ...「,也在WHERE子句中,例如:'$ query =」從foo中選擇bla WHERE bar = mysqli_real_escape_string($ _ COOKIE ['var'])「'? – jaypabs 2012-07-26 01:27:03

0

您使用mysqli_real_escape_string或它的任何變化,以確保數據形成任何用戶輸入字段正確轉義。

例如,您的表單只有幾個輸入。您點擊提交,數據將作爲請求發送到您的PHP腳本。在腳本中,您可以將用戶發佈的值插入到數據庫中。

如果用戶鍵入以下內容輸入域用戶登錄,例如:

' WHERE `username` = {x} AND password > 1; 

有潛力讓該人都從你正在使用的表中的數據。使用:

mysqli_real_escape_string($input) 

將產生上述爲:

\' WHERE `username` = {x} AND password > 1; 

上的逃逸字符串'將停止工作可能的SQL注入攻擊。

也就是說,沒有理由應該使用mysqli_real_escape_string()作爲PDO和綁定參數在偏轉大量不同的SQL攻擊/注入方法方面要優越得多。學習並使用它!

編輯,由於評價

%_也需要超越mysqli_real_escape_string()

function escape_extra_chars ($string) 
{ 
    $string = preg_replace("/\%/", "\%", $string); 
    $string = preg_replace("/\_/", "\_", $string); 

    return $string; 
} 

除了反正那些線(即FUNC是未經測試)

+0

嗨,我實際上使用我的另一個腳本準備好的聲明,但因爲我已經將大部分腳本從mysql移植到mysqli我有很多使用傳統編程的sql語句。所以不是使用準備好的語句,而是決定使用mysqli_query而不是修改我的所有代碼來使用準備好的語句。所以在此期間使用如下代碼是安全的:'mysqli_real_escape_string($ _ POST ['username'])'? – jaypabs 2012-07-26 01:20:30

+0

@jaypabs是的,你可以像這樣使用它,它將提供一個安全級別,但它不會轉義包含特殊字符的字符串:在LIKE子句中使用'%'和'_'。由於它們通常包含在查詢中的雙引號內,所以它們仍然是風險的。 (請參閱我的答案中的推薦信息) – 2012-07-26 08:35:24

+0

這是否意味着我們確實需要使用準備好的語句?發生了什麼'mysqli_query'? 'mysqli_query'已經沒用了嗎? – jaypabs 2012-07-26 08:38:11

相關問題