본문 바로가기
웹개발

[PHP,MYSQL] mysqli의 stmt를 활용한 prepared statement 코딩

by JeongNue 2020. 12. 1.

지금은 구세대의 유물처럼 되어가고 있는 PHP+MYSQL이지만

기존에 구축된 사이트가 많다보니 여전히 많이 쓰이고 있다.

 

PHP의 경우 MYSQL과 연동할 수 있는 mysqli 라는 라이브러리를 지원한다.

mysqli 없이 코딩된 조금... 아니 어쩌면 조금 많이 오래된 사이트 소스를 보면,

간혹 이런식으로 코딩되어있는 것을 발견할지도 모른다.

 

혹시 내 홈페이지가 이런 상태라면 진지하게 홈페이지를 뜯어고칠것을 고민해보자

이럴수가

인젝션의 좋은 먹잇감이군요

 

 

여튼 SQL 인젝션은 너무 유명한 해킹 시도이고

그런 만큼 php에서도 인젝션을 막기 위한 라이브러리를 제공하고 있는데

그 중 하나가 mysqli의 stmt를 활용한 prepared statement이다.

 

대충 예시는 아래와 같다.

//DB연결
$mysqli = new mysqli($dbserver, $dbuser, $dbpasswd, $dbname);
if (mysqli_connect_errno()) {
   	die("Connection failed: " . $conn->connect_error);
}
    
//stmt 세팅
$stmt = $mysqli->stmt_init();
	
//구문 작성 (유저가 입력할 수 있는 부분은 ? 처리)
$sql = "INSERT INTO tb_chest_review(chest_id, username, content, user_ip, password) VALUES(?, ?, ?, ?, ?) ";
$stmt->prepare($sql);
//위 sql 문장에서 ? 처리된 부분을 패러미터로 바인드
$stmt->bind_param("sssss", $chest_id, $name, $content, $user_ip, $pass);
	
$stmt->execute();
$stmt->close();

1.mysqli 세팅 후

2.구문에서 유저가 입력하는 인자를 ?로 처리

3.bind_param으로 유저가 입력하는 인자를 넣음. 이 과정에서 인젝션을 방지한다.

4.실행

 

 

라이브러리로 다 제공되는거라 별거 없다. 문법도 간단.

혹시라도 내 홈페이지가 php라면, 그리고 정말 혹시라도. 아니겠지만... 내 홈페이지에 MYSQL 구문들이 위에 그림1번처럼 되어있다고 한다면

코드를 좀 수정하시는걸 추천.

 

p.s 그래서 이 글을 왜 쓰게 됐냐면

그림 1번같은 홈페이지를 실제로 봐서 그렇다.

인터넷은 정보의 바다이고 홈페이지는 정말 많다... 그리고 놀랍게도 말도 안되는 코드들이 실존한다. 오 마이...

댓글