본문 바로가기

데이터베이스/MYsql

PHP&MySQL 6일차 스터디

겨울방학 스터디 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'] . '&amp;date=' . $row['date'] .

     '&amp;name=' . $row['name'] . '&amp;score=' . $row['score'] .

     '&amp;screenshot=' . $row['screenshot'] . '">Remove</a>';

   if ($row['approved'] == '0') {

     echo ' / <a href="approvescore.php?id=' . $row['id'] . '&amp;date=' . $row['date'] .

       '&amp;name=' . $row['name'] . '&amp;score=' . $row['score'] . '&amp;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