SQL 주입의 원리: 원본 SQL 문에 SQL 코드 조각을 추가하고, 특수 SQL 문을 구성하고, 프로그램 자체 권한을 사용하여 필요한 작업을 구현합니다.
이제 사용자 테이블이 있다고 가정합니다.
uidusernamepwd
1adminadmin222
2custome123456
이제 로그인 작업을 수행합니다.
<?php $conn=mysqli_connect("localhost","root","root","test"); // 连接数据库test if (!$conn) { # code...判断链接是否成功 echo "连接失败!"; echo mysqli_connect_error(); exit(); } mysqli_query($conn,"set names utf8"); // 指定编码格式 $user = $_GET['user']; $pwd = $_GET['pwd']; $sql="select * from user where username = '{$user}' and pwd = '{$pwd}'"; // sql语句 $result=mysqli_query($conn,$sql); // 执行sql语句,将执行结果返回到结果集中 $row=mysqli_fetch_array($result); // 从结果集中取得一行作为数组 echo "<pre class="brush:php;toolbar:false">"; print_r($row); ?>
위 코드는 간단한 로그인 작업을 수행합니다. 이를 브라우저에서 실행합니다. : localhost/test/login.php?user=admin&pwd=admin222, 실행된 SQL 문은 다음과 같습니다. select * from user where username= 'admin' 및 pwd = 'admin222', 실행 결과를 얻습니다.
localhost/test/login.php?user=admin&pwd=admin으로 요청하시면, 비밀번호가 사용자 이름과 일치하지 않아 쿼리 결과가 나오지 않습니다. 즉, SQL 문: select * from user where username= 'admin' 및 pwd = 'admin'은 결과를 찾을 수 없습니다. 그런 다음 SQL 문인 경우: 선택 * 사용자 이름= 'admin'이고 비밀번호 = 'admin' 또는 1 = 1인 사용자로부터;? 직접 시도해 볼 수 있으며 다음을 얻을 수 있습니다:
uidusernamepwd
1adminadmin222
2custome123456
클라이언트에서 localhost/test/login.php?user=admin&pwd=admin%20or%201=1에 액세스하면 어떻게 됩니까? ?
검증을 직접 우회하고 데이터베이스에서 관리자 정보를 얻었습니다. 이것은 간단한 SQL 주입입니다.
SQL 주입 방지:
(1) 정수형 변수인 경우 intval() 함수나 (int)를 사용하여 들어오는 모든 매개 변수를 숫자 값으로 변환합니다.
(2) 문자 변수의 경우 addlashes()를 사용하여 '(작은따옴표), "(큰따옴표), (백슬래시) 및 (공백)을 모두 백슬래시가 포함된 문자로 변환합니다.
(3 ) 일부 특수 문자를 이스케이프하거나 필터링합니다.
(4) 데이터 백업을 하세요.
관련 권장 사항:
위 내용은 SQL 인젝션 취약점 및 예방에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!