方法一: 密码比对思路: 首先通过用户输入的用户名去查询数据库, 得到该用户名在数据库中对应的密码, 再将从数据库中查询到的密码和用户提交过来的密码进行比对. php 实例代码如下:?php$sq...
方法一: 密码比对
思路: 首先通过用户输入的用户名去查询数据库, 得到该用户名在数据库中对应的密码, 再将从数据库中查询到的密码和用户提交过来的密码进行比对.
php 实例代码如下:
- <?php
- $sql = "select password from users where username='$name'";
- $res = mysql_query($sql, $conn);
- if ($arr = mysql_fetch_assoc($res)) { // 如果用户名存在
- if ($arr['password'] == $pwd) { // 密码比对
- echo "登录成功";
- } else {
- echo "密码输入有误";
- }
- } else {
- echo "该用户名不存在";
- }
- ?-->
分析: 该情况下, 代码健壮了不少, 即使在 magic_quote_gpc=Off 的情况下, 也能防止 SQL 注入攻击, 因为攻击者想成功登录的话, 得绕过两道坎, 第一是输入的用户名要存在, 这一步可以构造一个 SQL 语句 ( or 1=1#) 直接绕过, 但是这样子无法通过第二道坎, 因为需要用户输入一个正确的密码才能通过, 显然, 这已经拒绝了 SQL 注入攻击.
方法二: 使用 PDO 的 PDO::prepare()预处理操作来防止 SQL 注入攻击.
思路: 创建一个 pdo 对象, 利用 pdo 的预处理操作可以防止 SQL 注入攻击.
php 实例代码如下:
- <?php
- $name = $_GET['username'];
- $pwd = $_GET['password'];
- $sql = "select * from users where username=? and password=?";
- //1. 创建一个 pdo 对象
- $pdo = new PDO("mysql:host=localhost;port=3306;dbname=injection", "root", "");
- //2. 设置编码
- $pdo--->exec("set names'utf8'");
- //3. 预处理 $sql 语句
- $pdoStatement = $pdo->prepare($sql);
- //4. 把接收到的用户名和密码填入
- $pdoStatement->execute(array(
- $name,
- $pwd
- ));
- //5. 取出结果
- $res = $pdoStatement->fetch();
- if (emptyempty($res)) {
- echo "用户名或密码输入有误";
- } else {
- echo "登录成功";
- }
- ?>
来源: https://www.php1.cn/detail/php-b970b78464.html