겨울방학 스터디 6일차
애플리케이션의 보안
1. HTTP 인증
HTTP 인증이란 ?
- 사용자의 이름과 패스워드를 요구하는 기술로서 데이터 삭제와 수정과 같은 애플리케이션의 특정 기능 사용을 요청 받았을 때 관리자의 비밀 정보를 요구하는 데 사용할 수 있다.
- 예를 들면 HTTP 인증을 완료한 관리자들만 사이트의 관리 페이지 접근을 허용한다.
2. 초전역 변수
$_SERVER , $_POST, $_FILES 등 이 있으며 인증창에 입력된 사용자의 이름과 패스워드 등의 데이터를 저장하고 그 저장된 정보를 통해 관리자 페이지로의 접속 여부를 결정한다.
3. HTTP 인증 순서
브라우저는 요청하는 파일이 무엇인지, 서버의 호스트명이 무엇인지에 관한 정보를 헤더에 담아 페이지를 요청한다. → 서버는 응답에 관한 정보를 담은 헤더와 요청 페이지를 전송한다 → 브라우저는 헤더 정보와 웹페이지를 수신해 이를 바탕으로 HTML 코드를 화면에 출력한다.
*HTTP 인증은 헤더를 사용한다. 헤더 정보는 브라우저에 가장 먼저 표시한다.
header(‘Content-Type: text/html’); // 인증 후의 창을 보여주기 전에 헤더부터 보여준다.
<?php
// User name and password for authentication
$username = 'rock';
$password = 'roll';
if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) ||
($_SERVER['PHP_AUTH_USER'] != $username) ||
// 사용자가 인증창에 입력한 이름을 저장
($_SERVER['PHP_AUTH_PW'] != $password)) {
// 사용자가 인증창에 입력한 패스워드를 저장
header('HTTP/1.1 401 Unauthorized'); // 사용자의 상태가 아직 인증이 필요한 페이지를 조회할 수 없음을 알림
header('WWW-Authenticate: Basic realm="Guitar Wars"'); // 인증 창을 띄워 사용자의 이름과 패스워드를 통해 사용자 인증을 진행해야 함을 알림.
// header()를 두번 호출하고 이를 통해 헤더 정보가 브라우저로 전송됨
exit('<h2>Guitar Wars</h2>Sorry, you must enter a valid user name and password to access this page.'); // exit()는 인증이 실패했음을 알리는 이벤트로서 인증 거부 메시지를 출력하고 실제 요청 페이지의 내용은 브라우저에 전송하지 않는다.
}
?>
이 코드를 따로 authorize.php로 저장.
<?php
require_once(‘authorize.php’);
?>
인증 코드를 저장하고 있는 스크립트를 위의 스크립트 호출 코드를 이용해 보안이 필요한 페이지의 스크립트 맨 위에 포함시키면 된다. 여기서는 admin.php removescore.php 에 추가시킨다.
admin.php 와 removescore.php 페이지에 들어가기 위해서는 인증을 완료하여야 한다.
4. TINYINT
ALTER TABLE guuitarwars //guitarwars 라는 테이블을 불러온다.
ADD COLUMN approved TINYINT //approved 칼럼이 TINYINT 타입의 데이터로 저장된다.
- TINYINT는 승인받지 못하면 ‘0’ 을저장하고, 승인받으면 그 위에 ‘1’ 이라고 새로운 데이터가 저장된다.
5. 승인(Approve)링크 추가하기
<?php
require_once('authorize.php');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Guitar Wars - High Scores Administration</title>
<link rel="stylesheet" type="text/css" href="style.css" />
</head>
<body>
<h2>Guitar Wars - High Scores Administration</h2>
<p>Below is a list of all Guitar Wars high scores. Use this page to remove scores as needed.</p>
<hr />
<?php
require_once('appvars.php');
require_once('connectvars.php');
// Connect to the database
$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
// Retrieve the score data from MySQL
$query = "SELECT * FROM guitarwars ORDER BY score DESC, date ASC";
$data = mysqli_query($dbc, $query);
// Loop through the array of score data, formatting it as HTML
echo '<table>';
echo '<tr><th>Name</th><th>Date</th><th>Score</th><th>Action</th></tr>';
while ($row = mysqli_fetch_array($data)) {
// Display the score data
echo '<tr class="scorerow"><td><strong>' . $row['name'] . '</strong></td>';
echo '<td>' . $row['date'] . '</td>';
echo '<td>' . $row['score'] . '</td>';
echo '<td><a href="removescore.php?id=' . $row['id'] . '&date=' . $row['date'] .
'&name=' . $row['name'] . '&score=' . $row['score'] .
'&screenshot=' . $row['screenshot'] . '">Remove</a>';
if ($row['approved'] == '0') {
echo ' / <a href="approvescore.php?id=' . $row['id'] . '&date=' . $row['date'] .
'&name=' . $row['name'] . '&score=' . $row['score'] . '&screenshot=' .
$row['screenshot'] . '">Approve</a>';
} // 각각의 데이터에 승인(Approve) 링크 추가 여부를 결정하기 위해서 데이터의 approved 칼럼 값이 0 인지를 확인한다.
echo '</td></tr>';
}
echo '</table>';
mysqli_close($dbc);
?>
</body>
</html>
'데이터베이스 > MYsql' 카테고리의 다른 글
PHP&MySQL 5일차 스터디 (0) | 2014.02.14 |
---|---|
PHP&MySQL 4일차 스터디 (0) | 2014.02.14 |
PHP&MySQL 3일차 스터디 (0) | 2014.02.14 |
PHP&MySQL 2일차 스터디 (0) | 2014.02.14 |
PHP&MySQL 1일차 스터디 (0) | 2014.02.14 |