题目
如何安全地处理用户提交的表单数据?
信息
- 类型:问答
- 难度:⭐
考点
表单安全, 数据过滤, SQL注入防护
快速回答
安全处理表单数据的关键步骤:
- 使用
htmlspecialchars()转义 HTML 特殊字符 - 使用
trim()去除多余空格 - 使用
filter_input()或filter_var()验证过滤 - 数据库操作使用预处理语句(PDO/mysqli)
为什么需要安全处理?
用户提交的数据可能包含恶意代码(如 XSS 攻击)或 SQL 注入语句,直接使用会导致安全漏洞。
处理步骤详解
- 接收数据
$username = $_POST['username'] ?? ''; - 去除空白
$username = trim($username); - 转义 HTML 字符(防 XSS)
$safe_username = htmlspecialchars($username, ENT_QUOTES, 'UTF-8'); - 验证过滤(示例邮箱验证)
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if (!$email) { die('邮箱格式错误'); } - 数据库操作(防 SQL 注入)
// PDO 示例
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$stmt->execute(['email' => $email]);
$user = $stmt->fetch();
最佳实践
- 始终假定用户输入不可信
- 根据数据类型使用特定过滤器(如
FILTER_VALIDATE_INT验证数字) - 输出到 HTML 前必须转义
- 避免使用已废弃的
mysql_*函数
常见错误
- 直接拼接 SQL 查询:
$sql = "SELECT * FROM users WHERE name='$_POST[name]'"; - 未转义直接输出 HTML:
<div><?= $_POST['content'] ?></div> - 依赖
magic_quotes_gpc(PHP 5.4 已移除)
扩展知识
- CSRF 防护:表单增加 token 验证
- 文件上传:检查 MIME 类型、重命名文件
- 密码存储:使用
password_hash()加密