-
Step 3-2. Server side language PHP chap 2.2020/<programing> <coding> 2020. 3. 28. 15:37
1. PHP 함수만들기
file : index.php
함수를 만드는 것과 그 효과에 대한 간단한 설명
2-1. PHP 함수의 형식 1
2-2. PHP 함수의 형식 2
2-3. PHP 함수의 형식 3
file : function2.php
python의 def와 같은
PHP의 function.
함수 내에서 return을 만나는 순간 바로 break하기 때문에
적는 순서에 유의할 것
3. PHP 함수의 활용
file : index.php
프로그래밍에서는 중복의 제거가 중요한 의미를 가지며,
함수를 이용할 수 있다면 이용해서 사용하자
while ($a < count($list[$a]))
여기에서 count 함수 적용실수
count() 함수는 리스트의 크기를 측정해주는 함수이기 때문에 리스트 자체를 설정해주어야 하는데
$list[$a] 라고 설정해, 리스트가 아닌 하나의 값을 지정했기 때문에 count()함수가 정상적인 동작을 못함
코드를 길게 적용하는것 보다 함수를 만들어서 적용하는것이 훨씬 깔끔하게 코딩할 수 있음을 재확인!
4. 웹 완성예고
CRUD 예고.
5. Form and Post
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. 글생성기능 구현하기
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. 글 수정기능 구현하기
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. 글 삭제기능 구현하기
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
file : lib, view, index.php, create.php, update.php
refactring : 기능을 그대로 둔 채 만들어 놓은 코드를 효율적으로 개선하는 작업.
처음부터 이상적인 코드를 짤 수는 없다.
현재
index.php, crate.php, update.php 이 세파일 모두 처음에 같은함수를 정의하고 시작하는데
이 코드들이 중복된다.
재사용할만한 함수나 로직을 정리정돈해두는 곳 lib
출력되는 곳들을 보관해두는 곳 view 등
각각의 부품들도 한곳에 묶어두고 관리하는게 좋다.
또 각 코드들을 짠 후 꼭 다시 정리하는, 리팩토링 과정이 중요.
10-1. PHP의 보안
XSS
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. 파일 경로 보호
파일경로 보호
basename()
: 파일의 경로에서 파일이름만을 추출해주는 함수.
예를들어, url에 적혀있는 id값에 ../password.txt 라는 명령을 입력하면
상위경로로 이동하여 password.txt 에 적혀있는 내용을 외부에서 읽어낼 수 있다.
이때 위의 함수를 사용하면 ../ 이부분은 떼어버리고 password.txt 만 id값으로 인식,
파일의 경로를 보호할 수 있다.
또,
개발자도구에서 preserve log 옵션을 선택하면
어떻게 데이터를 주고 받는지 확인 할 수 있기 때문에
해킹의 용도로 사용할 수 있음.
여기에서 어떤방식으로 파일을 삭제하는지 파악해 버리면
../ 기호를 사용해서 메인페이지인 index.php 파일을 삭제해 버릴 수도 있음.
그렇기 때문에 delete_process.php파일에서는 삭제 가능한 폴더를 data폴더만으로 제한할 필요가 있다.
이때에도 basement()함수를 사용하면 폴더경로를 이동할 수 없기 때문에
조금 더 안정적인 운영이 가능하다.'2020 > <programing> <coding>' 카테고리의 다른 글
Step 3-1. Server side language PHP chap 1. (0) 2020.03.23 step 2-2. database 언어 chap 2. (0) 2020.03.21 step 2-2. database 언어 chap 1. (0) 2020.03.15 step 2. (0) 2020.03.13 step 1. (0) 2020.03.13