跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
PHP SQL注入防护
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
Admin
(
留言
|
贡献
)
2025年5月2日 (五) 00:28的版本
(Page creation by admin bot)
(差异) ←上一版本 |
已核准修订
(
差异
) |
最后版本
(
差异
) |
下一版本→
(
差异
)
警告:您正在编辑该页面的旧版本。
如果您发布该更改,该版本后的所有更改都会丢失。
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= PHP SQL注入防护 = SQL注入(SQL Injection)是Web应用程序中最常见的安全漏洞之一,攻击者通过构造恶意的SQL查询语句,绕过应用程序的安全机制,从而获取、篡改或删除数据库中的数据。PHP作为广泛使用的服务器端语言,其与数据库的交互频繁,因此掌握SQL注入防护技术至关重要。 == 什么是SQL注入? == SQL注入是指攻击者通过在用户输入中插入恶意的SQL代码,使得应用程序执行非预期的数据库操作。例如,攻击者可能通过表单输入、URL参数或HTTP头部注入SQL片段,导致数据库泄露敏感信息或执行危险操作。 === 示例场景 === 假设有一个简单的登录表单,PHP代码直接拼接用户输入构造SQL查询: <syntaxhighlight lang="php"> $username = $_POST['username']; $password = $_POST['password']; $sql = "SELECT * FROM users WHERE username='$username' AND password='$password'"; $result = $conn->query($sql); </syntaxhighlight> 如果攻击者输入以下内容: * '''username''': <code>' OR '1'='1</code> * '''password''': <code>' OR '1'='1</code> 最终SQL语句变为: <syntaxhighlight lang="sql"> SELECT * FROM users WHERE username='' OR '1'='1' AND password='' OR '1'='1' </syntaxhighlight> 由于条件 <code>'1'='1'</code> 恒为真,攻击者无需有效凭证即可登录系统。 == SQL注入的危害 == * '''数据泄露''':攻击者可读取数据库中的敏感信息(如用户密码、个人数据)。 * '''数据篡改''':攻击者可修改或删除数据,破坏数据完整性。 * '''权限提升''':攻击者可能利用数据库漏洞获取更高权限(如管理员权限)。 * '''服务器控制''':某些情况下,攻击者可通过数据库执行系统命令,控制服务器。 == 防护措施 == === 1. 使用预处理语句(Prepared Statements) === 预处理语句是防止SQL注入的最有效方法。它通过参数化查询,将用户输入与SQL逻辑分离,确保输入始终被视为数据而非代码。 ==== PDO示例 ==== <syntaxhighlight lang="php"> $stmt = $conn->prepare("SELECT * FROM users WHERE username = :username AND password = :password"); $stmt->bindParam(':username', $username); $stmt->bindParam(':password', $password); $stmt->execute(); </syntaxhighlight> ==== MySQLi示例 ==== <syntaxhighlight lang="php"> $stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?"); $stmt->bind_param("ss", $username, $password); $stmt->execute(); </syntaxhighlight> === 2. 输入验证与过滤 === 即使使用预处理语句,也应验证用户输入是否符合预期格式(如邮箱、电话号码等)。 <syntaxhighlight lang="php"> if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { die("Invalid email format"); } </syntaxhighlight> === 3. 使用ORM框架 === ORM(对象关系映射)框架(如Laravel的Eloquent、Doctrine)自动处理SQL注入防护。 <syntaxhighlight lang="php"> $user = User::where('username', $username)->where('password', $password)->first(); </syntaxhighlight> === 4. 最小权限原则 === 数据库用户应仅拥有必要权限(如只读、仅限特定表),避免使用root账户连接数据库。 === 5. 转义特殊字符 === 在无法使用预处理语句时,可使用转义函数(如<code>mysqli_real_escape_string</code>),但此方法不如预处理语句安全。 <syntaxhighlight lang="php"> $username = mysqli_real_escape_string($conn, $_POST['username']); $password = mysqli_real_escape_string($conn, $_POST['password']); </syntaxhighlight> == 实际案例 == === 案例1:登录绕过 === 攻击者利用SQL注入绕过身份验证,如前述示例。 === 案例2:数据泄露 === 假设一个查询用户信息的页面: <syntaxhighlight lang="php"> $id = $_GET['id']; $sql = "SELECT * FROM users WHERE id = $id"; </syntaxhighlight> 攻击者输入: <code>1 UNION SELECT username, password FROM users</code> 最终SQL: <syntaxhighlight lang="sql"> SELECT * FROM users WHERE id = 1 UNION SELECT username, password FROM users </syntaxhighlight> 结果返回所有用户的账号密码。 == 总结 == {| class="wikitable" |+ SQL注入防护方法对比 ! 方法 !! 安全性 !! 适用场景 |- | 预处理语句 || 高 || 所有数据库操作 |- | ORM框架 || 高 || 现代PHP应用 |- | 输入验证 || 中 || 辅助措施 |- | 转义字符 || 低 || 遗留代码 |} <mermaid> graph TD A[用户输入] --> B{是否使用预处理语句?} B -->|是| C[安全执行] B -->|否| D[检查输入验证] D --> E{是否有效过滤?} E -->|是| F[风险降低] E -->|否| G[SQL注入风险] </mermaid> == 数学表达 == 在概率论中,SQL注入成功的概率可表示为: <math> P(\text{成功}) = 1 - P(\text{防护措施}) </math> 其中<math>P(\text{防护措施})</math>代表防护措施的有效性。 [[Category:编程语言]] [[Category:PHP]] [[Category:PHP数据库操作]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)