2011-01-20 62 views
6

鑑於以下代碼,我需要轉義和消毒$city如果使用準備好的PHP/MySQL查詢,我需要清理輸入嗎?

<?php 
$mysqli = new mysqli("localhost", "my_user", "my_password", "world"); 

/* check connection */ 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

$city = "Amersfoort"; 

/* create a prepared statement */ 
if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) { 

    /* bind parameters for markers */ 
    $stmt->bind_param("s", $city); 

    /* execute query */ 
    $stmt->execute(); 

    /* bind result variables */ 
    $stmt->bind_result($district); 

    /* fetch value */ 
    $stmt->fetch(); 

    printf("%s is in district %s\n", $city, $district); 

    /* close statement */ 
    $stmt->close(); 
} 

/* close connection */ 
$mysqli->close(); 
?> 

使用準備好的查詢時是否需要清理任何輸入?

回答

8

@Gary: 您複製了直接從約mysqli的php.net手冊的代碼片段::準備。在同一頁面上是以下文本:

「準備好的語句的目的是不包含SQL語句中的數據,將它們包含在您的SQL語句中並不安全,請始終使用預準備語句,代碼更易於閱讀)並且不容易出現SQL注入。「

這是你的問題的答案;)

+4

樹木擋在樹林中。 ;) – 2011-01-20 21:37:09

+0

是的,但準備好的語句通常在應用程序層和數據層都需要更多的資源 - 當你看到有人說「總是使用準備好的語句」時要小心。 – Jmoney38 2013-09-24 11:41:05

1

另外。此外。

準備好的statemens如果使用正確,幾乎可以完全緩解SQL注入困境。但是,您應該在適當的地方格式化輸入數據。清潔輸入不是一項安全功能,但對健壯性和可用性而言是明智的。在你的$城市的情況下,你可能想去掉所有非單詞字符:

$city = trim(preg_replace("/[^\w-]+/", " ", $city)); 

再次:不更換數據庫逃逸或準備語句,但確保一致的數據進行工作。

0

我意識到這個問題很老。我自己搜索相同的信息時偶然發現了它。我會評論桑德的答案,但我沒有足夠的聲望來評論。

桑德說,你不需要消毒,但在http://www.w3schools.com/php/php_mysql_prepared_statements.asp(我知道w3schools並不總是一個完全的最新和準確的信息來源,但我覺得它的東西明智,易於他們說:「如果我們想從外部來源插入任何數據(比如用戶輸入),那麼對數據進行消毒和驗證是非常重要的。」

所以看來當使用表格和接受用戶輸入,你應該消毒。

相關問題