一、預(yù)處理語(yǔ)句(Prepared Statements)

預(yù)處理語(yǔ)句是防止SQL注入攻擊的最有效方法之一。預(yù)處理語(yǔ)句是一種將參數(shù)與SQL語(yǔ)句分開的方式,從而避免了惡意代碼被添加到SQL語(yǔ)句中。在PHP中,可以使用PDO(PHP Data Objects)擴(kuò)展來(lái)實(shí)現(xiàn)預(yù)處理語(yǔ)句。

以下是一個(gè)使用PDO實(shí)現(xiàn)預(yù)處理語(yǔ)句的示例:

$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // 設(shè)置 PDO 錯(cuò)誤模式為異常
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // 準(zhǔn)備 SQL 并綁定參數(shù)
    $stmt = $conn->prepare("INSERT INTO users (firstname, lastname, email) VALUES (:firstname, :lastname, :email)");
    $stmt->bindParam(':firstname', $firstname);
    $stmt->bindParam(':lastname', $lastname);
    $stmt->bindParam(':email', $email);
    // 為變量賦值
    $firstname = "John";
    $lastname = "Doe";
    $email = "john@example.com";
    // 執(zhí)行語(yǔ)句并獲取結(jié)果
    $stmt->execute();
} catch(PDOException $e) {
    echo "Error: " . $e->getMessage();
}
$conn = null;

二、過(guò)濾用戶輸入(Input Filtering)

雖然預(yù)處理語(yǔ)句可以防止大多數(shù)SQL注入攻擊,但仍然存在一定的風(fēng)險(xiǎn)。因此,在將用戶輸入傳遞給數(shù)據(jù)庫(kù)之前,對(duì)輸入進(jìn)行過(guò)濾是很有必要的??梢允褂肞HP內(nèi)置的filter_input()函數(shù)來(lái)過(guò)濾用戶輸入,例如去除特殊字符、限制輸入長(zhǎng)度等。

以下是一個(gè)使用filter_input()函數(shù)過(guò)濾用戶輸入的示例:

function cleanInput($data) {
    $data = trim($data); //去除兩端空格
    $data = stripslashes($data); //去除反斜杠轉(zhuǎn)義字符
    $data = htmlspecialchars($data); //轉(zhuǎn)換HTML字符實(shí)體為對(duì)應(yīng)的字符
    return $data;
}
// 在獲取表單數(shù)據(jù)時(shí)調(diào)用cleanInput()函數(shù)過(guò)濾輸入
$firstname = cleanInput($_POST['firstname']);
$lastname = cleanInput($_POST['lastname']);
$email = cleanInput($_POST['email']);

三、輸出編碼(Output Escaping)

輸出編碼是防止XSS攻擊的一種常用方法。XSS攻擊是指攻擊者通過(guò)在Web頁(yè)面中添加惡意的HTML代碼,從而在用戶的瀏覽器中執(zhí)行這些代碼。為了防止XSS攻擊,可以使用PHP內(nèi)置的htmlspecialchars()函數(shù)對(duì)輸出內(nèi)容進(jìn)行編碼。

以下是一個(gè)使用htmlspecialchars()函數(shù)輸出編碼的示例:

function outputHtml($data) {
    return htmlspecialchars($data, ENT_QUOTES, 'UTF-8'); //轉(zhuǎn)換特殊字符為HTML實(shí)體,并指定字符集為UTF-8
}

防止SQL注入攻擊需要綜合運(yùn)用多種方法,包括預(yù)處理語(yǔ)句、輸入過(guò)濾和輸出編碼等。通過(guò)這些方法,可以有效地保護(hù)網(wǎng)站的安全,防止黑客利用SQL注入攻擊竊取、篡改或刪除數(shù)據(jù)庫(kù)中的數(shù)據(jù)。