2016-08-18 98 views
0

我有一個發送到外部網站的用戶表單,並且來自該網站的響應包含唯一代碼(如「a87ju89y」)。該代碼對我來說很重要,所以使用準備好的語句將其輸入到我的數據庫中。第二階段SQL注入

在後端我有一個運行PHP腳本,查詢數據庫,看看是否有新的代碼這樣每分鐘一個cronjob:

$con = mysqli_connect($servername, $username, $password, $database); 
if (mysqli_connect_errno()){ 
echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
} 
$results = mysqli_query($con, "SELECT user FROM stack ORDER BY ID"); 
$cronresults = mysqli_query($con, "SELECT run FROM kook ORDER BY ID"); 
$row = mysqli_fetch_assoc($results); 
$cron = mysqli_fetch_assoc($cronresults); 
$row2 = $row['user']; 
$cron2 = $cron['kook']; 

我的問題是,我需要一份準備好的聲明簡單地提取信息並阻止某種SQL注入?如果我做我該怎麼做呢?

+0

第二級噴射時,另一個查詢。假設你從表中選擇了userdata,然後從userdata中刪除了userid ='。 $ row ['userdata']',期望'userdata'是一個id,但它實際上有'0或1 = 1'。現在所有數據都將消失。請參閱https://en.wikipedia.org/wiki/SQL_injection#Second_order_SQL_injection – chris85

+0

沒有什麼意義,謝謝! – electricjelly

+0

幾乎任何時候你傳遞一個值給SQL使用參數化查詢,不要只傳入它。 – chris85

回答

3

您不需要在這裏準備好聲明,因爲您沒有將任何數據傳遞到查詢中。準備好的語句將查詢分解爲查詢本身(使用佔位符)和要處理的數據。這樣就不會混淆什麼是數據和什麼是查詢。

選擇表中的所有行都不需要數據。

+0

太好了!真正簡單的答案我很感激它! – electricjelly

1

只有在需要將值插入查詢時,Prepared語句纔有用。這通常是在您有一個包含要搜索的值的WHERE子句時。在你的情況下,兩個查詢都沒有任何移動部分,所以沒有任何準備好的語句可以爲你做。

在一個側面說明,你可以做一些事情來改善你的腳本:

  • 兩個查詢合併爲一個效率:
  • 務必確認查詢已運行你獲取成功之前結果
  • 在SQL的末尾添加LIMIT 1如果當你在你的數據庫中直接使用的數據已經將只使用第一個結果
+0

感謝您的建議!即時通訊不知道如何去約1和2任何文件,我可以參考? – electricjelly

+0

@electricjelly兩個表中的'ID'字段(你指的是什麼)指的是同一個東西? – BeetleJuice

+0

不,他們都只是自動編號字段兩者之間沒有任何聯繫 – electricjelly

相關問題