為了防止SQL注入,使用參數化查詢(xún)是最有效的方式。以下是一個(gè)示例代碼,演示如何在PHP中使用$_REQUEST獲取參數,并通過(guò)PDO(PHP Data Objects)執行安全的SQL查詢(xún):
php代碼
<?php
// 數據庫連接配置
$dsn = 'mysql:host=localhost;dbname=testdb';
$username = 'root';
$password = '';
// 創(chuàng )建PDO實(shí)例并設置錯誤模式為異常
try {
$pdo = new PDO($dsn, $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die('數據庫連接失敗: ' . $e->getMessage());
}
// 從請求中獲取參數
$id = isset($_REQUEST['id']) ? $_REQUEST['id'] : null;
// 使用參數化查詢(xún)防止SQL注入
if ($id !== null) {
$sql = 'SELECT * FROM users WHERE id = :id';
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 輸出查詢(xún)結果
echo '<pre>';
print_r($result);
echo '</pre>';
} else {
echo '參數id缺失';
}
?>
在這段代碼中,我們使用PDO來(lái)創(chuàng )建數據庫連接,并通過(guò)prepare和bindParam方法進(jìn)行參數化查詢(xún),這樣可以有效防止SQL注入攻擊。
在PHP中使用$_REQUEST獲取參數時(shí),通常需要進(jìn)行過(guò)濾和驗證,以確保數據的安全性和有效性。以下是一個(gè)示例代碼,演示如何對$_REQUEST參數進(jìn)行基本的過(guò)濾:
php代碼:
<?php
// 獲取并過(guò)濾參數
$id = isset($_REQUEST['id']) ? trim($_REQUEST['id']) : null;
$name = isset($_REQUEST['name']) ? trim($_REQUEST['name']) : null;
// 過(guò)濾參數(避免SQL注入和XSS攻擊)
$id = filter_var($id, FILTER_SANITIZE_NUMBER_INT);
$name = filter_var($name, FILTER_SANITIZE_STRING);
// 驗證參數(根據需求調整驗證規則)
if ($id && filter_var($id, FILTER_VALIDATE_INT) === false) {
die('無(wú)效的ID參數');
}
if ($name && !preg_match('/^[\p{L} ]+$/u', $name)) {
die('無(wú)效的名稱(chēng)參數');
}
// 繼續處理過(guò)濾后的參數
echo 'ID: ' . htmlspecialchars($id, ENT_QUOTES, 'UTF-8') . '<br>';
echo 'Name: ' . htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . '<br>';
?>
在這段代碼中,我們首先使用trim去除參數的前后空白,然后使用filter_var函數對參數進(jìn)行基本的過(guò)濾。FILTER_SANITIZE_NUMBER_INT用于清理非數字字符,FILTER_SANITIZE_STRING用于清理HTML標簽和特殊字符。接著(zhù),我們使用正則表達式和filter_var對參數進(jìn)行驗證,確保數據符合預期格式。最后,使用htmlspecialchars防止XSS攻擊。