[PHP] 개념, 개발 환경 세팅

·2024년 8월 20일

just공부

목록 보기
3/47

PHP


  • 서버에서 사용되는 스크립팅 언어로 주로 HTML 코드를 프로그래밍적으로 생성
  • Request : 사용자가 브라우저에서 특정한 자원을 주소창의 URI를 통해 서버에 요청함
  • Response : PHP 스크립트는 사용자의 요청을 처리한 후 브라우저에 결과 응답
  • 서버는 요청을 기다리다 사용자 요청이 있다면, 요청 주소에 따라 PHP 스크립트를 실행시킴

웹 다루기

http 메소드에는 크게 9개 존재. 이 중 브라우저에서는 GET과 POST 2개를 주로 사용.

  • GET은 데이터를 읽어올 때 사용, POST는 데이터를 저장하고, 수정하고, 삭제하는 역할
  • GET 요청은 주소창에 파라미터를 담아서 서버에 요청
  • POST 요청은 파라미터가 https 본문(body)에 실려서 서버에 전송되기 때문에 주소창에는 변화가 없음.

GET 파라미터

  • 쿼리스트링(QueryString) 브라우저에서 주소창으로 전달하는 GET 파라미터는 ? 로 시작하고, 각 항목은 키:값 형태로 구성하며, 항목간의 연결에는 & 로 표시.
  • PHP에서 연관배열 형식의 $_GET 슈퍼 글로벌 변수를 이용해 &_GET[파라미터키] 형식으로 읽어올 수 있음
    <?php
    
    $name = $_GET['name'];
    $age = $_GET['age'];
    echo "name is $name, age is $age";
  • <form> 태그에 method 속성을 지정하지 않는다면 HTTP GET 메소드로 서버에 데이터를 전달하게 됨.

POST 파라미터

<form method="post">
    name : <input type="text" name="name" />
    age : <input type="text" name="age" />
    <input type="submit" />
</form>

<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $name = $_POST['name'];
    $age = $_POST['age'];

    echo "name is $name, age is $age";
}
?>
<form method="post">
...
</form>
  • <form> 태그 안의 내용을 파라미터로 전달하는 POST 요청이 실행됨. <form> 태그에서 http 메소드를 결정하는 것은 method='POST' 속성.
  • <input> 태그는 html에서 사용자 입력을 나타내는 태그. name 속성을 키로, value 속성을 값으로 서버에 전달. name 속성을 생략하면 서버에 전달되지 않음. value 속성을 생략하면 빈 문자열(”” )이 전달됨.
  • $_SERVER['REQUEST_METHOD'] : PHP에서 요청 HTTP 메소드 읽음 요청 메소드 결과가 POST 일 때 if 문이 실행되어 바로 아래 코드 블럭이 실행됨.
  • POST 메소드로 요청되어 form으로 전달되는 파라미터는 $_POST로 읽을 수 있음. $_POST 는 연관배열 타입으로, $_POST[파라미터이름] 형식으로 HTML에서 입력한 데이터를 읽어옴. 사용자가 입력한 값은 PHP의 $_POST['name']으로 읽음

리다이렉트

: 다른 페이지로 이동하는 것

<?php
header("Location: /target_url");
exit();
  • 위 코드를 redirect.php 파일에 저장하고 브라우저에서 결과를 확인함.
  • http://localhost/redirect.php에 접속하면 http://localhost/target_url로 이동하는 것을 확인 가능.
  • header 함수를 통해 응답 헤더에 보낼 데이터를 설정함.
  • exit() 는 php 실행을 끝내는 표시

세션 다루기

세션 : 서버에 저장되는 접속 클라이언트별 사용자의 정보

<?php
function redirect($url){
    header('Location: ' . $url);
    exit();
}

session_start();
$action = $_GET['action'];

if ($action == "set"){ // 세션 설정
    $_SESSION['key'] = 'session_value';
    redirect("?action=get");

}elseif ($action == "get"){ 
    if (isset($_SESSION['key'])){ // 세션이 있다면
        echo $_SESSION['key']; // 세션 출력
    }else{
        echo "NO SESSION"; // 세션이 없다면 메시지 출력
    }
}elseif ($action == "remove"){
    if (isset($_SESSION['key'])){ // 세션이 있다면
        unset($_SESSION['key']); // 세션 삭제
    }
    redirect("?action=get"); // 세션 삭제 후 "?action=get" 주소로 이동
}

세션의 작동 방식

  • 클라이언트가 서버에 요청함
  • 서버는 클라이언트가 보낸 데이터 중 세션키에 해당하는 쿠키가 있는지 확인함. PHP의 경우, 기본값은 PHPSESSIONID .
  • 세션 키가 없다면, PHP는 새로운 세션 키를 생성하고, 데이터를 서버에 저장.
  • 클라이언트에 PHPSESSIONID=세션키 형태의 쿠키 응답
  • 다음번에 클라이언트가 서버에 요청할 때는 PHPSESSIONID=세션키 형태의 쿠키를 함께 전달하게 됨
  • PHP는 PHPSESSIONID=세션키 쿠키가 요청 안에 포함되었으므로 기존에 서버에 저장된 데이터를 읽어서 처리할 수 있음.
  • redirect 함수는 여러 군데서 쓰이기 때문에 편의를 위해 만들어 둠
  • PHP에서 세션을 사용하려면 session_start() 를 반드시 사용하기 전에 써서 세션을 준비해야 함. PHP의 기본 세션은 단순 파일로 저장되기 때문에 파일을 읽어오는 것.
  • $action 변수는 파라미터에 따라 하는 일을 구분하기 위해 쿼리 스트링으로 입력. $action 의 값이 set 일 경우 세션을 설정하고, get 일 경우 세션을 가지고 오는 역할을 하고, remove 일 경우 세션을 삭제하게 됨.
  • 세션은 $_SESSION 글로벌 전역 변수를 통해 사용할 수 있음. 연관 배열 형태이기 때문에 사용법은 연관배열과 동일.
    세션에 값을 넣기 위해서는 $_SESSION[세션키] = 세션값 형태로 쓰면 됨.
  • 세션에서 값을 가져오기 위해서는 $_SESSION[세션키] 형태로 가지고 오면 됨.
  • 세션에 특정 키나 값이 있는지 확인하기 위해서 isset($_SESSION[세션키]) 형태로 쓰면 됨. isset 은 변수가 존재하는지 확인하는 내장 함수.
  • 세션이 이미 시작했는지 확인하기 위해서는 isset($_SESSION) 으로 확인할 수 있음. 세션이 시작해야만 $_SESSION 변수가 생기기 때문에 아래와 같이 사용함.
    if(isset($_SESSION) == false){
    	session_start();
    }
  • 세션에서 값을 삭제하기 위해서 unset $_SESSION[세션키] 로 삭제하면 됨

html 이스케이프하기

  • HTML은 XSS 공격 가능성이 있기 때문에 html을 치환함
<?php

$html = <<<CDATA
A 'quote' is <b>bold</b> "한글" 데이터
CDATA;
$encode = htmlspecialchars($html);
echo $encode;echo PHP_EOL;

$decode = htmlspecialchars_decode($encode);
echo $decode;
  • &$amp; 로 변환됨

  • "&quot; 로 변환됨

  • 'ENT_QUOTES 옵션을 함께 줄 때만 변환됨

  • <&lt; 로 변환됨

  • >&gt; 로 변환됨

  • htmlspecialchars 함수는 html에서 XSS 공격을 방어하기 위해 특수 문자를 인코딩함.

    • XSS 공격 : Cross Site Scripting의 약자로, 태그 등을 입력하여 서버의 보안 취약점을 노리는 공격임.
    • 규칙에 따라 html을 변환해 줌.
  • 인코딩한 결과를 반대로 바꾸려면 디코딩 함수인 htmlspecialchars_decode를 사용.

비밀번호 암호화하고 매칭하기

  • 관리자도 알 수 없도록 단방향 암호화해야 함.
<?php

$origin_pw = "1234asdf";
$hash_pw = password_hash($origin_pw, PASSWORD_BCRYPT);

//암호가 원래 암호와 같은지 확인
$match = password_verify($origin_pw, $hash_pw);
//암호가 원래 암호와 다른지 확
$not_match = password_verify($origin_pw . "zxcv", $hash_pw);

var_dump($origin_pw);
echo "<br />";
var_dump($hash_pw);
echo "<br />";
var_dump($match);
echo "<br />";
var_dump($not_match);
echo "<br />";
  • password_hash 함수 : 암호화 함수, PASSWORD_BCRYPT 옵션은 암호화에 Bcrypt 알고리즘을 사용한다는 의미

파일 읽고 쓰기

  • PHP는 디스크의 파일을 읽고 쓸 수 있는 기능 제공함
<?php
$data = "hi";
file_put_contents("data.txt", $data);

$load_data = file_get_contents('data.txt');

echo $load_data;
  • 데이터를 파일로 저장할 때는 file_put_contents 함수 사용
  • 데이터를 파일에서 읽어올 때는 file_get_contects 함수 사용
    • data.txt 파일을 읽어서 내용 출력

직렬화와 역직렬화

  • 직렬화 : 객체나 배열 등 복합형 타입의 데이터를 저장하고 복호화할 수 있도록 문자열 혹은 바이트 배열 형태로 변환하는 것
<?php
$data = array(1, 2, 3, 4);
$serial_data = serialize($data);
file_put_contents("data.txt", $serial_data);

$load_data = file_get_contents('data.txt');
$unserial_data = unserialize($load_data);

var_dump($load_data);
echo "<br />";
var_dump($unserial_data);
  • 직렬화된 데이터는 문자열 타입. 저장된 데이터를 그대로 읽은 변수 $_load_data 로 확인 가능
  • 직렬화는 serialize 함수 사용
  • 역직렬화는 unserialize 함수 사용
  • 데이터를 직렬화하여 데이터베이스에 넣거나 파일에 저장하는 용도로 많이 사용됨.

다른 파일 포함하기

  • 다른 php 파일을 불러와서 현재 파일의 일부인 것처럼 포함시켜 다룰 수 있음
<?php
require("before.php");

echo "this is main page : ";
echo $var;
echo "<br />";

require_once("after.php");
  • 위의 php 페이지가 실행되면 먼저 before.php 파일을 불러온 후, 이후 메인 페이지의 메세지를 출력하고, 마지막으로 after.php 파일을 불러온다.
  • php에서 다른 php 파일을 불러올 때 쓰는 명령어는 include , include_once , require , require_once 가 있다.
    • include 는 파일이 없어도 경고만 나올 뿐 PHP는 계속 동작함. 파일 하나가 여러 번 호출되면 되는 횟수만큼 파일을 포함.
    • include_once 는 파일이 없어도 경고만 나올 뿐 PHP는 계속 동작함. 파일 하나가 여러 번 호출되어도 처음 한 번만 파일 불러옴.
    • require 는 파일이 없으면 오류가 나며, PHP의 실행이 완전히 멈춤. 파일 하나가 여러 번 호출되는 횟수만큼 파일을 포함.
    • require_once 는 파일이 없으면 오류가 나며, PHP의 실행이 완전히 멈춤. 파일 하나가 여러 번 호출되어도 처음 한 번만 파일 불러옴.
  • php에서 require 은 단순히 다른 파일을 내 파일의 일부처럼 가지고 온다는 뜻으로, 불러오는 순간 전역변수와 함수, 클래스 등 모든 것이 현재 스택이 존재하는 스코프 안에서 동작함.

개발환경


  • XAMPP : PHP와 MySQL이 포함된 프로그램 패키지
  • Apache 웹 서버 : 사용자의 요청을 받아들이는 전문적인 웹 서버, 사용자의 요청이 있을 경우 php를 실행시키는 역할을 함
  • MariaDB 데이터베이스 : 데이터 관리, MySQL 호환 DB
  • PHP : 서버 프로그램을 실행하는 역할
  • Perl : 서버 프로그램을 실행하는 역할

XAMPP 설치 과정

설치 후 세팅 중에 에러가 발생해 해결방법을 작성해봄

XAMPP 종료 시 xampp-control.exe 파일에 권한이 없다고 뜸

  1. 관리자 권한으로 실행
  2. xampp-control.exe 파일 권한 변경
    xampp가 설치된 드라이브에서 xampp-control.exe 파일 찾기
  3. 우클릭하여 속성-보안-Everyone 사용자-편집-읽기,쓰기 권한 체크-적용-확인

MySQL start 후 무응답

MySQL start 버튼을 눌러도 Attemptin to start MySQL service 문구가 뜬 후 응답이 뜨지 않아서 검색을 해보았다.

  1. Windows 기준 검색창에서 "서비스"를 검색하여 도구를 연다.
  2. 목록에서 MySQL 서비스를 찾아 중지시킵니다.

그리고 저는 시작 유형을 사용 안 함으로 설정했는데
이 과정에서 에러가 났지만 무시하고 진행하니 실행되었습니다.

그리고 이전에 관리자 권한으로 cmd 창에서 sc mysql delete 도 하고,
포트 번호를 3306에서 3307으로 변경해줬습니다!

  1. 관리자 권한으로 XAMPP Control Panel 실행 후 - 우측 config - mysql - port 변경
  2. mysql 의 Config - my.ini에서 3306을 3307으로 모두 수정했습니다.

참고


profile
Whatever I want | Interested in DFIR, Security, Infra, Cloud

0개의 댓글