웹개발
[PHP,MYSQL] mysqli의 stmt를 활용한 prepared statement 코딩
정느
2020. 12. 1. 16:33
지금은 구세대의 유물처럼 되어가고 있는 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번같은 홈페이지를 실제로 봐서 그렇다.
인터넷은 정보의 바다이고 홈페이지는 정말 많다... 그리고 놀랍게도 말도 안되는 코드들이 실존한다. 오 마이...