为了防止SQL注入,使用参数化查询是最有效的方式。以下是一个示例代码,演示如何在PHP中使用$_REQUEST获取参数,并通过PDO(PHP Data Objects)执行安全的SQL查询:
php代码
<?php
// 数据库连接配置
$dsn = 'mysql:host=localhost;dbname=testdb';
$username = 'root';
$password = '';
// 创建PDO实例并设置错误模式为异常
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;
// 使用参数化查询防止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 '参数id缺失';
}
?>
在这段代码中,我们使用PDO来创建数据库连接,并通过prepare和bindParam方法进行参数化查询,这样可以有效防止SQL注入攻击。
在PHP中使用$_REQUEST获取参数时,通常需要进行过滤和验证,以确保数据的安全性和有效性。以下是一个示例代码,演示如何对$_REQUEST参数进行基本的过滤:
php代码:
<?php
// 获取并过滤参数
$id = isset($_REQUEST['id']) ? trim($_REQUEST['id']) : null;
$name = isset($_REQUEST['name']) ? trim($_REQUEST['name']) : null;
// 过滤参数(避免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('无效的ID参数');
}
if ($name && !preg_match('/^[\p{L} ]+$/u', $name)) {
die('无效的名称参数');
}
// 继续处理过滤后的参数
echo 'ID: ' . htmlspecialchars($id, ENT_QUOTES, 'UTF-8') . '<br>';
echo 'Name: ' . htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . '<br>';
?>
在这段代码中,我们首先使用trim去除参数的前后空白,然后使用filter_var函数对参数进行基本的过滤。FILTER_SANITIZE_NUMBER_INT用于清理非数字字符,FILTER_SANITIZE_STRING用于清理HTML标签和特殊字符。接着,我们使用正则表达式和filter_var对参数进行验证,确保数据符合预期格式。最后,使用htmlspecialchars防止XSS攻击。