2017-05-03 62 views
1
$id = $_GET['id']; 
$id = str_replace("'", "", $id); 
$sql = "select name from test where id='$id'"; 
$stmt = $conn->query($sql); 

由於上面的php代碼片段,它將用戶輸入中的所有單引號刪除,然後將其放在sql查詢中,它從用戶獲得的whaterver無法從引用周圍轉義出來,似乎從sql注入安全。我很好奇如何注入SQL代碼。從用戶輸入中刪除所有引號是否安全注入?

一些問題說關於轉義報價,它有實例來利用它。但在我的場合,刪除所有報價是不是真的一樣轉義

我知道有參數化查詢防止sql注入的方法。是的,單引號可能包含在合法數據中。我在求助於SQL注入時出於好奇而問這個問題,我只想知道是否有任何例子可以利用這些代碼?

+2

如果你正在考慮這樣做,不要。 *已知安全*防止SQL注入的方法是使用參數,並且很好的任何語言綁定這些天將有一些手段提供參數。任何其他地方,即使沒有人能夠*展示*今天的特定漏洞,您仍然在混合使用*數據*和*代碼*通過字符串連接是*潛在*易受攻擊的。 –

+2

當然,更不用說,*引號字符可能是合法的數據*。告訴某人他的姓氏不允許成爲「O'Brien」就行不通。 –

+0

http:// stackoverflow。com/questions/5520840/sql -injection-after-removed-all-single-quotes-and-dash-characters –

回答

0

如果你不想使用參數化或轉義,並假設你的id是一個整數,你可以使用類型轉換。這完全不是調用函數做字符串替換安全,更快速的代碼:

$id = (int) $_GET['id']; 
$sql = "select name from test WHERE id=$id"; 
$stmt = $conn->query($sql); 

但是你應該養成使用參數的習慣。它簡單快捷。它適用於字符串,即使字符串包含引號之類的特殊字符。

這是超級容易PDO,它需要的代碼只是一個額外的行:

$id = $_GET['id']; 
$sql = "select name from test WHERE id=?"; 
$stmt = $conn->prepare($sql); 
$stmt->execute([$id]); 

我的問題[是],是安全去除引號字符串字段?

不,不要這樣做。你無法安全地做到這一點。例如,反斜槓(\)?和其他特殊字符?

你知道爲什麼內部MySQL API https://dev.mysql.com/doc/refman/5.7/en/mysql-real-escape-string.html的轉義不僅僅是引號嗎?這是轉義字符的列表:

\, ', ", NUL (ASCII 0), \n, \r, and Control+Z 

那麼去除這些字符就足夠了嗎?不,你仍然需要考慮字符集和十六進制編碼的字符。

沒有理由這樣做。您已經有了更可靠的解決方案來確保SQL查詢的安全。

請不要關注您的刪除報價解決方案。這是不夠的。

+0

類型轉換是安全的'id'是一個整數字段,在我的問題中,刪除字符串字段的引號是否安全? – Nigelchiang

+0

@Nigelchiang,看看我上面的其他評論。 –