2013-09-21 63 views
0

我正在使用預準備語句將數據輸入到數據庫中,但我沒有使用預準備語句來獲取數據。原因是代碼稍小,從我讀的代碼看,代碼稍快一點。這有沒有什麼安全問題?抓取mysqli數據和安全

例如:

來插入數據;

$stmt = mysqli_prepare($con, "INSERT USERS (userFname) (VALUES (?)"); 
mysqli_stmt_bind_param($stmt, 's', $userFname); 
mysqli_stmt_execute($stmt); 
mysqli_stmt_close($stmt); 

獲取數據;

$query = mysqli_query($con,"SELECT * FROM users WHERE userEmail = '$userEmail'"); 

這種方法與使用預處理語句獲取數據一樣安全嗎?

+1

你應該**總是**使用準備好的語句。沒有例外。 –

+0

我將更改我的代碼,謝謝。 – Medeno

回答

0

在您的例子,可以說有一個登錄表單

<input type="email" name="email"><button type="submit">login</button> 

你的PHP腳本運行:

<?php 
$email = $_POST['email']; 
$query = mysqli_query($con,"SELECT * FROM users WHERE userEmail = '$email'"); 

所以,這裏是一個攻擊向量,其中有人能做到「有趣的東西」與您數據庫。

現在,如果您的腳本從不與用戶輸入接觸,並且它只能通過從記錄中獲取電子郵件來循環運行,然後獲取相信您的用戶可能認爲您是安全的。
但是你在那裏有多少安全?

你有一個表newsletter_signups

id| email          | registered 
1 | [email protected]      | 2017-04-02 
2 | [email protected]');Drop table `users`;-- | 2017-05-01 

,並開始通過它循環。

foreach($newsletter_records as $record) { 
    $email = $record['email']; 
    $query = mysqli_query($con,"SELECT * FROM users WHERE userEmail = '$email'"); 
    ... etc... 
} 

你可以想象會造成的痛苦。

總之。永遠不要信任數據以保證安全。
對數據有偏執,並始終使用準備好的語句。它應該是你的默認路線。即使它100%安全。
增加的好處是,您通常可以重新使用準備好的語句,只需更換變量,使代碼運行得更快。