본문 바로가기
개발/PHP

[시큐어 코딩] PHP - SQLI 대응방안 Prepare Statement

by m_.9m 2022. 2. 18.

 Prepare Statement

= SQL Injection을 막기 위한 시큐어 코딩

 

 

prepare 미리 컴파일 하는 함수에 ?로 값을 만들어놓고

Bind_param으로 값을 바인딩(=매핑)해준다.

앞의 'sssssss'는 뒤의 값이 어떤 타입의 입력인지를 알려주는 역활을 한다. S는 문자형, i는 정수형 등으로 나뉜다.

 

[member_ok.php] 회원가입페이지

 

 

해쉬 값이 제대로 들어온 것을 확인, '와 같은 특수문자도 SQL Injection의 위험없이 그대로 입력된 것을 볼 수 있다.

 

 

 

[id_check.php] 회원가입페이지 내 아이디 중복 체크

값을 get_result로 받아야 정상 실행이 된다. 까다로운 함수 설정,,

 

 

[login_ok.php] 로그인페이지

해당 부분은 불러온 함수의 값을 변수에 넣는다. fetch_assoc 사용.

 

 

 

이를 기반으로 모든 파라미터 값을 수정해주면 된다. 사용한 코드를 첨부한다.

 

 

// insert
$sql= "INSERT INTO member(id, pw, name, adress, sex, email, role) VALUES(?,?,?,?,?,?,?)";

$stmt = $db->stmt_init();
$stmt = $db->prepare($sql);
$stmt->bind_param('sssssss', $_POST['userid'], $encrypted_pw , $_POST['name'], $_POST['adress'], $_POST['sex'], $email, $_POST['role']);
$encrypted_pw = password_hash($_POST['pw'], PASSWORD_DEFAULT);
$email = $_POST['email'].'@'.$_POST['emadress'];

$stmt -> execute();

//row num
    $stmt = $db->stmt_init();
    $uid=$_GET['userid'];

    $sql= "SELECT * from member where id=?";
    $stmt = $db->prepare($sql);
    $stmt->bind_param('s', $uid);
    $stmt-> execute();
    $member = $stmt->get_result();
    $num_of_rows = $member->num_rows;
    $stmt -> close();

//fetch
  $stmt = $db->stmt_init();

  $sql= "SELECT * FROM member WHERE id = ?";
  $stmt = $db->prepare($sql);
  $stmt->bind_param('s', $_POST['id']);
  $stmt-> execute();
  $member = $stmt->get_result();
  $row = $member->fetch_assoc();