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;
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 インジェクションの問題が解決されました。