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