2011-08-29 60 views
-4

可能重複:
MySQL Syntax error. Can't solve it需要幫助提高PHP和MySQL安全

任何人都可以改善這個代碼,因此它是安全的,並使用預處理語句?

$sql= "INSERT INTO users 
(level,fname, mname, lname, dob, age, reg_date, phone, email, login, pwd, type, `group`, region, school, class, ip, subject, ban, university, profession, activation_code) 
VALUES 
('1','$data[fname]', '$data[mname]', '$data[lname]', '$dob', '$age', now(), '$data[phone]', '$email', '$login', '$pwd', '$type', '$group', '$region', '$school', '$class', '$ip', '$subject', NULL, '$university', '$profession', '$activ_code')"; 
$result = $db->query($sql) or die(printf("Error: %s\n", $db->error)); 
$id = $db->insert_id; 
$md5_id = md5($id); 
$db->query("update users set md5_id='$md5_id' where id='$id'"); 
// echo "<h3>Thank You</h3> We received your submission."; 


?> 
+0

什麼是錯誤? –

+3

我們應該猜測這有什麼問題?你得到一個PHP錯誤?一個Mysql錯誤?壞數據進入數據庫? –

+0

@Marc B. $ id = $ db-> insert_id;部分有點「危險」。如果有多個用戶同時註冊?我需要使用語句。但我不熟悉他們這就是爲什麼尋求幫助 –

回答

2

如果我們假設所有的直接變量都填充了用戶生成的內容,那麼您的代碼對於sql注入是敞開的。相反,使用準備聲明並bind_param()自動設置正確的安全設置/轉義:

$stmt = $dbh->prepare(
    "INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); 
$stmt->bindParam('name', $name); 
$stmt->bindParam('value', $value); 
mysqli_stmt_execute($stmt); 
1

如何定義列? MySQL只使用單引號字符串,嘗試從非字符串字段(level,dob,age)中取出它們。