首先,這是一個可怕的方式來做到這一點,你很容易進行SQL注入,並且使用GET字面上只是將查詢標記到網址的末尾,這很容易被潛在的黑客或任何用戶獲得,作爲事實。使用POST代替一些jQuery魔法,我也會推薦使用Ajax,這樣你就不會被重定向到php文件,它會運行。因爲不是任何人都可以訪問該URL並刪除用戶,所以我建議使用PHP SESSIONS,以便只有來自您的站點的用戶才能刪除用戶。也簡單地將id傳遞給PHP文件是非常不安全的,因爲任何人都可以簡單地在他們的網站上創建一個到你的php文件的鏈接並刪除用戶。
因此試試這個修復您的代碼(增加了安全性):
請注意:我知道這可能不是最好的方式,也不是最糟糕的,但它是行之有效一個相當安全的方法。
你的主要頁面,index.php文件:
<?php
session_start();
// Create a new random CSRF token.
if (! isset($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = base64_encode(openssl_random_pseudo_bytes(32));
}
// Check a POST is valid.
if (isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
// POST data is valid.
}
?>
...
<form id="delete_user_form" action="delete_user.php" method="post">
<input type="hidden" name="user_id" value="<?php echo $user_name; ?>" />
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>" />
<input type="submit" value="Delete User" />
</form>
在你。js文件(請確保您有jQuery的鏈接):
window.csrf = { csrf_token: $("input[name= csrf_token]").val() };
$.ajaxSetup({
data: window.csrf
});
$("#delete_user_form").submit(function(event) {
event.preventDefault(); //Stops the form from submitting
// CSRF token is now automatically merged in AJAX request data.
$.post('delete_user.php', { user_id: $("input[name=user_id]").val() }, function(data) {
//When it it's complete this is run
console.log(data); //With this you can create a success or error message element
});
});
現在爲您delete_user.php文件,這樣就可以解決的錯誤:
<?php
session_start();
require "connection.php";
// Checks if csrf_token is valid
if (isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
if(isset($_POST['user_id']) && $_POST['user_id'] != ""){
$user_name = $_POST['user_id'];
$sql = "DELETE FROM users WHERE user_name = '$user_name' LIMIT 1"; //LIMIT 1 only allows 1 record to be deleted
if ($conn->query($sql) === TRUE) {
echo "Record deleted successfully"; //You get this in your javascript output data variable
} else {
echo "Error deleting record: " . $conn->error; //You get this in your javascript output data variable
}
$conn->close();
}
}
?>
我不知道你connection.php包含所以這是我把它放在:
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
**警告**:當使用'mysqli'你應該使用[參數化查詢](http://php.net/manual/en/mysqli .quickstart.prepared-statements.php)和['bind_param'](http://php.net/manual/en/mysqli-st mt.bind-param.php)將用戶數據添加到您的查詢中。 **不要**使用字符串插值或連接來完成此操作,因爲您創建了嚴重的[SQL注入漏洞](http://bobby-tables.com/)。 **不要**將'$ _POST','$ _GET'或**任何**用戶數據直接放入查詢中,如果有人試圖利用您的錯誤,這可能會非常有害。 – tadman
注意:'mysqli'的面向對象的接口明顯不那麼冗長,使得代碼更易於閱讀和審計,並且不容易與陳舊的'mysql_query'接口混淆。在你過於投入程序風格之前,它是值得轉換的。例如:'$ db = new mysqli(...)'和'$ db-> prepare(「...」)過程接口是PHP4時代的一個神器,當引入mysqli API時,不應該在新的代碼 – tadman
很多問題都可以通過[在mysqli中啓用例外]來檢測和解決(https://stackoverflow.com/questions/14578243/turning-query-errors-to-exceptions-in-mysqli),所以錯誤不容易被忽略 – tadman