跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
PHP输入验证
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= PHP输入验证 = '''PHP输入验证'''是PHP安全编程的核心概念之一,用于确保用户提交的数据符合预期格式,防止恶意输入导致的安全漏洞(如SQL注入、XSS攻击等)。本文将详细介绍输入验证的基本原理、常见方法及实际应用。 == 概述 == 输入验证是指对用户提交的数据进行检查,确保其格式、类型和范围符合应用程序的要求。在PHP中,输入可以来自: * '''GET/POST请求''' * '''Cookies''' * '''文件上传''' * '''数据库查询结果''' * '''API响应''' 有效的输入验证能够: * 防止代码注入攻击 * 减少数据错误 * 提升用户体验 == 基本验证方法 == === 1. 类型检查 === PHP提供多种函数检查变量类型: * <code>is_int()</code>, <code>is_float()</code>, <code>is_string()</code>, <code>is_array()</code>, <code>is_bool()</code> <syntaxhighlight lang="php"> $age = $_POST['age']; if (!is_numeric($age)) { die("年龄必须是数字!"); } </syntaxhighlight> === 2. 格式验证 === 使用正则表达式(<code>preg_match</code>)验证复杂格式,如邮箱、URL等: <syntaxhighlight lang="php"> $email = $_POST['email']; if (!preg_match("/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/", $email)) { die("邮箱格式无效!"); } </syntaxhighlight> === 3. 长度检查 === 使用<code>strlen()</code>限制输入长度: <syntaxhighlight lang="php"> $username = $_POST['username']; if (strlen($username) < 3 || strlen($username) > 20) { die("用户名长度必须在3-20个字符之间!"); } </syntaxhighlight> == 高级验证技术 == === 白名单与黑名单 === * '''白名单''':只允许已知安全的字符(推荐) * '''黑名单''':阻止已知危险的字符(易漏判) <syntaxhighlight lang="php"> // 白名单示例:只允许字母和数字 $input = $_POST['input']; if (!preg_match("/^[a-zA-Z0-9]+$/", $input)) { die("只允许字母和数字!"); } </syntaxhighlight> === 过滤函数 === PHP内置过滤函数(<code>filter_var</code>): * <code>FILTER_VALIDATE_EMAIL</code> * <code>FILTER_VALIDATE_URL</code> * <code>FILTER_VALIDATE_IP</code> <syntaxhighlight lang="php"> $url = $_POST['website']; if (!filter_var($url, FILTER_VALIDATE_URL)) { die("URL格式无效!"); } </syntaxhighlight> == 实际案例 == === 案例1:用户注册表单验证 === 验证用户名、密码和邮箱: <syntaxhighlight lang="php"> $username = $_POST['username']; $password = $_POST['password']; $email = $_POST['email']; // 用户名:4-20字符,仅字母数字 if (!preg_match("/^[a-zA-Z0-9]{4,20}$/", $username)) { die("用户名无效!"); } // 密码:至少8字符,含大小写和数字 if (!preg_match("/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/", $password)) { die("密码需至少8字符,包含大小写和数字!"); } // 邮箱验证 if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { die("邮箱格式无效!"); } echo "注册成功!"; </syntaxhighlight> === 案例2:文件上传验证 === 验证文件类型和大小: <syntaxhighlight lang="php"> $allowed_types = ['image/jpeg', 'image/png']; $max_size = 2 * 1024 * 1024; // 2MB if (!in_array($_FILES['file']['type'], $allowed_types)) { die("只允许JPEG和PNG图片!"); } if ($_FILES['file']['size'] > $max_size) { die("文件大小不能超过2MB!"); } move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . basename($_FILES['file']['name'])); </syntaxhighlight> == 输入验证流程图 == <mermaid> graph TD A[接收用户输入] --> B{是否为空?} B -->|是| C[返回错误] B -->|否| D[类型检查] D --> E{类型正确?} E -->|否| C E -->|是| F[格式验证] F --> G{格式正确?} G -->|否| C G -->|是| H[长度/范围检查] H --> I{检查通过?} I -->|否| C I -->|是| J[处理安全数据] </mermaid> == 数学验证示例 == 对于需要数学验证的场景(如验证ISBN号码),可使用校验和公式: <math> \text{ISBN-10校验和} = (10x_1 + 9x_2 + 8x_3 + \dots + 1x_{10}) \mod 11 = 0 </math> PHP实现: <syntaxhighlight lang="php"> function validateIsbn10($isbn) { if (strlen($isbn) != 10) return false; $sum = 0; for ($i = 0; $i < 10; $i++) { $sum += (10 - $i) * $isbn[$i]; } return ($sum % 11) === 0; } </syntaxhighlight> == 最佳实践 == 1. '''始终在服务器端验证'''(客户端验证可被绕过) 2. '''使用预处理语句'''防止SQL注入 3. '''转义输出'''防止XSS攻击 4. '''记录验证失败'''用于安全审计 5. '''提供清晰的错误信息'''(但避免泄露系统细节) 通过以上方法,您可以构建更安全、更健壮的PHP应用程序。 [[Category:编程语言]] [[Category:PHP]] [[Category:PHP安全编程]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)