PHP Security secure > PHP

STUDY ROOM

PHP

PHP Security secure

페이지 정보

작성자 JMStudy 작성일06-06-15 15:58 조회3,771회 댓글0건

본문


PHP Security secure



최종 수정 : 2002년 4월 06일





register_globals=off 보안 - 국내 웹사이트에 최초 공개 ! tood.net  @ Suhoi Lee

강좌를 퍼가실려면 tood.net 사이트 링크 해주셔야 합니다 ^^







[긴급] PHP파일 업로드 패치하기
http://www.tood.net/tood/toodboard/toodread.php?board=tootech&tcode=993






◆ 반드시 알아아 할 PHP 보안 30가지 ◆◇◆◇◆◇




(추가 현황 CVS)


세션 보안 최적화  !trans_id  [2002.04.06]
PHP 확장자 숨기기 [2002.03.22]
스팸 봇이 여러분의 email주소를 [2002.03.10]
location.replace 인증 부분 - 초짜 님 제공(jcorn***@hanmail.net)  [ 2002.03.10]
파일업로드 보안에 PHP4.1.2 부분 추가 됨 [ 2002.03.02 ]
HTML 허용하기와 보안 추가됨 [2002.2.xx]





아래 문서는 제가 아는 내용(80%) + PHPbuilder.com 내용(20%)+ 제보( combel 님,초짜님) 를 정리한 내용 입니

다.



http://www.phpbuilder.com





계속적으로 추가하구요. 메인에 링크 시키겠습니다 ^^



◆ 다른 보안을 알고 계시면 답변 달아 주세용 ^^  추가 하겠습니당.





보안★★☆★★☆★  register_globals off ★☆★★☆★★☆★★☆★ 무조건 하세요!!!  ★



-->php.ini 중에서
register_globals = off
enable_track_vars = on (PHP4.0.3 이상은 항상 on - 이전 버전은 컴파일시 옵션 주어야 함 !)

PHP 에서 form 문이나 session 의 변수를 $name 등으로 사용하시지 마세요 !!!

브라우져 주소 표시줄 에서 http://localhost/tood=net&userid=3
등으로나 여러 방법으로 쉽게 뚫릴 수 있습니당 !!

반드쉬 HTTP_POST_VARS 나 HTTP_SESSION_VARS 로 체크 하세용 !!!

PHP4.1.0의 경우 _GET등으로 변경 되었습니다.
http://tood.net/tood/toodboard/toodread.php?board=tootech&tcode=773&position=2

좀더 사이트가 크다면 무조건 SSL 사용하시구요 ^^

tood.net 도 php.ini 에서 register_globals=off 하였습니당..ㅋㅋㅋ


★☆★★☆★ ★☆★★☆★ ★☆★★☆★ ★☆★★☆★ ★☆★★☆★  

무조건 사용하세용..!!! 사용하시지 않을려면 tood.net 오지 마세용 !!!

우선 ★테스트 서버에서 충분히 테스트를 하신 후에 , 진짜 실행 웹서버에 올리세용
테스투 서버에서 배열, GET,POST,세션,쿠키,환경변수,파일업로드를 충분히 다뤄
본 후에 웹서버에 올리세용 !!! 최소 2-3 주 정도 테스트 하세용 !

변수에는 일반변수, 전역변수,상수,세션변수,배열 변수, Get 변수, Post 변수,
환경 변수, 웹 서버 변수 등이 있습니다.
http://www.tood.net/tood/toodboard/toodread.php?board=tootech&tcode=912

★☆★★☆★ ★☆★★☆★ ★☆★★☆★ ★☆★★☆★





회원 인증 로그인 시스템 보안



php.ini 에서 register_globals=off 하시면 , 일단 보안이 되구요.
세션을 사용시 $_SESSION 이나 $HTTP_SESSION_VARS[] 형태로 사용하여야 합니다.

왼쪽에 PHP4.1.1 아래 관련 게시물 주욱 보시면 됩니당

글구 회원 비번은 md5() 로 암호화 하시구요. 쿠키는 사용하지 마세요.
회원이 비번을 잊어 버렸을 경우는 회원 email 주소로 새로운 비번을 쏴주시구요.

세션의 경우 회원id 세션과 회원 비번 md5 암호화 한 세션 , 2개 로 비교 하세요.
회원 레벨..준회원..정회원..관리자 등이 있을 경우는 3개 로 비교 하시구요.
1개 로만 절대로 비교 하시지 말구요 !

회원 정보 수정 시 form 에서 맨아래 무조건 회원 비번을 1번더 묻게 하시구요. ^^

register_globals=off  하셨나요?
$_SESSION 은 PHP4.1.0 이상 입니다.

세션의 경우는 /tmp 폴더에 저장 하시지 마세요. php.ini 에서 세션저장 장소를 바꾸세요.
session지시자 아래 있슴다.
/tmp 는 너무 알려 져서 좋지 않습니다. !

register_globals=off 를 하지 않더라도..여러가지로 보안을 취할 수 있습니다.
$REQUEST_METHOD 를 체크 하는 방법 하구요.
$HTTP_REFERER 를 체크 하는 방법 하구요.
PHP강좌 게시판에서 http 나 request 로 검색 하시구요. 왼쪽에 PHP 보안 메뉴 아래 쪽에 보세용 ^^

세션 생성시 $userid 를 생성 하고, $userpass=md5($userpass); 로 생성 해서,
2개 값이 있는지 비교 하구요.. isset() 등으로 비교 하시는 것이 좋구요.

$userpass 값은 32 자 인지 확인 하시면 됩니다. md5() 로 해슁 하면 32자가 됩니당.

if((session_is_registered(username)) && (session_is_registered(user_id)))
session_is_registered() 를 사용하시구요..

$pw 도 암호화 하세용..!!!
비교는

if($pw==md5($pw넘어온값) && isset($pw넘어온값))
이런식으로 체크 하시구용...^^

좀더 고심해 보시고 응용해보세요 ^^


$tpass=md5("pw008");
if(($id == "id007") && (md5($pw) == $tpass) && isset($pw) && isset($id)){

이런 식으로 ^^







★ zend encode 를 사용하지 않고 PHP 소스 안보이게 하는 방법 ?



PHP는 인터프리터 언어 입니다. 컴파일하지 않기 때문에 소스가보일 수 가 있습니다.
물론 어렵겟죠...일반적으로 보안이 되어 있기 때문에 보이지는 않습니다.

그렇다면 ,PHP 소스를 안보이게 하거나 보안을 하게 하는 방법은 ?
컴파일 하지 않고 , PHP 소스 보안을 유지 하는 방법은 ?

들여 쓰기 를 사용하지 않고, 변수명도 어렵게 하는 것 입니다.
남들이 소스를 보기에 짜증나게 하는 것이죠....ㅋㅋㅋ

머..이딴 소스를 만들었나 ? 싶을 정도로 짜증나게 만들면 보지 않을 검당...ㅋㅋㅋ

PHPBuilder.com 읽다가 약간 번역 한 것임당...ㅌㅌㅌ

http://www.phpbuilder.com/forum/read.php3?num=2&id=139250&thread=139219


또는 http://pobs.mywalhalla.net
를 사용하세요. 소스를 아래 처럼 만들어 버립니다. 우왕...어지러버요....해킹 불가 !!!  ㅋㅋㅋ
읽어 보니...인간이 읽기에 힘든 편집으로 만든다 라고 적었네요...

<?php

include("pobs-ini.inc");
echo
"<HTML><HEAD><TITLE>POBS - A PHP Obfuscator</TITLE><STYLE TYPE='text/css'>";echo "td {
font-
family:
Verdana, sans serif;font-size:"
.$V24b02965."pt;  vertical-align:
top; }"
;echo "</STYLE></HEAD><BODY>";
define("C00529ab2", "<TD VALIGN=TOP>");define("C4d89b09c", "<TD BGCOLOR=#6699CC
VALIGN=TOP>"
);define
("C5481f31d", "<TD BGCOLOR=#E6E6E6 VALIGN=TOP>");define("C9c3b8e37", "<TR>");define
("Cd742068d", "</TR>");define("Cdabce349", "</TD>");define("C6faee0d5", "</TABLE>");
if (
$PA) F85580fcb();
$V9429cf94=time();
$Vf797b56c=0;$V048f0047=0;
$Vbc961c59=array();$Vb787292f=array();$V4cb73b6b=array();$Vae809e1a=array();
$V4a949e17=array();$Va7254761=array();$Vd74f666d=array();
if (
$PA) F23da1c4c();else Fb72cca71();

?>




★ 파일 업로드 보안 문제 - 7 가지 모두 체크 !!!



1.php,inc,html,htm,phtml,php3 등의 확장자는 절대로 올릴 수 없게 한다 !
.txt 도 못올리게 합니다. .txt 를 사용해서 쿠키를 훔칠수도 있슴다.


2.업로드 디렉토리는 무조건 htdocs 아래 말고 다른 디렉토리 에 올린다 !!
/updir 이나 c:\updir 등 htdocs 와 관련이 없는 디렉토리에 올리게 한다. !!

3.CP명령을 사용시에 exec(cp $file , 처럼 exec() 를 절대로 사용하지 말아야 한다.
기냥 cp()만을 사용하라 !!!
www.php.net/cp

4.REQUEST_METHOD!="POST" 로 체크 해서 올리기
POST 가 아닐 경우 올리지 못하게 !!!
form 에서 method=get 으로 절대 절대 하지 마세요 !!!
php.ini 에서 register_globals=off 라면
$HTTP_SERVER_VARS['REQUEST_METHOD'] 로 출력 해야 합니당..ㅋㅋㅋ


<?php

if ($submit) {
    if (
$REQUEST_METHOD == 'POST') {
        
// 정상 실행
    
}
    else {
         echo
'get 값은 받지 않아요 !!';
    }
else {
    echo
'훔....잘못된 입력 !!!';
}

?>

5.파일명이 pass 나 shadow 나 리눅스 시스템 파일일 경우는 올리지 못하게 하기 위해
파일명 중에 pass 나 shadow 등이 있을 경우 올리지 못하게 !!!
그러니까 koreapass.zip 파일 같은 것도 올라가지 않겟죠 ^^
그래도 보안을 위해서라면 ^^ /etc/passwd 파일(리눅스 파일)의 업로딩을 방지 합니다.

그러니까 upload.php 파일을 이용하여 주소표시줄에서
upload.php?file_name=/etc/passwd&file_type=text&file_size=30
등으로 해서 해킹할 시스템의 passwd 파일을 자료실에 올리고 다운 받을 수 있다고 합니다.
그래서 취한 조치 입니다.

6.또는 file_exists($file_name) 를 사용하여 체크 합니다. 로컬시스템에 파일이 있으면 절대 못올리게
합니다 ^^ /etc/passwd 파일의 업로딩을 방지 합니다.




7. PHP 4.1.2 최신 버전 말고는 모두 파일 업로드 버그가 존재 한다고 합니다.

PHP4.1.2 버젼 설치 하세용 !!!





★ HTML 태그를 막기  




htmlspecialchars() 를 사용하시지 말고, str_replace 로 직접 변환하세요 !!!

<?php

function cleanup($copy)
{
    
$copy=trim($copy);
    
$copy=htmlspecialchars($copy, ENT_QUOTES);
    
$copy=eregi_replace ("%", "&#37;", $copy);
    
$copy=eregi_replace ("<", "&lt;", $copy);
    
$copy=eregi_replace (">", "&gt;", $copy);
    
$copy=eregi_replace ("&amp;", "&", $copy);
    
$copy=nl2br($copy);
    
$copy=StripSlashes($copy);
    return(
$copy);
}
?>

<scripts> 도 당근 막아야 하구요
<table> 도 당근 막아야 합니다.






★ HTML태그와 자바스크립트 사용 못하게 한다면?



HTML과 자바스크립은 뚫립니다. 쿠키 까지 알아 낼 수 도 있습니다.
콤포넌트를 사용한 방식이 라도 안됩니다.
hotmail.com 에서 장난 쳐서 보낼 수 도 있습니다.

무조건 태그는 막는것이 좋습니다.
그러나 대부분의 사용자는 모르고 있죠. 글서 보통 허용하는 것이 일반적 입니다.
그러나 허용을 하더라도 <script> 등의 소스나 <a> 태그 외에 <a onmouse~> 등의 태그는 안됩니다.
무자게 생각할 것이 많고 적용할 소스가 많습니다.

아싸리 막아 버리세요.

일단 막고 등으로 사용하게 하는 것이 좋습니당. !!!






★ 반드시 회원의 비밀번호는 md5() 나 mhash 유틸리티의 암호화 알고리즘을 사용하여 저장 하세요 ^^



그리고 회원 정보 수정이나 중요사항 변경시, 쇼핑몰 결재시에는 반드시
회원의 비밀번호를 한번더 물어 보고, 디비와 비교해서 통과 시키 세요 !!

◆◇ 회원 정보 수정시 , 수정할 것들 맨아래 에 비밀번호 입력란을 만들면 됩니다 ^^

회원 비밀번호 찾기의 경우 , md5() 를 사용하면 바로 웹에서 찾을 수 없습니다.
회원이 비밀번호를 분식했을 경우, 사용자 메일로 새로운 비번을 만들어서 보내는 알고리즘을
사용하세요 !!

주민등록 번호의 경우 수정시 라도 보여 주지 않는 것이 좋습니다.
input text 박스만 보여 주고 옆에  731111-******* 이런식으로 명시 하시는 것이 좋습니다.










★ *.inc 파일로 저장 하지 마십시오.



바로 브라우져에서 보일 수 있으며 간단한작동 만으로 데이터베이스 패스를
볼 수 있습니다.

파일명을 저장 하시려거든 , *.inc.php 로 하세요.

물론 Apache 에서 Addtype 에서 .inc 를 추가 하면 됩니당..^^






★phpinfo() 를 숨겨라...      


  
phpinfo() 의 경우 시스템의 구성 상황을 비교적 쉽게 해커에게 알린다고 합니다.
물론 phpinfo() 때문에 해킹 당하지는 않겟지만.. 해킹에 도움이 된다는 것이죵... ^^

되도록 이면

test.php 에서

<?php
     phpinfo
();
?>

를 사용하시고 바로 지워 주세요...
검색엔진에서 검색하면 많은 phpinfo() 를 볼 수 있거든요...


http://www.google.com/search?q=phpinfo

다 설치 하고 test 를 했다면 지우세용 ^^




★PHP오류를 적에게 알리지 말라!      


  
PHP오류가 날 경우 역쉬 경로가 적(크래커) 에게 발견이 됩니다.
오류를 아싸리 안보여 지게 설정 하는 것도 좋은 방법 입니다.

php.ini 에서 설정 이 있는뎅...php.ini 찾아 봐야 함당..
지금 날밤 새서리...담에 찾죠
찾아 보셍 ^^

  



★ 쿠키 보다는 세션을 사용하세요 !!!



★★ 세션 보다는 Auth 인증을 사용하세요 !!!

쿠키는 해킹이 무자게 쉽다고 합니다.
세션을 되도록이면 사용하세요 !!!
세션을 사용하시되, session_set_save_handler() 를 사용하여 세션을 md5() 로 암호화 하고
저장 하세요 ^^

세션을 사용할때 /tmp 폴더에 저장 하지 말라고 합니다 !!!
반드쉬 mysql 에 저장 하세요 !!!


Auth 인증  << 세션 <<<<<< 쿠키
Auth 인증 이 가장 강력한 보안 체계 입니다. !!!
http://www.zend.com/zend/tut/authentication.php
http://download.php.net/manual/en/features.http-auth.php

auth 강좌는 PHP강좌 게시판에서 auth 로 검색하세용 !!






★ 세션 쿠키값 - 보안 로그인 시스템 ◆◆



$userid
형태로 사용하시지 말고

세션일 경우 _SESSION 이나 (PHP4.1.0) , HTTP_SESSION_VARS[] 를 사용하세요.
쿠키도 마찬가지 , PHP4.1.0 에서 약간 바뀌었으니 PHP강좌 게시판 검색하세용.!! php 로 !!


if((session_is_registered(username)) && (session_is_registered(user_id)))

if (!isset($memberid) && !isset($PHPSESSID)){
    
session_is_registered() 나 isset() 는 반드쉬 사용해야 합니다.
<?php
function check_session() {
    
session_start();

    if (
session_is_registered(user_id)) {
        return
TRUE;
    } else {
        
header("Location: login.php");
        exit;
    }
}
?>

그리고 if 문에서 비교는 반드쉬 1개 이상으로 비교 하세용 !!!

session_start();

if(!isset($sid) || empty($sid)) // $sid 는 세션 값..

<?php
// 반드시 register global=off 로 설정 하시고 아래 처럼 하세요. !!
// PHP4.1.0 이상 부터는 $_SESSION[type] 입니다.
// ◆◇◆◇◆◇ 세션변수를 $session_name 등으로 절대루 사용하지 마세용 !!!◆◇◆◇◆◇
session_start();

if(!isset(
$HTTP_SESSION_VARS[type]))
{
  
header("Location: log-in.php");
}
?>









★쇼핑몰이나 e-커머스 사이트는 반드시 SSL 를 사용하라.



apache 리눅스나 유닉스 경우는 openSSL 를 사용할 수 있습니다.
윈도우는 잘 모르겠습니다.
openSSL 를 반드시 사용하세요 ^^
http://www.openssl.org

웹에서 https// 로 시작 하는 것들이 SSL 입니다.
인증 사이트 가시면 보실 수 있을 것 입니다.  msn 만 해도..메일 확인 하려 하면..
보안을 해제 하려고 합니다..그러면서 https 로 가죠..^^






★ PHP에서 mysql 연결시 계정을 만들어 사용하라 !!!



config.inc.php

<?php
  $db_user
= "root";
  
$db_pass = "xxxx";  // root 비밀번호
?>


PHP파일에서 config 파일에서 종종 root 로 mysql 에 연결 하는 경우가 있다.
되도록이면 root 는 사용하지 말아야 한다.

root 로 사용할 경우 , PHP 소스가 보일 경우 데이터베이스는 모두 지워진 것이나 다름이 없기 때문이당..
root 가 아닌 특정 사용자 계정을 만들고 권한을 부여 해라 !!

root 의 비번은 어느곳이든 지 간에 쓰지 않는 것이 최상이다 !!!
소스 자료실에 mysql 계정 설정 권한 설정 하기 파일이 존재 한다. doc 파일임..
그것을 보고 반드쉬 임의 계정을 만들어서 사용하라 !!  디비가 지워지고 싶지 않으면 !!!


현명한 config.inc.php

<?php
  $db_user
= "tood";
  
$db_pass = "xxxx";  // tood 비밀번호 - 임의 사용자 비번
?>

또는

<?php
  $db_user
= "toodtood";
  
$db_pass = decode_passwd("sddsdsds21912012dslsdl");  // tood 비밀번호 - 임의 사용자 비번
?>

decode_passwd() 란 함수를 만들어 PHP모듈에 탑재하는 것임당..
그러면 좀더 낫지 않을 까요 ? ㅋㅋㅋ
PHP 모듈에 탑재하는 방법은 www.php.net 을 보세용..저두 해보지 않아서 ^^









★반드쉬 알아야 할 PHP보안 함수 - 쓰기전에 반드쉬 보안을 생각해야 할 함수 12 가지 !



www.php.net/md5
www.php.net/crypt
www.php.net/base64_encode
www.php.net/base64_decode
www.php.net/session_is_registered
www.php.net/isset

system()
exec()
"backticks"
passhru()
opendir()
escapeshellcmd()

반드쉬 숙지 하세용 !!






★ safe mode 를 사용하라



php.ini 에 보면 safe mode 설정이 있습니다.

safe_mode 를 On 하고 ,소유자가 nobody 인지 다른 사용자가 되는지 테스트 해보세요 ^^
계정이 여러개 일때 좋습니다.

php.ini 중에서 일부
;
; Safe Mode
;
safe_mode = Off

safe_mode_exec_dir =







PHP소스 안보이게



(1) avoid using .inc files; use .php files like for normal script
.inc 보다는 .inc.php 로 저장 하기 !
httpd.conf
<Files ~ "\.inc$">
    Order allow,deny
    Deny from all
</Files>


(2) turn Indexes directive to off by default per website
httpd.conf 에서 Indexes 지우기 -> index.html 파일이 없을 경우 디렉토리 아래 죄다 보임 !

(3) make directories 711 instead of 755
(4) develop an organized php scripts structure outside DocumentRoot and
place the files that you will eventually include in an "include"
sudirectory within that structure
(5) review changes all the time, check your weblogs and be vigillent :-)






PHP 에러 출력 안하기  [combel 님 제공]



간단합니다.
그렇지만 보안을 위해서는 필수겠죠.
php.ini의 Error_Handling 부분에서 display_errors = Off 로 설정해 주시면 됩니다.
에러가 나더라도 빈 화면만 뿌려주죠 ^^;
php 4.1.x 버전에서는 보안을 위해서 off 시키는 것을 추천하고 있습니다.

투덜이 comment -> 오류가 보여지면, apache 디렉토리 위치 나 htdocs 디렉토리 위치가 보이게 됩니다.




HTML 일부만 허용 하기와 보안



Example 1. strip_tags() example
$string = strip_tags($string, '<a><b><i><img>');

$string 에서 <a><b><i><img> 태그만 허용 하고 나머지는 막는 것입니다.
htmlspecialchars() 보다 유용하네요.

그런데 문제가 존재 합니다.<b> 태그를 허용 할 경우...
<b onmouseover="for(i=0;i<50;i++)window.open('www.porn.com');">tood.net 미오!</b>

이런 문장을 쓸 경우 문제가 됩니다..ㅋㅋㅋ
만약  i 를 5000000 까지 한다면... 헐....

<b onmouseover="for(i=0;i<500000000;i++)window.open('www.porn.com');">tood.net 미오!</b>
글구 <a> 태그를 허용해도 <a href="" target=""> target 는 허용이 되지 않습니다..ㅋㅋㅋ 짭..




location.replace 인증 부분 - 초짜 님 제공(jcorn***@hanmail.net)



음 넘 초보적인 방법이지만 그래두 함 적어보겠습니다.
만약 게시판에 관리자 모드가 있다면...그 곳많은 보안이 상당히 많이 필요하겠지염.

보안을 위해서 이런 저런 방법을 많이 사용하실테구염.
사용하시는 방법에 아주 간단한 자바스크립트를 추가 하신다면 좋을 듯 합니다.

function goto_page($url) {
    echo "<script> location.replace(".$url."); </script>";
}

보안이 조금이나마 필요한 부분에선 이 함수를 사용해서 이동했던 페이지들을 히스토리에서 삭제를 하는 것이지
요...

가끔 어떤 곳에서 로그아웃을 했더라구 뒤로가기 버튼을 클릭하면 이전 페이지가 나오는 것을 많이 목격하고 위
에 함수를 많이 사용하게 되었습니다.

위 처럼 하시면 로그 아웃 후에 뒤로가기 버튼을 눌러두 이전 페이지가 아닌 잴 처음 화면으로 가게 되지염.
모두 아시는 것을 올려서 죄송하구염...ㅡㅡ; 그래두 모르는 분들이 계실것 같아서...좋은 뜻으로 올렸씁니
다..^^
그럼 모든 분들 좋은 하루 되시길....빌며 이만....






스팸 봇이 여러분의 email주소를



스팸 봇이란 넘이 있어서 여러분들의 email 주소를 긁어 갑니다.
그러니까 게시판에서 <a href=mailto: ~ > mailto 부분의 email 주소를 긁어 갑니다.

거기에 사용되는 email 주소는 base64 나 md5() 로 암호화 하세요 ^^

◈보안◈ 스팸메일 추출기 or 게시판 자동 로봇      
http://www.tood.net/tood/toodboard/toodread.php?board=tootech&tcode=1005





PHP 확장자 숨기기



PHP 확장자는 마음대로 변경 하여 사용하 실 수 있습니다.

아래는 윈도우에서 httpd.conf 파일 입니다. 물론 리눅스도 AddType 부분은 동일 합니다.
LoadModule php4_module c:/php/sapi/php4apache.dll
AddType application/x-httpd-php .tood .tgp .cal .html .htm .include

위에 처럼 설정 하면
.tood .tgp .cal .html .htm .include 파일에서 PHP 를 사용할 수 있습니다.
확장자만 가지고는 이 사이트가 PHP 기반인지 알 수 없습니다.
물론 알 수 있는 방법은 많죠..그러나 단지 접속 해 보고는 알 수 없습니다.

index.tgp 파일...이상하게 생각 할것 입니다..이게 먼 확장자 이지?  ^^










세션 보안 최적화  !trans_id  



PHP counfigure 시에 세션 보안 방법 입니다. trans_id 옵션 보시면 됩니다.
재설치 하셔야 합니다.

http://www.tood.net/tood/toodboard/toodread.php?board=tootech&tcode=1070






댓글목록

등록된 댓글이 없습니다.