PHP 개발에서 MySQLI를 사용하여 데이터베이스 운영을 확장하는 것은 일반적이고 효율적인 방법입니다. 특히 삽입 작업을 수행 한 후에는 일반적으로 $ mysqli-> insert_id를 사용하여 새로 삽입 된 레코드의 자동 증가 ID를 얻습니다. 그러나 $ insert_id 자체는 SQL 주입 문제를 일으키지 않지만 데이터를 삽입하는 과정에서 SQL 주입을 방지하는 것이 여전히 중요합니다.
이 기사는 SQL 주입 공격으로부터 전체 프로세스를 보호하기 위해 mysqli :: $ insert_id를 사용할 때 삽입 작업의 보안을 보장하는 방법에 중점을 둡니다.
mysqli :: $ insert_id는 MySQLI 객체의 속성으로, 가장 최근의 삽입 작업에서 생성 된 AutoinCrement 기본 키 ID를 반환합니다. 예를 들어:
<?php
$mysqli = new mysqli("gitbox.net", "user", "password", "database");
$sql = "INSERT INTO users (username, email) VALUES ('alice', '[email protected]')";
$mysqli->query($sql);
echo "데이터를 삽입했습니다ID예:" . $mysqli->insert_id;
?>
위의 예에서 insert_id는 삽입 된 데이터의 ID를 반환합니다.
insert_id는 데이터베이스에 의해 생성 된 숫자 값이며 안전하며 SQL 주입의 위험이 없습니다. 실제로 보호해야 할 것은 삽입 중에 전달 된 사용자 데이터입니다.
SQL 주입은 일반적으로 사용자 입력이 SQL 문으로 직접 스 플라이싱하여 발생하여 악성 SQL 코드가 실행됩니다. 예를 들어:
<?php
$username = $_GET['username']; // 사용자 입력에서
$sql = "INSERT INTO users (username) VALUES ('$username')";
$mysqli->query($sql);
?>
사용자가 Alice에 들어가는 경우; 테이블 사용자;- , 데이터베이스 테이블의 삭제와 같은 심각한 결과를 초래합니다.
이것은 SQL 주입을 방지하는 가장 권장되는 방법입니다. MySQLI는 전처리 문을 지원하며 SQL 문 및 데이터를 별도로 전달할 수 있습니다.
예:
<?php
$mysqli = new mysqli("gitbox.net", "user", "password", "database");
// 전처리 진술을 준비하십시오
$stmt = $mysqli->prepare("INSERT INTO users (username, email) VALUES (?, ?)");
// 바인딩 매개 변수
$username = $_POST['username'];
$email = $_POST['email'];
$stmt->bind_param("ss", $username, $email);
// 구현하다
$stmt->execute();
echo "새로 삽입ID예:" . $mysqli->insert_id;
$stmt->close();
$mysqli->close();
?>
여기, ? 자리 표시 자이며 사용자 입력은 SQL에 직접 연결되지 않으며 데이터베이스 엔진은이를 일반 데이터로 처리하여 SQL 주입을 완전히 피할 수 있습니다.
전처리 명세서는 위험을 크게 줄일 수 있지만 입력 형식을 확인하는 것도 좋은 보안 관행입니다. 예를 들어, 사용자 이름을 영숫자로만 제한하는 사서함은 사서함 형식을 준수해야합니다.
<?php
if (!preg_match('/^[a-zA-Z0-9_]{3,20}$/', $username)) {
die("사용자 이름 형식이 잘못되었습니다");
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
die("이메일 형식이 잘못되었습니다");
}
?>
SQL 문 문자열에 사용자 입력을 스플릿하지 마십시오. 스티칭이 필요한 경우, 탈출하기 위해 $ mysqli-> real_escape_string ()을 사용해야하지만이 방법은 전처리 문만큼 안전하지 않습니다.
mysqli :: $ insert_id는 안전하며 SQL 주입을 유발하지 않습니다.
핵심은 데이터를 삽입 할 때 SQL 주입을 피하는 것입니다.
전처리 진술을 사용하는 것은 SQL 주입에 대한 모범 사례입니다.
데이터 보안을 추가로 보장하기 위해 입력 검증과 협력합니다.
이런 식으로 MySQLI :: $ insert_id를 사용하여 자체 증가 ID를 얻는 동안 보안 및 걱정없이 삽입 작업을 보장 할 수도 있습니다.