24-2 SISS/웹

[SISS/웹 스터디] 2학기 3주차 스터디 - PHP

noname64 2024. 9. 22. 23:45

2학기 3주차 스터디 - PHP

3주차 09/16 ~ 09/22 [PHP] 23 ~ 30

 

22. form과 POST


  • <form>
    • 속성
      • action → 보낼 곳
        • action=”form.php” → form.php에 주소 형식으로 정보가 전달됨 ($_GET[’이름’]으로 받을 수 있음)
    • <form> 안에서 사용할 기타 태그
      • <input>
        • type → 타입
          • text, submit, …
        • name → 전송할 이름
        • placeholder → 입력 시 보여줄 문구
      • <textarea> → 여러 줄을 입력할 수 있음

 

  • POST
    • form의 정보 전송 방식
      • GET
        • form은 기본적으로 GET을 이용하여 사용자가 입력한 정보를 전달 → URL 파라미터에 정보가 추가되므로 콘텐츠를 공유할 경우 적합
      • POST
        • GET의 문제점을 해결하기 위한 URL을 변경하지 않고 정보를 전송하는 방식 → 정보 입력 혹은 삭제의 경우 적합
          • 개발자 도구>Network>Headers에서 전송 내용을 확인할 수 있음
        • $_POST
          • php에서 POST 방식으로 전달된 데이터를 가져옴
// form.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>form</title>
</head>
    <body>
        <form action="form.php" method="post">
            <p><input type="text" name="Title" placeholder="title"></p>
            <p><textarea name="description"></textarea></p>
            <p><input type="submit"></p>
        </form>
    </body>
</html>
// form.php

<?php
    file_put_contents('data/'.$_POST['title'], $_POST['description']);
?>

22. form과 POST

 

23. 글 생성


  • create
    • 입력 링크 생성
    • 제목 및 본문 입력
    • 입력 내용 파일 생성
    • 제출한 내용의 페이지로 이동 (redirection)
    // index.php (생성 링크 추가)
    ...
        <a href="/web1_html_internet-master/create.php">create</a>
    ...
    
    // create.php (입력 form, index.php 복사)
    <a href="/web1_html_internet-master/create.php">create</a>
    <form action="/web1_html_internet-master/create_process.php" method="post">
    	<p>
    		<input type="text" name="title" placeholder="Title">
    	</p>
    	<p>
    		<textarea name="description" placeholder="Description"></textarea>
    	</p>
    	<p>
    		<input type="submit">
    	</p>
    </form>
    
    // create_process.php (입력 내용 파일 생성, 페이지 이동)
    <?php
        file_put_contents('data/'.$_POST['title'], $_POST['description']);
        header('Location: /web1_html_internet-master/index.php?id='.$_POST['title']);
    ?>
    

23. 글 생성

 

24. 글 수정


  • Update
    • rename() → 파일 명 수정
    • <?= … ?> → <?php echo … ?>일 경우 사용

    • 수정 링크 생성 → 각 게시물 페이지에서만 생성됨 (홈 화면에서는 나타나지 않음)
    • 제목 및 본문 로드 및 수정 제출
    • 수정 내용 파일 저장
    • 수정한 내용의 페이지로 이동 (redirection)
    // index.php (주소에 id가 있을 경우 수정 링크 추가)
    ...
    <a href="/web1_html_internet-master/create.php">create</a>
    <?php if (isset($_GET['id'])) { ?>
    	<a href="/web1_html_internet-master/update.php?id=<?=$_GET['id']?>">update</a>
    <?php } ?>
    ...
    
    // update.php (원문이 담긴 form, index.php 복사 및 create.php의 form 복사)
    <form action="/web1_html_internet-master/update_process.php" method="post">
    	<input type="hidden" name="old_title" value="<?=$_GET['id']?>">
    	<p>
    		<input type="text" name="title" placeholder="Title" value="<?php print_title(); ?>">
    	</p>
    	<p>
    		<textarea name="description" placeholder="Description"><?php print_description();?></textarea>
    	</p>
    	<p>
    		<input type="submit">
    	</p>
    </form>
    
    // update_process.php (제목 및 본문 수정 후 저장, 수정 페이지로 이동)
    <?php
        rename('data/'.$_POST['old_title'], 'data/'.$_POST['title']);
        file_put_contents('data/'.$_POST['title'], $_POST['description']);
        header('Location: /web1_html_internet-master/index.php?id='.$_POST['title']);
    ?>
    

24. 글 수정

 

25. 글 삭제


  • delete
    • unlink() → 파일 삭제

    • 파일 삭제 form 추가 → (GET) 링크를 통해 삭제하면 문제가 발생할 수 있음 (타인이 악의적으로 링크를 이용하거나, 페이지를 미리 로드하는 플러그인이 해당 페이지를 로드하는 경우 등) → (POST) form을 이용해서 삭제
    • 삭제 후 홈으로 이동
    // index.php (파일 삭제 링크)
    <?php if (isset($_GET['id'])) { ?>
    	<a href="/web1_html_internet-master/update.php?id=<?=$_GET['id']?>">update</a>
    	<form action="/web1_html_internet-master/delete_process.php" method="post">
    		<input type="hidden" name="id" value="<?=$_GET['id']?>">
    		<input type="submit" value="delete">
    	</form>
    <?php } ?>
    
    // delete_process.php (삭제)
    <?php
        unlink('data/'.$_POST['id']);
        header('Location: /web1_html_internet/index.php');
    ?>
    

25. 글 삭제

 

26. 파일로 모듈화 - require


  • 폴더를 만듦
    • lib
      • print.php
    • view
      • top.php
      • bottom.php

 

27.1. 보안 XSS


  • Cross Site Scripting (XSS) → 웹 사이트에 스크립트 태그(자바스크립트를 실행하는 코드)를 주입

 

  •  방지
    • htmlspecialchars() → 꺽쇠(태그)를 html에서 사용하는 엔티티로 바꿈 → 자바스크립트가 동작하지 않음 (대신 이미지 등도 동작하지 않을 수 있으므로 다른 태그를 사용하는 것을 추천)
// lib/print.php
<?php
    function print_title() {
        if (isset($_GET['id'])) {
            echo htmlspecialchars($_GET['id']);
        } else {
            echo "Welcome";
        }
    }

    function print_description() {
        if (isset($_GET['id'])) {
            echo htmlspecialchars(file_get_contents("data/".$_GET['id']));
        } else {
            echo "Hello PHP~!";
        }
    }

    function print_list() {
        $list = scandir('./data');
        $i = 0;

        while ($i < count($list)) {
            $title = htmlspecialchars($list[$i]);

            if ($list[$i] != '.') {
                if ($list[$i] != '..') {
                    echo "<li><a href=\"index.php?id=$title\">$title</a></li>\n";
                }
            }
            $i = $i + 1;
        }
    }
?>

27.1. 보안 XSS

 

27.2. 보안 파일 경로 보호


  • 파일 경로 보안 → 중요한 정보가 저장되어있는 파일 위치를 알아내면 정보를 탈취할 수 있음
    • basename() → 파일 명을 추출하는 함수 → 파일 경로 대신 파일 명만 반환
    // lib/print.php
    function print_description() {
        if (isset($_GET['id'])) {
            $basename = basename($_GET['id']);
            echo htmlspecialchars(file_get_contents("data/".$basename));
        } else {
            echo "Hello PHP~!";
        }
    }
    

 

  • 개발자 도구 > Network > Preserve log → 서버와의 데이터 교환 기록을 저장 → 메소드 등을 알아내 위협을 가할 수 있음
// delete_process.php
<?php
    unlink('data/'.basename($_POST['id']));
    header('Location: /web1_html_internet-master/index.php');
?>

 

29. UI API 그리고 공부 방법


  • UI (User Interface) → 사용자가 접하는 모든 것 (폼, 링크 등)
  • API (Application Programming Interface) → 함수, 태그 등등

 

  • 공부 방법 추천 → 최소한의 문법과 API를 이용하여 코드를 작성해보자 → 나중에 효율성을 추구하는 것으로…

 

30. 수업을 마치며


  • PHP의 API
    • php 공식 문서 > Function Reference (함수 목록)
      • Compression and Archive Extensions
      • Cryptography Extensions
      • File System…
      • Image Procession and Generation
      • Mail…
  • PHP Composer → 패키지 관리자 (누군가가 만든 패키지를 사용할 때)
    • popular pakages 참고

 

  • DB → 파일 대신 데이터를 체계적이고 안전하고 빠르게

 

  • 회원 관리
    • 기본
      • cookie → 사이트 접속자 식별 (인증 시에는 사용하지 않음)
      • session → 인증 시 사용
    • 타사 인증 시스템 사용 → 카카오, 구글 로그인 등 (검색 예: federation authentication facebook php)
      • 장점: 보안 강도가 높아짐
      • 단점: 종속됨

 

  • 파일 업로드 → php file upload 검색