mysqli 인젝션 방어


mysqli 인젝션 방어




최초 작성일 : 2021-09-25 | 수정일 : 2021-09-25 | 조회수 :

// 기본값을 1로 설정하고, SQL 인젝션과 관련 보안 문제를 피하기 위해서 integer 로 형변환 한다.

1
2
3
4
5
if (isset($_GET['aid']) && is_numeric($_GET['aid'])) {
    $aid = (int) $_GET['aid'];
else {
    $aid = 1;
}
 

// MySQL 데이터베이스에 연결하고 sakila라는 이름의 데이터베이스를 선택한다.

1
2
// Hostname: 127.0.0.1, username: your_user, password: your_pass, db: sakila 
$mysqli = new mysqli('127.0.0.1''your_user''your_pass''sakila');

// 연결 시도가 실패한다면 이메일 발송 또는 에러 기록 또는 에러 메시지 등을 표시할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
if ($mysqli->connect_errno) {
 
    // 실제 사이트는 에러 메시지를 보여주지 않지만 예로 한번 해보자.
    echo '죄송한다, 이 웹사이트에 문제가 발생했다 .';
 
    echo 'Error: MySQL 접속이 실패했다 . 에러정보는 다음과 같다.
: \n'
;
    echo 'Errno: ' . $mysqli->connect_errno . '\n';
    echo 'Error: ' . $mysqli->connect_error . '\n';
 
    exit;
}
 

 

// SQL 쿼리 실행

1
2
3
4
5
6
7
$sql = 'SELECT actor_id, first_name, last_name FROM actor WHERE actor_id = $aid';
 
if (!$result = $mysqli->query($sql)) {
 
// 쿼리가 실패한다면. 
 
echo '죄송한다. 문제가 발생했다 .';
 

 

// 일반 사이트에서는 하지 않지만 다시 한번 에러 정보 받는 법을 보여준다.

1
2
3
4
5
6
7
8
9
10
11
echo 'Error: 쿼리 실행이 실패했다 . 이유는 다음과 같다.
 \n'
;
 
echo 'Query: ' . $sql . '\n';
 
echo 'Errno: ' . $mysqli->errno . '\n';
 
echo 'Error: ' . $mysqli->error . '\n';
 
exit;
 
}
 

 

// MySQL 연결과 쿼리가 성공했다.
결과는 어디에?

1
2
3
4
5
6
7
8
9
if ($result->num_rows === 0) {
 
// 때로는 결과가 잘 나오지만 때로는 잘 안나온다.
 
echo '일치하는 것이 없네요. 다시 시도해주세요.';
 
exit;
 
}

 

// 이 예제에서는 한 개의 결과가 나오고 결과를 연관 배열로 가져온다.
연관 배열의 key는 테이블의 컬럼 이름이다.

1
2
3
$actor = $result->fetch_assoc();
 
echo 'Sometimes I see ' . $actor['first_name'] . ' ' . $actor['last_name'] . ' on TV.';

 

// 이제 무작위로 5개의 데이터를 뽑아보자. 그리고 에러 처리도 해보자.

1
2
3
4
5
6
7
8
9
$sql = 'SELECT actor_id, first_name, last_name FROM actor ORDER BY rand() LIMIT 5';
 
if (!$result = $mysqli->query($sql)) {
 
echo '죄송한다. 문제가 발생했다 .';
 
exit;
 
}
 

 

// 5개의 무작위 배우들을 리스트에 출력하고 각 배우에 링크하자.

1
2
3
4
5
6
7
8
9
echo '\n';
 
while ($actor = $result->fetch_assoc()) {
    echo '\n';
    echo $actor['first_name'] . ' ' . $actor['last_name'];
    echo '\n';
}
 
echo '\n';
 

 

// 종료하기 전에 결과에 대한 메모리를 돌려 주고 MySQL을 닫자.

1
2
3
$result->free();
 
$mysqli->close();
Tags  #MySql  

닉네임:
댓글내용: