2020/<programing> <coding>

Step 3-2. Server side language PHP chap 2.

Rosik 2020. 3. 28. 15:37

1. PHP 함수만들기

https://youtu.be/XAVYo8uLlWM

file : index.php

 

함수를 만드는 것과 그 효과에 대한 간단한 설명

 

 

2-1. PHP 함수의 형식 1

https://youtu.be/gfCyAy_kE7M

2-2. PHP 함수의 형식 2

https://youtu.be/g1oXQ5hBDsc

2-3. PHP 함수의 형식 3

https://youtu.be/1JrU2jWH2h0

file : function2.php

 

python의 def와 같은 

PHP의 function.

함수 내에서 return을 만나는 순간 바로 break하기 때문에 

적는 순서에 유의할 것

 

 

3. PHP 함수의 활용

https://youtu.be/P6tQrxmLkhY

file : index.php

 

프로그래밍에서는 중복의 제거가 중요한 의미를 가지며,

함수를 이용할 수 있다면 이용해서 사용하자

 

while ($a < count($list[$a])) 

여기에서 count 함수 적용실수

count() 함수는 리스트의 크기를 측정해주는 함수이기 때문에 리스트 자체를 설정해주어야 하는데

$list[$a] 라고 설정해, 리스트가 아닌 하나의 값을 지정했기 때문에 count()함수가 정상적인 동작을 못함

 

코드를 길게 적용하는것 보다 함수를 만들어서 적용하는것이 훨씬 깔끔하게 코딩할 수 있음을 재확인!

 

 

4. 웹 완성예고

https://youtu.be/PDtUg2rne8M

 

CRUD 예고.

 

 

5. Form and Post

https://youtu.be/7tewXu5Zo2Q

file : form.html, form.php

 

form : 사용자의 정보를 서버쪽으로 전송할 때 사용하는 기능

즉 사용자가 입력한 정보(data)를 URL파라미터로 만들어주는 기능

그러나 보안상의 문제로 인해 URL에 정보가 포함되는 방식은 좋지 않은 방법.

 

데이터는 URL을 통하지 않게 전송되어야 함.

 

URL에 데이터가 포함될 때 좋은 경우는, 현재페이지를 바로 보여주고 싶을 때(북마크)

ID값정도를 포함시키는 수준이 제일 좋다.

 

data를 전송하는 방식을 method="post" 속성으로 정해주면, url을 사용하지 않고 은밀하게 데이터 전달가능

이 방법을 사용하면 form 데이터가 헤더를 통해 url을 통하지않고 전달되기 때문에 사용자는 확인할 수 없게된다.

이렇게 post로 전송된 데이터를 받을 때

데이터를 받는 곳 에서는 $_POST[''] 코드를 통해 받아야 한다.

 

form 태그에서 method값을 지정해주지 않으면 기본값이 "get"이고,

이때는 url을 파라미터를 통해서 데이터가 전송.

 

 

6. 글생성기능 구현하기

https://youtu.be/ExLCGW51mk0

file : index.php, create.php, create_process.php

 

 

index.php 파일에 

글생성기능 만들기

 

이전시간에 사용했던 

create_process.php 파일 내부에 file_put_contents() 함수를 이용해서 

create.php 에서 전송한 내용을 토대로 파일 생성

 

사용자로부터 정보를 받을 수 있는 상태가 됨.

 

즉 

index.php (메인화면) 에서 create 버튼을 누르면

생성을 할 수 있는 create.php 파일로 <a> 태그를 통해 이동하고,

create.php 에서 작성한 내용을 토대로 create_process.php 페이지는 
입력받은 내용의 파일을 생성.

 

리디렉션 : 다른페이지로 사용자를 이동시키는 기술.

할일이 끝났을 때. 사용자는 create_process.php 화면에 남아있을 필요가 없으므로, 

다른페이지로 이동시킨다.

php 코드 : header('Location : /index.php'.$_POST['title']);

위 코드는 index.php페이지에서 , id값을 가지는 페이지로 , 즉 

방금 작성한 글을 확인할 수 있는 페이지로 이동할 수 있게 하는 코드

 

 

7. 글 수정기능 구현하기

https://youtu.be/vQnyPjih2dQ

file : index.php, update.php, updata_process.php

 

update버튼은 메인화면에서 나오는것이 아니라, 

특정 글을 수정하기 위한것이므로, 글 내부로 들어갔을 때 등장하는것이 좋다.

 

create.php에서 <form> 부분을 그대로 복붙, 

update 버튼을 눌렀을 때 내용이 담겨있어야 수정이 가능하기 때문에 

초기값(value) 를 설정해준다.

 

and

 

submit 버튼을 눌렀을 때
수정한 내용을 파일에 저장하기 위한 역할을 update_process.php 가 수행한다.

update_process.php는 ./data 폴더에 있는 값을(제목, 내용) 을 수정하는 역할을 한다.

 

php file rename()

rename(old name, new name); 함수는 각각 old / new 이름들을 변수로 받기 때문에,

old name를 저장해줄 수 있는 변수가 필요함.

이 old name은 사용자에게 노출되지 않으면서 데이터를 전송할 수 있게 ( rename() 함수에서 old name을 알기위함) 설정

 

update_process.php를 통해 리디렉션해주어, 수정한 글을 바로 확인할 수 있게 설정하면

 

작성된 게시글의 제목과 내용을 수정 할 수 있는 포맷 완성

 

 

8. 글 삭제기능 구현하기

https://youtu.be/jGWumB5EZ1o

file : index.php, delete_process.php

 

 

php delete를 구현하기 위한 코드, 함수

 

unlink() : delete a file

그런데 unlink() 함수에서 id 값을 get 이 아니라 post로 받으면 삭제가 안되고 리디렉션 되는데

애초에 post로 전해주지 않고 get으로 데이터를 전송하기 때문이다. 

그러면 form 태그를 쓰지 않고는 post로 데이터를 전송할 수 있을까?

 

 

그러나 이렇게 삭제를 쉽게 두면 안된다. 아주나쁜방법임.

만약 누군가 작성한 글에 접속한 뒤, 그 글에 있는 delete 링크를 복사해서 전송하면

다른사람이 링크를 클릭하자마자 데이터가 삭제됨.

ex : http://127.0.0.1:8080/delete_process.php?id=Vietnam

위 링크를 눌러버리면 해당글이 삭제되어버림.

 

 

영상 후반에 가니 

결국 form 태그를 이용해서 데이터를 전송하는것을 알려줌.

삭제기능을 가진 코드가 링크를 이용해서 전달되면 안된다.

 

 

9. 모듈화, Require

https://youtu.be/XmNzWGKe3wg

file : lib, view, index.php, create.php, update.php

 

 

 

refactring : 기능을 그대로 둔 채 만들어 놓은 코드를 효율적으로 개선하는 작업.

처음부터 이상적인 코드를 짤 수는 없다.

 

현재

index.php, crate.php, update.php 이 세파일 모두 처음에 같은함수를 정의하고 시작하는데

이 코드들이 중복된다.

 

재사용할만한 함수나 로직을 정리정돈해두는 곳 lib

출력되는 곳들을 보관해두는 곳 view 등

각각의 부품들도 한곳에 묶어두고 관리하는게 좋다.

또 각 코드들을 짠 후 꼭 다시 정리하는, 리팩토링 과정이 중요.

 

 

10-1. PHP의 보안

XSS

https://youtu.be/8WV1Ym9BjEQ

file : xss.php

 

예를들어, 

업데이트를 할 때

내용에다 

<script>

alert('kkkk');

</script> 

이런 글을 작성해서 전송을 하면

계속해서 경고창이 뜬다.

location.href='http://naver.com'; 이런식으로 작성하면 광고처럼 원치않는 사이트로 이동되어버림

 

이때 php 의 htmlspecialchars()함수를 이용하면, 

태그적용이 되지 않고, 문자 그대로 출력됨.

그러나 이 함수를 적용하면 줄바꿈 등 필요한 태그들도 다 날아감, 

필요한 태그들을 살릴 수 있는 함수들도 존재

 

 

그리고 이 코드에서 

 

function print_list(){
  $list = scandir('./data');  
  $a = 0;
  while ($a < count($list)) {
    $title = htmlspecialchars($list[$a]);
    if($list[$a] != '.'){
      if($list[$a] != '..'){
        echo "<li><a href="index.php?id=$title\">$title</a></li>;
      }
    } $a = $a + 1;
  }
}

 

$title = htmlspecialchars($list[$a]); 

 

$title은 결국 $list[$a] 함수인데, $a값이 while 문 에서 반복되면서 증가하게되고, 그 결과로 $list값이 바뀐다.

그런데 이 줄이 while문 밖에 위치하게 된다면 $a값이 변경(증가)하지 못하고, $title에 대입된 값에 변경이 없게된다.

 

 

10-2. 파일 경로 보호

파일경로 보호

https://youtu.be/t0qRL6BvkjE

 

basename()

: 파일의 경로에서 파일이름만을 추출해주는 함수.

예를들어, url에 적혀있는 id값에 ../password.txt 라는 명령을 입력하면

상위경로로 이동하여 password.txt 에 적혀있는 내용을 외부에서 읽어낼 수 있다.

이때 위의 함수를 사용하면 ../ 이부분은 떼어버리고 password.txt 만 id값으로 인식, 

파일의 경로를 보호할 수 있다.

 

또,

개발자도구에서 preserve log 옵션을 선택하면 

어떻게 데이터를 주고 받는지 확인 할 수 있기 때문에 

해킹의 용도로 사용할 수 있음.

여기에서 어떤방식으로  파일을 삭제하는지 파악해 버리면

../ 기호를 사용해서 메인페이지인 index.php 파일을 삭제해 버릴 수도 있음.

그렇기 때문에 delete_process.php파일에서는 삭제 가능한 폴더를 data폴더만으로 제한할 필요가 있다.

이때에도 basement()함수를 사용하면 폴더경로를 이동할 수 없기 때문에
조금 더 안정적인 운영이 가능하다.