PHP addslashes 함수의 사용법과 취약점
안녕하세요 여러분! 오늘은 PHP의 유용한 함수인 addslashes
에 대해 알아보려고 해요. 이 함수는 문자열에 슬래시를 추가하여 SQL 인젝션 공격을 방지하는 데 도움을 줘요. 하지만 이 함수만으로는 충분하지 않은 경우도 있답니다. 그럼, addslashes
의 사용법과 주의해야 할 점에 대해 함께 알아볼까요?
1. addslashes
함수란?
addslashes
함수는 문자열 내의 특정 문자 앞에 슬래시를 추가해줘요. 추가되는 문자는 아래와 같아요:
- 단일 인용부호 (')
- 이중 인용부호 (")
- 백슬래시 (\)
- NULL (NULL)
이 함수는 주로 데이터베이스 쿼리에 사용되는 문자열을 안전하게 만들기 위해 사용돼요.
string addslashes ( string $str )
2. addslashes
사용 예시
다음은 addslashes
함수를 사용한 간단한 예시예요:
<?php
$str = "Hello 'world'";
$safe_str = addslashes($str);
echo $safe_str; // 출력: Hello \'world\'
?>
위의 코드를 보면, 문자열 Hello 'world'
에서 단일 인용부호 앞에 백슬래시가 추가된 것을 확인할 수 있어요. 이렇게 하면 쿼리에서 문자열이 안전하게 처리될 수 있답니다.
3. addslashes
함수의 출력값
위의 예시에서 addslashes
함수의 출력값은 Hello \'world\'
였어요. 원래 문자열에서 단일 인용부호 앞에 백슬래시가 추가된 형태로 출력되죠.
4. addslashes
함수의 취약점
하지만, addslashes
함수만으로는 모든 SQL 인젝션 공격을 방지할 수 없어요. 그 이유는 여러 가지가 있는데, 대표적인 예로는 캐릭터셋 인코딩 문제와 다중 쿼리 문제가 있어요.
예시: 다중 쿼리 공격
다음은 addslashes
함수만 사용했을 때 발생할 수 있는 취약점 예시예요:
<?php
$user_input = "John'; DROP TABLE users; --";
$safe_input = addslashes($user_input);
$query = "SELECT * FROM users WHERE name = '$safe_input'";
// $query = "SELECT * FROM users WHERE name = 'John\'; DROP TABLE users; --'";
?>
위의 코드에서 사용자가 입력한 값은 John'; DROP TABLE users; --
였어요. addslashes
함수를 사용하면 단일 인용부호 앞에 백슬래시가 추가되어 John\'; DROP TABLE users; --
로 변환되지만, 여전히 다중 쿼리 공격이 가능해요.
5. 안전한 대안
SQL 인젝션 공격을 방지하기 위해 addslashes
대신 준비된 쿼리(Prepared Statements)를 사용하는 것이 더 안전해요. PHP의 PDO나 MySQLi와 같은 데이터베이스 확장 기능을 사용하면 준비된 쿼리를 쉽게 구현할 수 있답니다.
<?php
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'username', 'password');
$stmt = $pdo->prepare("SELECT * FROM users WHERE name = :name");
$stmt->execute(['name' => $user_input]);
$results = $stmt->fetchAll();
?>
위의 예시처럼 준비된 쿼리를 사용하면 사용자 입력 값이 자동으로 이스케이프 처리되기 때문에 SQL 인젝션 공격을 효과적으로 방지할 수 있어요.
결론
오늘은 PHP의 addslashes
함수에 대해 알아봤어요. 이 함수는 문자열을 안전하게 처리하는 데 도움을 주지만, 모든 상황에서 완벽하지는 않아요. SQL 인젝션 공격을 완전히 방지하기 위해서는 준비된 쿼리를 사용하는 것이 좋답니다. 여러분도 안전한 코딩을 위해 항상 주의하세요!