최초 작성일 : 2025-07-26 | 수정일 : 2025-07-26 | 조회수 : 13 |
혹시 이런 경험 있으신가요? 블로그나 게시판을 만들었는데, 어느 날 갑자기 이상한 글이 올라오거나, 데이터가 전부 날아가 버린 적요. 😱 대부분 SQL 인젝션 공격 때문이에요. 저도 예전에 이런 공격을 당하고 나서 한동안 멘붕이 왔던 기억이 나네요.
SQL 인젝션(SQL Injection)은 사용자가 입력한 값에 악의적인 SQL 구문을 삽입하여, 개발자가 의도하지 않은 데이터베이스 명령을 실행하게 만드는 해킹 기법이에요.
예를 들어, 로그인 창에 `id=admin' --` 같은 값을 넣으면 인증 절차를 우회하거나, `DROP TABLE` 같은 명령어를 실행시켜버릴 수도 있어요.
PHP에서 MySQL 인젝션을 막는 가장 효과적인 방법은 Prepared Statement를 사용하는 거예요. 쉽게 말하면, SQL과 데이터 입력을 분리시켜 주는 방식이죠.
구분 | 나쁜 예 | 좋은 예 | 설명 |
---|---|---|---|
사용자 입력 처리 | `$query = "SELECT * FROM users WHERE id = '$id'"` | `$stmt = $db->prepare(...)` | 직접 문자열로 SQL을 만들면 위험해요 |
보안 방식 | addslashes(), escape | bind_param() | 입력값을 안전하게 처리할 수 있어요 |
다음은 블로그 글을 등록할 때 SQL 인젝션을 방어하는 안전한 코드예요.
$stmt = mysqli_prepare($link, "INSERT INTO post (title, content) VALUES (?, ?)"); mysqli_stmt_bind_param($stmt, "ss", $title, $content); mysqli_stmt_execute($stmt);
SQL 삽입이 막혀도, 예상치 못한 에러가 생기면 해커에게 실마리를 줄 수 있어요. 따라서 에러는 화면에 직접 출력하기보다는 로그로 남겨야 해요.
또한, `mysqli_stmt_error()` 같은 함수로 정확한 오류를 파악하고, 필요 시 사용자에겐 ‘처리 중 오류가 발생했습니다’ 정도만 보여주세요.
SQL 인젝션은 간단한 입력 하나로도 웹사이트를 무너뜨릴 수 있는 위험한 공격이에요. 하지만 걱정하지 마세요! `prepare`와 `bind_param()`만 제대로 사용해도 대부분의 인젝션은 완벽하게 막을 수 있어요.
웹 개발자로서, 혹은 운영자로서 이 정도 보안 코드는 이제 기본 중의 기본이에요. 지금이라도 내 사이트에 적용해보세요. 보안은 예방이 가장 중요하니까요! 🔐