php审计-最经典的_GET[‘id‘]和POST[‘id‘]注入

本文探讨了PHP审计中的GET['id']和POST['id']注入问题,涉及MySQL交互、宽字节注入和二次注入。通过实例代码展示了GET型和POST型注入的实现方式,包括字符型和数字型的注入构造,并分析了登录检测过程中的安全风险。

这里,_GET[‘id’]和_POST[‘id’]很多人都知道,,
但我们做php审计,后面的宽字节注入和二次注入都会和mysql交互,那审计这两段源码就非常重要。

这里建个php,放到www下面,
GET型 如果下面不带前端源码,写成这样也行。

<?php  

定义一个变量$conn通过mysql_connect(server:'localhost',username:'root',passsword:'root');
函数建立mysql连接

下一步我们用一个变量$sql or $a 接受查询语句

 $a = "select * from admin_table where id='$id'";

第三步,我们通过mysql_query()函数做数据库查询,这个函数返回值是false or true ,查询成功或失败对mysql没有影响,成功返回数据,失败了返回mysql_error()函数。


 $result = mysql_query($a) or die(mysql_error());

完整源码

<?php
$id=$_GET['id'];
$conn = mysql_connect('localhost','root','root');
mysql_select_db("admin",$conn);
$a = "select * from admin_table where id='$id'";
$result = mysql_query($a) or die(mysql_error());
while ($row = mysql_fetch_array($result)){
   
   
    echo "ID:"
### 验证账号是否存在并检查该账号是否绑定了指定的 UIDPHP 中,验证账号是否存在并检查该账号是否绑定指定的 UID,通常需要通过数据库查询实现。首先,查询账号是否存在于用户表中;其次,检查该账号是否与指定的 UID 相关联。这种验证机制可以有效确保用户身份的准确性,常用于登录验证、权限控制等场景[^1]。 #### 数据库查询逻辑 1. **查询账号是否存在**:使用 `SELECT` 语句查询用户表中是否存在指定的用户名。 2. **验证 UID 是否绑定**:在确认账号存在的基础上,进一步验证该账号是否与指定的 UID 关联。 #### 示例代码 ```php <?php header("Content-Type:text/plain;charset=utf-8"); // 获取参数 $uname = $_POST['uname'] ?? die("-1"); $uid = $_POST['uid'] ?? die("-2"); // 数据库连接配置 $host = 'localhost'; $user = 'root'; $pass = ''; $dbname = 'user_db'; $conn = new mysqli($host, $user, $pass, $dbname); if ($conn->connect_error) { die("-3"); } // 查询账号是否存在 $sql_check_user = "SELECT * FROM t_login WHERE uname = ?"; $stmt = $conn->prepare($sql_check_user); $stmt->bind_param("s", $uname); $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows === 0) { echo "-3"; // 账号不存在 } else { // 验证账号与 UID 是否匹配 $sql_check_uid = "SELECT * FROM t_login WHERE uname = ? AND uid = ?"; $stmt_uid = $conn->prepare($sql_check_uid); $stmt_uid->bind_param("ss", $uname, $uid); $stmt_uid->execute(); $result_uid = $stmt_uid->get_result(); if ($result_uid->num_rows === 0) { echo "-4"; // UID 与账号不匹配 } else { echo "1"; // 验证成功 } } $conn->close(); ?> ``` #### 代码说明 - **参数获取**:使用 `$_POST` 获取 `uname` `uid`,如果参数缺失则返回错误代码。 - **数据库连接**:使用 `mysqli` 扩展连接数据库,确保连接状态正常。 - **账号查询**:通过预处理语句防止 SQL 注入攻击,查询账号是否存在。 - **UID 验证**:在账号存在的前提下,进一步验证 UID 是否匹配,确保用户身份的唯一性。 #### 安全性建议 - **预处理语句**:使用 `mysqli_prepare` `bind_param` 可以有效防止 SQL 注入- **错误处理**:返回统一的错误码,避免暴露系统细节。 - **日志记录**:建议记录验证失败的尝试,便于后续审计分析。 #### 性能优化建议 - **索引优化**:在 `t_login` 表中为 `uname` `uid` 字段建立索引,提高查询效率。 - **缓存机制**:对于频繁验证的账号信息,可以考虑使用 Redis 等内存数据库进行缓存,减少数据库查询次数。 #### 相关问题 - 如何在 PHP 中使用预处理语句防止 SQL 注入- 如何在数据库中为字段建立索引以提高查询效率? - 如何在 PHP 中使用 Redis 缓存用户登录信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ECHO::

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值