2013-04-05 79 views
0

什麼是消毒這個最簡單,最有效的方法:消毒一些SQL查詢

$q = "SELECT * FROM `admin` " 
."WHERE `username`=' ".$_POST["username"]."' " 
."AND `passcode`=' ".$_POST["password"]."' " 

而且,我學習PHP的,所以如果可以,請提供解釋,提示,建議,或多種方式來清潔最多的東西,以防止將最讚賞

+1

使用PDO或mysqli並查看準備好的語句。他們都有清理選項,將有據可查。 – 2013-04-05 02:53:01

+0

使用mysql_real_escape_string – 2013-04-05 02:53:54

+1

除了清理查詢之外,您應該考慮散列和醃製密碼,而不是以純文本形式存儲它們。 – Blorgbeard 2013-04-05 02:54:23

回答

1

我喜歡用$ mysqli的prepared statements SQL注入 - 這裏是從PHP網站爲例:

解釋(使用你的代碼中看到的一個例子底部):

?標記替換查詢中的變量,然後在bind之後用bind變量。

$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(); 

示例使用您的代碼:

$q = "SELECT * FROM `admin` " 
."WHERE `username`= ? AND passcode = ?"; 


/* create a prepared statement */ 
    if ($stmt = $mysqli->prepare($q)) { 

     /* bind parameters for markers */ 
     $stmt->bind_param("ss", $_POST['username'], $_POST['password']); 

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

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

     /* fetch value */ 
     $stmt->fetch(); // This can also be while($stmt->fetch()){ Code here } 

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

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

    /* close connection */ 
    $mysqli->close(); 
+0

我相信你試圖讓示例代碼很糟糕。另外我會使用PDO mysqli不是很好。 – lemondrop 2013-04-05 02:59:08

+0

「使用你的代碼的例子」*在頂部拋出$ q =行並且什麼都不做*哦,看看我這樣的巨魔 – lemondrop 2013-04-05 03:05:11

+0

無論如何這個話題已經死了,反正沒有任何意義。 – lemondrop 2013-04-05 03:11:09

0

如果你真的必須知道它會是這樣的:

$q = "SELECT * FROM `admin` " 
."WHERE `username`=' ".mysql_real_escape_string($_POST["username"])."' " 
."AND `passcode`=' ".mysql_real_escape_string($_POST["password"])."' " 

但正如有人說,你應該使用最有可能的PDO或mysqli,因爲所有mysql_命令都被棄用。