-
[SISS/웹 스터디] 2학기 3주차 스터디 - PHP24-2 SISS/웹 2024. 9. 22. 23:45
3주차 09/16 ~ 09/22 [PHP] 23 ~ 30
22. form과 POST
- <form>
- 속성
- action → 보낼 곳
- action=”form.php” → form.php에 주소 형식으로 정보가 전달됨 ($_GET[’이름’]으로 받을 수 있음)
- action → 보낼 곳
- <form> 안에서 사용할 기타 태그
- <input>
- type → 타입
- text, submit, …
- name → 전송할 이름
- placeholder → 입력 시 보여줄 문구
- type → 타입
- <textarea> → 여러 줄을 입력할 수 있음
- <input>
- 속성
- POST
- form의 정보 전송 방식
- GET
- form은 기본적으로 GET을 이용하여 사용자가 입력한 정보를 전달 → URL 파라미터에 정보가 추가되므로 콘텐츠를 공유할 경우 적합
- POST
- GET의 문제점을 해결하기 위한 URL을 변경하지 않고 정보를 전송하는 방식 → 정보 입력 혹은 삭제의 경우 적합
- 개발자 도구>Network>Headers에서 전송 내용을 확인할 수 있음
- $_POST
- php에서 POST 방식으로 전달된 데이터를 가져옴
- GET의 문제점을 해결하기 위한 URL을 변경하지 않고 정보를 전송하는 방식 → 정보 입력 혹은 삭제의 경우 적합
- GET
- form의 정보 전송 방식
// 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']); ?>
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']); ?>
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']); ?>
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'); ?>
26. 파일로 모듈화 - require
- 폴더를 만듦
- lib
- print.php
- view
- top.php
- bottom.php
- lib
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.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 공식 문서 > Function Reference (함수 목록)
- PHP Composer → 패키지 관리자 (누군가가 만든 패키지를 사용할 때)
- popular pakages 참고
- DB → 파일 대신 데이터를 체계적이고 안전하고 빠르게
- 회원 관리
- 기본
- cookie → 사이트 접속자 식별 (인증 시에는 사용하지 않음)
- session → 인증 시 사용
- 타사 인증 시스템 사용 → 카카오, 구글 로그인 등 (검색 예: federation authentication facebook php)
- 장점: 보안 강도가 높아짐
- 단점: 종속됨
- 기본
- 파일 업로드 → php file upload 검색
'24-2 SISS > 웹' 카테고리의 다른 글
[SISS/웹 스터디] 2학기 5주차 스터디 - MySQL (3) 2024.10.06 [SISS/웹 스터디] 2학기 4주차 스터디 - MySQL (1) 2024.09.29 [SISS/웹 스터디] 2학기 2주차 스터디 - PHP (0) 2024.09.14 [SISS/웹 스터디] 2학기 1주차 스터디 - PHP (1) 2024.09.08 - <form>