前提・実現したいこと
phpにおけるsqlインジェクション攻撃の勉強をしていて、実際にphpで脆弱性のあるログイン認証のプログラムを作り、インジェクション攻撃を行っています。
不正ログインができる['OR1'='1 -- ]といったsql文を入力するとログイン成功の文字が返される予定がSQLSTATE[42000]というエラーが出てしまいます。
他のサイトを参考に色々変更しましたが、エラーが改善出来ず、先に進めないといった状況です。どなたかこのエラーの改善方法等を教えてくださると幸いです。どうぞよろしくお願いいたします。
発生している問題・エラーメッセージ
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'OR1'='1 -- ' AND password = ''' at line 1
php
1<?php 2 // エラーメッセージ 3 $errorMessage = ""; 4 // 画面に表示するため特殊文字をエスケープする 5 $viewUserId = htmlspecialchars(@$_POST["userid"], ENT_QUOTES); 6//POSTの場合は、ログインチェック 7if (strtolower($_SERVER['REQUEST_METHOD']) === 'post'){ 8 $userid = $_POST["userid"]; 9 $password = $_POST["password"]; 10 //データベースへの接続 11 try{ 12 $pdo = new PDO( 13 'mysql:dbname=logintest;host=localhost;charset=utf8mb4','root','', 14 [ 15 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 16 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 17 ] 18 ); 19 //複文の許可 20 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); 21 //sqlの発行・実行 22 $stmt = $pdo->prepare("SELECT * FROM login WHERE userid = '$userid' AND password = '$password';"); 23 $stmt->execute(); 24 while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 25 $hozon_pass = $row["password"]; 26 $hozon_id = $row["userid"]; 27 } 28 if ($_POST["userid"] == isset($hozon_id) && $_POST["password"] == isset($hozon_pass)) { 29 echo '<br><span style="color:#0000ff">ログインに成功しました。</span>' ; 30 }else{ 31 echo '<br><span style="color: #ff0000">ログインに失敗しました。</span>'; 32 } 33 $pdo = null; 34 exit(); 35 }catch (PDOException $e) { 36 header('Content-Type: text/plain; charset=UTF-8', true, 500); 37 exit($e->getMessage()); 38 } 39} 40//ログインフォームを表示する 41header('Content-type: text/html; charaset=utf-8'); 42?> 43 44<html> 45 <head> 46 <meta charset="UTF-8"> 47 <title>サンプルログイン</title> 48 </head> 49 <body> 50 <form id="loginForm" name="loginForm" action="<?php print($_SERVER['PHP_SELF']) ?>" method="POST"> 51 <fieldset> 52 <legend>ログインフォーム</legend> 53 <div><?php echo $errorMessage ?></div> 54 <label for="userid">ユーザID</label><input type="text" id="userid" name="userid" value="<?php echo $viewUserId ?>"> 55 <br> 56 <label for="password">パスワード</label><input type="password" id="password" name="password" value=""> 57 <br> 58 <label></label><input type="submit" id="login" name="login" value="ログイン"> 59 </fieldset> 60 </form> 61 </body> 62</html>
補足情報(FW/ツールのバージョンなど)
PHP Version 7.2.5です
or文はuseridの箇所に入れようと思っています。
可能であればuseridとpasswordがわからなくてもor文だけでログインができることが実現できればいいなと思っていて、コメントアウトを利用してpasswordの比較部分を無視するようなsqlが実行したいと思っています。
回答3件
あなたの回答
tips
プレビュー