SQL 주입 방지를 위한 간단한 로그인 PDO 전처리
1, 새 사용자 테이블 만들기
테이블 만들기 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
injection sql 문을 입력하거나 1 =1# 인쇄가 여전히 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, 아니요. 두 가지 방법(자리 표시자 모드)
<?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#을 입력하고 SQL 주입 문제를 해결하는 0을 모두 인쇄합니다.