SQL インジェクションを防ぐためのシンプルなログイン PDO 前処理

1、新しいユーザー テーブルを作成します

create table user(

id ​​int(4) not null 主キーauto_increment ,

name varchar(255) not null,

pwd varchar(255) not null)

CHARSET=utf8;

微信图片_20180305130715.png

2、テスト データを挿入します

INSERT INTO user(name,pwd) VALUES('bobo','bobo');

3. 新しい login.php ファイルを作成して、ログイン HTML ページを作成します。

##コードは次のとおりです:

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2018/3/5 0005
 * Time: 下午 1:12
 */
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="check.php" method="post">
    用户名:<input type="text" id="name" name="name"/><br>
    密码:<input type="password" id="pwd" name="pwd" /><br>
    <input type="submit" id='login' name='login' value="登录">
</form>
</body>
</html>

4. 新しい check.php ファイルを作成して、データベース接続処理用のフォーム送信データを取得します。

#コードは次のとおりです。 :

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2018/3/5 0005
 * Time: 下午 1:14
 */
header('content-type:text/html;charset=utf-8');
$username=$_POST['name'];
$pwd=$_POST['pwd'];
try {
    $pdo=new PDO('mysql:host=localhost;dbname=php','root','root');
    $sql="select * from user where name='{$username}' and pwd='{$pwd}'";
    $stmt=$pdo->query($sql);
//返回结果集中的行数
    echo $stmt->rowCount();
} catch (Exception $e) {
    echo $e->getMessage();
}

ブラウザの実行結果は次のとおりです:

ユーザー名 bobo を入力し、パスワード bobo が出力 1

# #間違ったユーザー名とパスワードを入力して出力 0

注入 SQL ステートメントを入力してください 'または 1=1#Printは 1 のままです。ここで何かが間違っていることは明らかです。sql


5 にはアンチインジェクション処理がありません。最初のインジェクションを防ぐ方法 (? メソッド)

<?php
try {
    $pdo=new PDO('mysql:host=localhost;dbname=php','root','root');
    $sql="select * from user where name=? and pwd=?";
    $stmt=$pdo->prepare($sql);
    $stmt->execute(array($username,$pwd));
    echo $stmt->rowCount();
} catch (Exception $e) {
    echo $e->getMessage();
}

6、2 番目のメソッド (プレースホルダー メソッド)

<?php
try {
    $pdo=new PDO('mysql:host=localhost;dbname=php','root','root');
    $sql="select * from user where name=:name and pwd=:pwd";
    $stmt=$pdo->prepare($sql);
    $stmt->execute(array(":name"=>$username,":pwd"=>$pwd));
    echo $stmt->rowCount();
} catch (Exception $e) {
    echo $e->getMessage();
}

両方の方法で 'または 1=1# を入力し、両方とも 0 を出力します。解決策 SQL インジェクションの問題が解決されました。

学び続ける
||
<?php echo "PDO解决sql防注入的简单登录页面";
  • おすすめコース
  • コースウェアのダウンロード
現時点ではコースウェアはダウンロードできません。現在スタッフが整理中です。今後もこのコースにもっと注目してください〜