Skip to content
/ tinypast Public

A very simple PHP framework for legacy environments.

License

Notifications You must be signed in to change notification settings

inium/tinypast

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

40 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

tinypast

Legacy PHP ์—์„œ(5.3.29 ์ด์ƒ) ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Apache2 ํ™˜๊ฒฝ์—์„œ ๋™์ž‘ํ•˜๋Š” ๋งŒ๋“  ๋งค์šฐ ๊ฐ„๋‹จํ•œ Framework ์ž…๋‹ˆ๋‹ค.

A very simple PHP framework for legacy environments on Apache2.

๊ฐœ์š”

Legacy PHP (5.3.29 ์ด์ƒ) ์—์„œ ๊ตฌ์กฐ์ ์ธ ๊ฐœ๋ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ œ์ž‘ํ•œ ๋งค์šฐ ๊ฐ„๋‹จํ•œ Framework ์ž…๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ PHP Framework๋“ค์ด Modern PHP๋ฅผ ์œ„ํ•ด PHP ํ‘œ์ค€ ๊ถŒ๊ณ ์•ˆ(PSR)์„ ๋”ฐ๋ผ ์ œ์ž‘๋˜๊ณ  ์žˆ์œผ๋ฉฐ PHP์—์„œ ์ง€์›ํ•˜๋Š” 7.2 ๋ฒ„์ „๋ถ€ํ„ฐ ๊ณต์‹์ ์œผ๋กœ ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(๊ธ€ ์ž‘์„ฑ ์‹œ์  ๊ธฐ์ค€). ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ PHP๋กœ ์ œ์ž‘๋˜์–ด ์šด์˜๋˜๋Š” ์‚ฌ์ดํŠธ ์ผ๋ถ€๋Š” Framework ์—†์ด ๊ฐœ๋ฐœ๋˜์—ˆ์œผ๋ฉฐ ๊ด€๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š์•„ ์œ ์ง€๋ณด์ˆ˜ ๋ฐ ์ถ”๊ฐ€ ๊ฐœ๋ฐœ์— ์–ด๋ ค์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ์‹œ์ ์—์„œ ์‚ฌ์šฉ๋œ PHP๋Š” 5.x ๋ฒ„์ „๋Œ€๊ฐ€ ๋Œ€๋ถ€๋ถ„์ด๋ฉฐ ์ด๋Š” ํ˜„์žฌ Legacy๊ฐ€ ๋˜์–ด ๋ณด์•ˆ์ด์Šˆ, ์ตœ์‹  ์–ธ์–ด ๊ธฐ๋Šฅ ๋ฏธ์ง€์› ๋“ฑ์œผ๋กœ ๋” ์ด์ƒ ์‚ฌ์šฉ์ด ๊ถŒ๊ณ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์‰ฌ์šด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ PHP 7 ์ด์ƒ์œผ๋กœ Laravel๊ณผ ๊ฐ™์€ Framework๋ฅผ ๋„์ž…ํ•ด ์ƒˆ๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ด๋‚˜ ์ด๋Š” ๋งŽ์€ ์‹œ๊ฐ„๊ณผ ๋น„์šฉ์„ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ด์™€ ๋ณ„๋„๋กœ PHP ๋ฒ„์ „์„ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•˜๋Š” ๊ฒƒ์€ ์†Œ์Šค์ฝ”๋“œ์— ์‚ฌ์šฉ๋œ ํ˜„์žฌ Deprecated๋œ Feature ๋“ค๋กœ ์ธํ•ด Side effect๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์‹ ์ค‘ํžˆ ๊ฒฐ์ • ํ›„ ์ง„ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐ€์žฅ ํ˜„์‹ค์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๊ธฐ์กด PHP ๋ฒ„์ „์„ ์œ ์ง€ํ•œ ์ฑ„ ์œ ์ง€๋ณด์ˆ˜ ๊ณผ์ •์—์„œ MVC ๋„์ž… ํ˜น์€ ์œ ์‚ฌํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด ๋‚˜๊ฐ€์•ผ ํ•˜๋ฉฐ ํŠน์ • ์‚ฌ์ดํŠธ ํ˜น์€ ํŽ˜์ด์ง€๋“ค, ๋””๋ ‰ํ„ฐ๋ฆฌ์— Framework๋ฅผ ๋„์ž…ํ•ด ๊ฐœ๋ฐœ์„ ํ•˜๋ฉฐ ์กฐ๊ธˆ์”ฉ ๋ฐ”๊พธ์–ด ๋‚˜๊ฐ€๋Š” ๋ฐฉ๋ฒ•์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ณธ ํ”„๋กœ์ ํŠธ๋Š” ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์— ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌํ˜„๋œ ๋งค์šฐ ๊ฐ„๋‹จํ•œ Framework ์ž…๋‹ˆ๋‹ค. Legacy PHP์ธ 5.3.x ์ด์ƒ์—์„œ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก Route Pattern์„ ๋„์ž…ํ•˜์˜€์Šต๋‹ˆ๋‹ค. composer ์—†๋Š” ํ™˜๊ฒฝ์„ ๊ณ ๋ คํ•˜์—ฌ composer ์—†์ด ๋ณธ ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋ณธ ํ”„๋กœ์ ํŠธ๋Š” Apache2 ํ™˜๊ฒฝ์—์„œ ๊ตฌํ˜„ ๋ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ์ด๋ฃจ์–ด์กŒ์œผ๋ฉฐ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Getting Started

Server Requirements

๋ณธ Framework๋Š” ์•„๋ž˜์˜ ์„œ๋ฒ„ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • php 5.3.29 or upper
  • apache2 mod_rewrite on
  • SimpleXML

Install

๋ณธ Framework๋Š” composer ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” PHP ํ™˜๊ฒฝ์„ ๊ณ ๋ คํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋‹ค์šด๋กœ๋“œ ํ•œ ํ›„ Project root์— ๋ณต์‚ฌํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰

APM ํ™˜๊ฒฝ์—์„œ Project root์— ๋ณธ Framework๋ฅผ ์ €์žฅํ•˜์—ฌ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” docker ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ Project root ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด docker-compose ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

docker-compose up

docker-compose ๋ช…๋ น์–ด๋Š” docker ๊ณต์‹ php:5.3-apache๋ฅผ ์ด์šฉํ•œ ํ›„ mod_rewrite on์„ ํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Project root์˜ docker-compose.yml ๊ณผ Dockerfile ์ฐธ์กฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Structures

๋ณธ Framework์˜ ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • root
    • app
      • Controllers : Controller ์ €์žฅ ๋””๋ ‰ํ„ฐ๋ฆฌ
      • Models: Model ์ €์žฅ ๋””๋ ‰ํ„ฐ๋ฆฌ (Optional).
    • example: ์‚ฌ์šฉ์ž(Users) ์ •๋ณด ๋‹จ์ˆœ CRUD ๊ตฌํ˜„ Model, View, Controller ์ €์žฅ
    • tinypast
      • foundation: Framework Core Module
      • vendor: ์™ธ๋ถ€ ๋ชจ๋“ˆ(password_compact, AES ๋“ฑ)
      • Autoloader.php: namespace autoload (require) ์‹คํ–‰
    • public: Framework ์‹คํ–‰ ํŒŒ์ผ(index.php), CSS, JavaScript, font, image ๋“ฑ ์ €์žฅ
    • resources
      • views: View ํŒŒ์ผ ์ €์žฅ
    • .env.example: .env ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ
    • docker-compose.yml: Docker ์‹คํ–‰ํ™˜๊ฒฝ ์ €์žฅ
    • Dockerfile: Docker ์ด๋ฏธ์ง€
    • routes.xml: Route ์ €์žฅ xml

Features

๋ณธ Framework์—์„œ ๊ตฌํ˜„ํ•œ ๊ธฐ๋Šฅ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ example์˜ Users ์˜ˆ์‹œ ์ฐธ์กฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Namespace autoload

Namespace๋ฅผ ๋„์ž…ํ•˜์˜€์œผ๋ฉฐ Namespace ์™€ Class ์ด๋ฆ„์œผ๋กœ require ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ( autoload.php ์ฐธ์กฐ) .

RESTful

์•„๋ž˜์™€ ๊ฐ™์ด RESTful method๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • GET
  • POST
  • PUT
  • PATCH
  • DELETE

PUT, PATCH, DELETE method ์‚ฌ์šฉ์€ ์•„๋ž˜์™€ ๊ฐ™์ด HTML form์˜ magic method๋ฅผ ๋ช…์‹œํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<!-- PUT method: ์‚ฌ์šฉ์ž ์ •๋ณด ์ˆ˜์ • -->
<form action="/user/1" method="POST">
	<input type="hidden" name="_method" value="PUT">
  ...
</form>

<!-- DELETE method: ์‚ฌ์šฉ์ž ์ •๋ณด ์‚ญ์ œ -->
<form action="/user/1" method="POST">
	<input type="hidden" name="_method" value="DELETE">
  ...
</form>

MVC

Model View Controller๋ฅผ ์ด์šฉํ•ด ๊ตฌํ˜„ํ•˜๋ฉฐ Route์— ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Controller

Foundation\BaseController๋ฅผ ์ƒ์†ํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. RESTful Method์— ๋Œ€์‘ํ•˜๋Š” ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋“ค์€ request ๋ฐฐ์—ด์„ ์ธ์ž๋กœ ๋ฐ›์œผ๋ฉฐ ์ดํ›„ route์˜ url parameter๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. Foundation\BaseController๋Š” View ๋ Œ๋”๋ง & sanitize (๊ณต๋ฐฑ, ํƒญ ์ œ๊ฑฐ / ์ฃผ์„์ œ๊ฑฐ), ๋ฐฐ์—ด ๊ฐ’์˜ XSS filter, redirect ๊ฐ€ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<?php
namespace App\Controllers;

use Foundation\BaseController;
use App\Models\UserModel;

class UserController extends BaseController
{
	private $model = null;
  
  public function __construct() 
  {
		$this->model = new UserModel();  
  }
  
  // ์‚ฌ์šฉ์ž ๋ชฉ๋ก
  public function index($request) 
  {
    $users = $this->model->findAll();
    return $this->render('../resources/views/users/index.php', array(
      'users' => $users
    ));
  }
  
  // ์‚ฌ์šฉ์ž ์ •๋ณด ์ˆ˜์ •
  public function update($request, $userId)
  {
  	$req = $this->sanitizeRequest($request);
    $params = array(
      'name' => $req['user_name'],
      'email' => $req['user_email'],
      'phone' => $req['user_phone'],
      'memo' => $req['user_memo']
    );

    $rows = $this->model->update($params, $userId);

 		return $this->redirect("/users/{$userId}");
  }
}

Model

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ฐ’์„ CRUD ํ•˜๋ฉฐ Foundation\BaseModel์„ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. Foundation\BaseModel์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๊ธฐ๋ณธ์ ์ธ CRUD ๊ฐ€ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • findAll(): ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ๋ชจ๋“  row๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
  • findById($id): $id์— ํ•ด๋‹นํ•˜๋Š” row๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
  • Insert($param): ๋ฐ์ดํ„ฐ ์‚ฝ์ž…. ์‚ฝ์ž…ํ•  ๊ฐ’์ด ์ €์žฅ๋œ $param์€ (ํ•„๋“œ๋ช… => ๊ฐ’) ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋ฐฐ์—ด์ด ์ž…๋ ฅ๋˜์–ด์•ผ ํ•จ.
  • Update($param, $id): $id์— ํ•ด๋‹นํ•˜๋Š” row์˜ ๋ฐ์ดํ„ฐ ๊ฐฑ์‹ . ๊ฐฑ์‹ ๋  ๊ฐ’์ด ์ €์žฅ๋œ $param์€ (ํ•„๋“œ๋ช… => ๊ฐ’) ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋ฐฐ์—ด์ด ์ž…๋ ฅ๋˜์–ด์•ผ ํ•จ.
  • DeleteById($id): $id์— ํ•ด๋‹นํ•˜๋Š” row๋ฅผ ์‚ญ์ œํ•œ๋‹ค.
<?php
namespace App\Models;

use Foundation\BaseModel;

class UserModel extends BaseModel
{
    /**
     * ์ƒ์„ฑ์ž
     */
    public function __construct()
    {
        parent::__construct('users');
    }
}

View

Controller์—์„œ ํ˜ธ์ถœํ•œ render() ํ•จ์ˆ˜์˜ ์ฒซ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ View ํŒŒ์ผ(.php)์— 2๋ฒˆ์งธ ์ธ์ž์ธ ๋ฐฐ์—ด ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๋ชฉ๋ก์„ ์ถœ๋ ฅํ•˜๋Š” ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<?php require_once __DIR__ . '/../layouts/header.php'; ?>

<!-- example/resources/views/users/index.php -->
<div class="container">
    <h5>์‚ฌ์šฉ์ž ๋ชฉ๋ก</h5>
    <div class="list-group">
<?php foreach ($users as $user): ?>
        <a href="/users/<?= $user->id ?>" class="list-group-item list-group-item-action">
            <div class="row">
                <div class="col-1"><?= $user->id ?></div>
                <div class="col-2"><?= $user->name ?></div>
                <div class="col-3"><?= $user->email ?></div>
                <div class="col-3"><?= $user->phone ?></div>
                <div class="col-3"><?= $user->created_at ?></div>
            </div>
        </a>
<?php endforeach; ?>
    </div>
</div>

<?php require_once __DIR__ . '/../layouts/footer.php';?>

Route XML

Route๋ฅผ routes.xm ํŒŒ์ผ์—์„œ ์ •์˜ํ•˜๋ฉด public/index.php ํŒŒ์ผ์—์„œ routes.xml ํŒŒ์ผ์„ Parseํ•˜์—ฌ Foundation\Route ํด๋ž˜์Šค๊ฐ€ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. routes.xml์˜ ๊ตฌ์„ฑ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<?xml version="1.0" encoding="UTF-8"?>
<document>
    <!-- Route ์ •๋ณด -->
    <routes baseUrl="/">
        <web>
            <route method="GET" url="/" controller="App\Controllers\HomeController@index" />
            <route method="GET" url="/info.html" controller="App\Controllers\HomeController@info" />
        </web>
    </routes>
    <!-- Error ๋ฐœ์ƒ ์‹œ ์ฒ˜๋ฆฌํ•  Handler ์ •๋ณด -->
    <errors>
        <error code="404" name="Not Found" controller="App\Controllers\ErrorController::notFound" />
        <error code="405" name="Method Not Allowed" controller="App\Controllers\ErrorController::methodNotAllowed" />
    </errors>
</document>

Variables

Route๋Š” URL์— ์‚ฌ์šฉ์ž ์ž…๋ ฅ parameter๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, url์— :value์™€ ๊ฐ™์ด ์ฝœ๋ก (:) ์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ณ€์ˆ˜๋ช…์„ ์ž…๋ ฅํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

<route method="PUT" url="/users/:userId" controller="App\Controllers\UserController@update" />

์œ„์˜ route์˜ :userId๋Š” URL์— ์ž…๋ ฅ๋œ ๊ฐ’์ด๋ฉฐ(ex. /users/1 ์˜ 1) controller์—์„œ ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ’์„ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

<?php
  
class UserController extends BaseController
{
  // ์‚ฌ์šฉ์ž ์ •๋ณด ์ˆ˜์ •. $userId ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” Route url์— ์ •์˜๋œ :userId ํ•ญ๋ชฉ.
  public function update($request, $userId)
  {
  	$req = $this->sanitizeRequest($request);
    $params = array(
      'name' => $req['user_name'],
      'email' => $req['user_email'],
      'phone' => $req['user_phone'],
      'memo' => $req['user_memo']
    );

    $rows = $this->model->update($params, $userId);

 		return $this->redirect("/users/{$userId}");
  }
}

Error Handler

๋ณธ Framework์—๋Š” 404, 405 Error Handler๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. routes.xml์— <errors> node ์•„๋ž˜ ์•„๋ž˜์™€ ๊ฐ™์ด ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<?xml version="1.0" encoding="UTF-8"?>
<document>
  <routes>
    <web>...</web>
  </routes>
	<errors>
        <error code="404" name="Not Found" controller="App\Controllers\ErrorController@notFound" />
        <error code="405" name="Method Not Allowed" controller="App\Controllers\ErrorController@methodNotAllowed" />
    </errors>
</document>

Error Controller๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<?php

namespace App\Controllers;

use Foundation\BaseController;

class ErrorController extends BaseController
{
    /**
     * 404 Not found
     *
     * @param $request      $_REQUEST
     */
    public function notFound($request)
    {
        return '404 Not Found';
    }

    /**
     * 405 Method not allowed
     *
     * @param $request      $_REQUEST
     */
    public function methodNotAllowed($request)
    {
        return '405 Method Not Allowed';
    }
}

Crypto

bcrypt, AES๋ฅผ ์ ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

bcrypt

PHP 5.3.x ๋ฒ„์ „์—์„œ๋Š” password_hash, password_verify ํ•จ์ˆ˜๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์˜ ๋ชจ๋“ˆ์„ ์ด์šฉํ•ด ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ๋ชจ๋“ˆ์— ๊ตฌํ˜„๋œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

AES

openssl ํ˜น์€ mcrypt ๊ณ„์—ด(์ตœ์‹  ๋ฒ„์ „์—์„œ deprecated)๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‚˜ ๋‘˜ ๋‹ค ์—†์„ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•ด ์•„๋ž˜์˜ ์ˆœ์ˆ˜ AES ๊ตฌํ˜„ ๋ชจ๋“ˆ์„ ์ ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Security

๋ณธ Framework์— ๊ตฌํ˜„๋˜์—ˆ๊ณ  ์˜ˆ์ •์ธ ๋ณด์•ˆ ๊ด€๋ จ๋œ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

SQL Injection

PDO์˜ Prepared Statement๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

XSS

๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ Controller์—์„œ Sanitize ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค. Foundation\BaseController ์˜ sanitizeStr, sanitizeRequest ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด XSS Sanitize ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

CSRF

ํ•ด๋‹น ๊ธฐ๋Šฅ์€ ์„ธ์…˜๊ณผ ๊ฐ™์ด ๊ตฌํ˜„๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ธ์…˜ ๊ตฌํ˜„๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

๊ธฐํƒ€

  • Rendering๋œ View ํŒŒ์ผ์„ Sanitize ํ•˜์—ฌ ๊ณต๋ฐฑ, ํƒญ, ์ฃผ์„ ๋ฌธ์„ ์ œ๊ฑฐํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Example

๋ณธ Framework์—์„œ๋Š” ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด์˜ CRUD ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ” ์ถ”๊ฐ€ ํ›„example` ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ํŒŒ์ผ์„ ์•„๋ž˜์˜ ๊ฒฝ๋กœ์— ๋ณต์‚ฌํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  1. .env.example ํŒŒ์ผ ๋ณต์‚ฌํ•˜์—ฌ .env ํŒŒ์ผ ์ƒ์„ฑ ํ›„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค connection ์ •๋ณด ์ž…๋ ฅ
  2. test ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ ํ›„ examples\test.sql ํŒŒ์ผ์„ import
  3. examples\app\Controllers\UserController.php ํŒŒ์ผ์„ app\Controllers ์— ๋ณต์‚ฌ
  4. examples\app\Models\UserModel.php ํŒŒ์ผ์„ app\Models ์— ๋ณต์‚ฌ
  5. examples\resources\views\users ๋‚ด ๋ชจ๋“  ํŒŒ์ผ์„ resources\views\users ์— ๋ณต์‚ฌ
  6. routes.xml.stub ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ routes.xml ํŒŒ์ผ์˜ ` routes > web node ์— ์ถ”๊ฐ€
  7. /users URL์— ์ ‘์† ํ›„ ๋™์ž‘ ํ™•์ธ

Future Works

CSRF

CSRF ๊ตฌํ˜„์€ Session์ด ํ•„์š”ํ•˜๋ฉฐ token ๊ฐ’ ์ƒ์„ฑ ๊ณผ์ • ๊ตฌํ˜„์„ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค. php 5.3.x ๋ฒ„์ „์—์„œ ๋žœ๋คํ•œ token ์‚ฌ์šฉ์— mcrypt, openssl ์€ ๋ณ„๋„์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ํฌํ•จํ•ด UUID ๋“ฑ์„ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•์„ ๊ฒ€ํ† ํ•œ ํ›„ ๊ตฌํ˜„์„ ์ง„ํ–‰ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

Session

Session์„ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•ด ์ ์šฉํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ php 5.3.x์—์„œ SessionHandlerInterface ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌํ˜„์„ ์ฐธ์กฐํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

References

๋ณธ Framework์˜ Route๋Š” ์•„๋ž˜์˜ ๋‚ด์šฉ์„ ์ฐธ์กฐํ•ด ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

License

MIT

About

A very simple PHP framework for legacy environments.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages