您的代碼很容易受到SQL注入不同屬性的枚舉,你永遠不應該直接使用用戶輸入到SQL查詢。在你的代碼的問題是在這裏:
$clientid = $_POST['client']; // anyone could manipulate this field to inject malicious code
# ...
WHERE clientid='$clientid'";
檢查了$ _POST值[ '客戶']是發生了什麼:'或1 = 1;
接下來,如其中一條評論中提到的停止使用已棄用的方法,而是例如您可以使用mysqli。下面是如何使用mysqli的預處理語句,以避免SQL注入一個例子:
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$stmt = $conn->prepare('SELECT * FROM `pfs` JOIN `pfssurety` ON condition JOIN `iso` ON condition JOIN `incometax` ON condition WHERE clientid = ?');
$stmt->bind_param('i', $clientid);
$stmt->execute();
$stmt->close();
$conn->close();
已準備語句是用於以高效率重複執行相同(或相似)的SQL語句的功能。
相比於直接執行SQL語句,預處理語句主要有三個優點:
預處理語句大大減少了分析時間,對查詢準備做一次(但語句執行多次)
綁定參數減少帶寬的服務器,因爲你需要每次只傳送參數,而不是整個查詢
準備語句的對於SQL注入非常有用,因爲稍後使用不同協議傳輸的參數值無需正確轉義。如果原始語句模板不是從外部輸入派生的,則SQL注入不會發生。
最後一兩件事值得一提,儘量不要使用*獲取所有列,而不是簡單地列出你需要得到的列。即使您需要獲取所有列,爲什麼不使用*也有很好的理由,而是列出所有列。
開始你錯過了'on'子句 – Jens
**使用不推薦使用的'mysql_ *'API停止**。使用'mysqli_ *'或'PDO' – Jens
這不會起作用當你使用JOIN時,你需要使用ON子句 和mysql_query,mysql_fetch_array()將不起作用,你需要使用mysqli _.... –