php 에서 SQL 주입 을 방지 하 는 가장 좋 은 해결 방법

3159 단어 phpsql 주입 방지
만약 에 사용자 가 SQL 문장 에 직접 삽입 하 는 조 회 를 입력 하면 응용 프로그램 은 SQL 주입 을 받 기 쉽다.예 를 들 어 다음 의 예:

$unsafe_variable = $_POST['user_input'];
mysql_query("INSERT INTO table (column) VALUES ('" . $unsafe_variable . "')");
이것 은 사용자 가 VALUE 와 유사 한 것 을 입력 할 수 있 기 때문이다.)DROP TABLE 시계;-,조 회 를:

INSERT INTO table (column) VALUES('VALUE'); DROP TABLE table;'
우 리 는 어떻게 이런 상황 을 방지 해 야 합 니까?다음은 Theo 의 대답 을 살 펴 보 겠 습 니 다.
예비 의문 과 매개 변수 화 조 회 를 사용 합 니 다.모든 매개 변 수 를 가 진 sql 문 구 는 데이터베이스 서버 에 전송 되 고 분 석 됩 니 다!공격 자가 sql 에 악의 적 으로 주입 하려 는 것 은 불가능 합 니 다!
이 목 표를 실현 하 는 데 는 기본적으로 두 가지 선택 이 있다.
1.PDO(PHP Data Objects)

$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

$stmt->execute(array(':name' => $name));

foreach ($stmt as $row) {
    // do something with $row
}

사용 2.mysql

$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name);

$stmt->execute();

$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    // do something with $row
}

PDO(PHP 데이터 대상)사용
PDO 를 사용 하여 MySQL 데이터베이스 에 접근 할 때 진정한 예비 의문 구 는 기본적으로 사용 되 는 것 이 아 닙 니 다!이 문 제 를 해결 하기 위해 서 는 시 뮬 레이 션 으로 준 비 된 문 구 를 사용 하지 않 아야 합 니 다.PDO 를 사용 하여 연결 을 만 드 는 예 는 다음 과 같 습 니 다.

$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
위의 예 에서 오류 모드 ERRMODE 는 엄격하게 필요 하지 않 지만 추가 하 는 것 을 권장 합 니 다.실행 오류 가 발생 하여 치 명 적 인 오류 가 발생 했 을 때 이 방법 은 스 크 립 트 가 멈 추 지 않 습 니 다.개발 자 에 게 모든 오 류 를 포착 할 수 있 는 기 회 를 준다.
setAttribute()줄 은 강제 적 입 니 다.PDO 에 게 모 의 예비 의 구 를 사용 하지 않 고 진정한 예비 의 구 를 사용 하 라 고 알려 줍 니 다.이 는 MySQL 데이터베이스 서버 에 보 내기 전에 PHP 로 해석 되 지 않도록 구문 과 값 을 확보 할 수 있 습 니 다(공격 자 는 악의 적 인 SQL 을 주입 할 기회 가 없습니다).
물론 구조 함수 옵션 에서 문자 집합 인 자 를 설정 할 수 있 습 니 다.특히'오래된'PHP 버 전(5.3.6)은 DSN 에서 문자 집합 인 자 를 무시 합 니 다.
Explanation(해석)이 전달 하 는 sql 예비 의문 이 데이터베이스 서버 에 의 해 해석 되 고 컴 파일 되면 어떻게 됩 니까?지정 한 문자 로(위의 예 에서 a 처럼?또는:name)데이터베이스 엔진 에 무엇 을 걸 러 내 고 싶 은 지 알려 주 고 execute 를 호출 하여 결 합 된 예비 의문 과 지정 한 매개 변수 값 을 실행 합 니 다.
여기 서 가장 중요 한 것 은 이 매개 변수 값 은 SQL 문자열 이 아 닌 사전 컴 파일 된 구문 과 결 합 된 것 입 니 다.QL 이 주입 하 는 작업 원 리 는 사기 수단 으로 만 든 SQL 스 크 립 트 입 니 다.악성 문자열 을 데이터베이스 에 보 내 는 것 을 포함 합 니 다.따라서 실제 분 리 된 sql 매개 변 수 를 보 내 면 위험 을 낮 출 수 있 습 니 다.준 비 된 문 구 를 사용 할 때 보 내 는 모든 매개 변 수 는...문자열 로 만 볼 수 있 습 니 다.(데이터베이스 엔진 이 일부 매개 변 수 를 최적화 할 수 있 지만 최종 적 으로 숫자 가 될 수 있 습 니 다)위의 예 에서 변수$name 에'arah'가 포함 되 어 있 으 면;DELETE*FROM employees,결 과 는 검색 문자열'sarah'만 있 습 니 다.DELETE*FROM employees",당신 은 빈 시 계 를 얻 지 못 할 것 입 니 다.
준 비 된 문 구 를 사용 하 는 또 다른 장점 은 같은 세 션 에서 같은 문 구 를 여러 번 실행 하면 한 번 만 해석 되 고 컴 파일 되 어 속도 가 증가 한 다 는 것 이다.읊다,읊조리다

좋은 웹페이지 즐겨찾기