2012-08-15 60 views
1

在我的登錄表單1散列用戶名和密碼之前,我執行查詢防止SQL注入通過轉換字符串數組

... ...類

private $username; 
private $password; 
protected function Login(){ 
    $user = hash('sha256', $this->username); 
    $pass = hash('sha256', $this->password); 
    $this query = "..." 
    ... 
} 

和其他種類的形式(像搜索表單)我轉換成數組中的字符串,然後我執行查詢,這樣的查詢應該是這樣的:

$searchstring = explode(' ', $search); 
//.... Some lines of PHP code... and the resulting query is: ... 
$this->query = "SELECT... WHERE name LIKE 'DELETE%' OR name LIKE 'FROM%' "; 
$this->query.= " OR name LIKE 'USERS%' OR name LIKE 'WHERE%' OR name LIKE '1%'"; 

這是否足以防止SQL注入?謝謝

+7

請勿使用addslashes()。如果您使用PDO或mysqli使用數據綁定功能。如果你正在使用mysql_ *函數(你不應該)使用mysql_real_escape_string()。 – bobwienholt 2012-08-15 21:31:24

+0

使用[mysql函數來轉義字符串](http://ua2.php.net/manual/en/mysqli.real-escape-string.php)或PDO庫(我個人比較喜歡) – pinepain 2012-08-15 21:33:24

+0

@sudowned我覺得嘔吐。 – 2012-08-15 21:41:08

回答

5

不要相信你自己的能力來防止SQL注入!比你的頭更好的頭已經落到了它的頭上。

使用mysqli或PDO和參數化查詢。這也有利於您的數據庫緩存查詢計劃。

+0

更多評論比回答恕我直言。 – hakre 2012-08-15 21:34:43

+1

有時你不能說「這是一種安全的方式來做這件令人難以置信的不安全的事情。」 – 2012-08-15 21:35:54

+5

+1:他們總是試圖重新發明輪子的極客們是什麼? – MatBailie 2012-08-15 21:36:21

0

有一些可以採取使代碼更安全非常簡單的步驟:

$query= mysqli_real_escape_string($database_connection, $user) 

這個逃逸的任何危險字符會反過來在這個步驟中,我們增加SQL字符串

$query = mysqli_real_escape_string($database_connection, trim($user)) 

影響修剪功能取出任何白色空格 - 用於啓動SQL注入攻擊

您可以看到更多關於此的信息here

0

另外,您可以將其轉換爲二進制:

function mssql_escape($data) { 
    if(is_numeric($data)) 
     return $data; 
    $unpacked = unpack('H*hex', $data); 
    return '0x' . $unpacked['hex']; 
} 

...如果萬一你不在mysql分貝。