PHP 개발 안전 문제 에 대한 총괄

인터넷 응용의 개발 에 있어 개발 자로 서 항상 안전 관념 을 명심 하고 개발 한 코드 에 나타 나 야 한다.PHP 스 크 립 트 언어 는 보안 문제 에 그다지 관심 이 없습니다.특히 경험 이 없 는 대부분의 개발 자 들 에 게 는.돈 과 관련 된 모든 거래 문 제 를 할 때마다 안전 문 제 를 고려 해 야 한다.
안전 보호 일반적인 요점
1.양식 을 믿 지 않 음
일반적인 자 바스 크 립 트 프론트 검증 에 대해 서 는 브 라 우 저의 자 바스 크 립 트 엔진 을 닫 는 등 사용자 의 행동 을 알 수 없 기 때문에 POST 악성 데 이 터 를 통 해 서버 로 갑 니 다.각 php 스 크 립 트 에 전 달 된 데 이 터 를 서버 에서 검증 하여 XSS 공격 과 SQL 주입 을 방지 해 야 합 니 다.
2.사용 자 를 믿 지 않 음
사이트 에서 받 은 모든 데이터 가 악성 코드 가 존재 하고 숨겨 진 위협 이 존재 한다 고 가정 하려 면 모든 데 이 터 를 정리 해 야 합 니 다.
3.전역 변수 닫 기
php.ini 파일 에서 다음 설정 을 진행 합 니 다:register_globals = Off이 설정 옵션 이 열 리 면 보안 위험 이 큽 니 다.예 를 들 어 process.php 의 스 크 립 트 파일 이 있 으 면 받 은 데 이 터 를 데이터베이스 에 삽입 합 니 다.사용자 가 입력 한 데 이 터 를 받 는 폼 은 다음 과 같 을 수 있 습 니 다.

<input name="username" type="text" size="15" maxlength="64">
이렇게 하면,데 이 터 를 process.php 에 제출 한 후,php 는$username 변 수 를 등록 하고,이 변 수 를 process.php 에 제출 하 며,POST 나 GET 요청 인자 에 대해 서도 이러한 변 수 를 설정 합 니 다.초기 화 를 표시 하지 않 으 면 다음 문제 가 발생 합 니 다.

<?php
// Define $authorized = true only if user is authenticated
if (authenticated_user()) {
  $authorized = true;
}
?>
여기 서 가설authenticated_user함수 가$authorized 변 수 를 판단 하 는 값 이 라 고 가정 합 니 다.register 가 열 리 면globals 설정 을 사용 하면 모든 사용자 가 요청 을 보 낼 수 있 습 니 다.$authorized 변수의 값 을 임의의 값 으로 설정 하면 이 인증 을 돌아 갈 수 있 습 니 다.
이 모든 제출 데 이 터 는$를 포함 하여 PHP 를 통 해 내 장 된 전역 배열 을 미리 정의 해 야 합 니 다.POST、$_GET、$_FILES、$_SERVER、$_REQUEST 등,그 중$REQUEST 는$GET/$_POST/$_COOKIE 세 배열 의 결합 변수,기본 순 서 는$COOKIE、$_POST、$_GET。
추천 하 는 보안 설정 옵션
error_reporting 설정 Off:사용자 에 게 오류 정 보 를 노출 하지 말고 개발 시 ON 으로 설정 할 수 있 습 니 다.
safe_mode 를 Off 로 설정
register_globals 를 Off 로 설정
다음 함수 비활성화:system,exec,passthru,셸exec、proc_open、popen
open_basedir 를/tmp 로 설정 하면 session 정 보 를 저장 할 수 있 는 권한 을 가지 고 단독 사이트 루트 디 렉 터 리 를 설정 할 수 있 습 니 다.
expose_php 를 Off 로 설정
allow_url_fopen 을 Off 로 설정
allow_url_include 를 Off 로 설정
SQL 주입 공격
데이터 베 이 스 를 조작 하 는 SQL 문 구 는 안전성 에 특히 주의해 야 합 니 다.사용자 가 특정한 문 구 를 입력 하여 기 존의 SQL 문 구 를 기능 을 바 꿀 수 있 기 때 문 입 니 다.다음 과 같은 예:

$sql = "select * from pinfo where product = '$product'";
사용자 가 입력 한$produt 인 자 는 다음 과 같 습 니 다.

39'; DROP pinfo; SELECT 'FOO 
그러면 결국 SQL 문 구 는 다음 과 같은 모양 으로 변 합 니 다.

select product from pinfo where product = '39'; DROP pinfo; SELECT 'FOO' 
이렇게 하면 세 개의 SQL 문장 이 되 어 pinfo 표 가 삭제 되 고 심각 한 결 과 를 초래 할 수 있 습 니 다.
이 문 제 는 PHP 의 내장 함수 로 간단하게 해결 할 수 있 습 니 다.

$sql = "Select * from pinfo where product = '" . mysql_real_escape_string($product) . "'";
SQL 주입 공격 을 방지 하려 면 두 가지 일 을 잘 해 야 합 니 다.
입력 한 매개 변 수 를 항상 형식 검증 합 니 다.
작은 따옴표,작은 따옴표,작은 따옴표 등 특수 문자 에 대해 항상mysql_real_escape_string함 수 를 사용 하여 전 의 를 한다.
하지만 개발 경험 에 따라 phop 의 Magic Quotes 를 열지 마 세 요.이 특성 은 phop 6 에서 폐지 되 었 고 항상 자신 이 필요 할 때 전 의 를 합 니 다.
기본 XSS 공격 방지
XSS 공격 은 다른 공격 과 달리 클 라 이언 트 에서 이 공격 을 수행 합 니 다.가장 기본 적 인 XSS 도 구 는 javascript 스 크 립 트 가 사용자 가 제출 해 야 할 폼 페이지 에서 사용자 가 제출 한 데이터 와 쿠키 를 훔 쳐 오 는 것 을 방지 하 는 것 입 니 다.
XSS 도 구 는 SQL 주입 보다 더 보호 하기 어렵 고 각 회사 의 사이트 가 XSS 에 공격 당 한 적 이 있 습 니 다.이러한 공격 은 phop 언어 와 무관 하지만 phop 을 사용 하여 사용자 데 이 터 를 선별 하여 사용자 데 이 터 를 보호 하 는 목적 을 달성 할 수 있 습 니 다.여 기 는 주로 사용자 의 데 이 터 를 여과 하고 HTML 라벨,특히 a 라벨 을 걸 러 내 는 것 을 사용 합 니 다.다음은 일반적인 필터 방법 입 니 다.

function transform_HTML($string, $length = null) {
// Helps prevent XSS attacks
  // Remove dead space.
  $string = trim($string);
  // Prevent potential Unicode codec problems.
  $string = utf8_decode($string);
  // HTMLize HTML-specific characters.
  $string = htmlentities($string, ENT_NOQUOTES);
  $string = str_replace("#", "#", $string);
  $string = str_replace("%", "%", $string);
  $length = intval($length);
  if ($length > 0) {
    $string = substr($string, 0, $length);
  }
  return $string;
} 
이 함 수 는 HTML 의 특수 문 자 를 HTML 실체 로 변환 합 니 다.브 라 우 저 는 이 텍스트 를 렌 더 링 할 때 일반 텍스트 로 표 시 됩 니 다.예 를 들 어bold은 다음 과 같이 표 시 됩 니 다.

<STRONG>BoldText</STRONG> 
상기 함수 의 핵심 은 html entities 함수 입 니 다.이 함 수 는 html 특수 라벨 을 html 실체 문자 로 변환 하여 대부분의 XSS 공격 을 걸 러 낼 수 있 습 니 다.
그러나 경험 이 있 는 XSS 공격 자 에 대해 더욱 교묘 한 방법 으로 공격 할 수 있 습 니 다.그들의 악성 코드 를 일반적인 ASCII 텍스트 가 아 닌 16 진법 이나 utf-8 인 코딩 을 사용 합 니 다.예 를 들 어 다음 과 같은 방식 으로 진행 할 수 있 습 니 다.

<a href="http://www.codetc.com/a.php?variable=%22%3e %3c%53%43%52%49%50%54%3e%44%6f%73%6f%6d%65%74%68%69%6e%67%6d%61%6c%69%63%69%6f%75%73%3c%2f%53%43%52%49%50%54%3e" rel="external nofollow" >
이러한 브 라 우 저 렌 더 링 결 과 는 사실:

<a href="http://www.codetc.com/a.php?variable=" rel="external nofollow" ><SCRIPT>Dosomethingmalicious</SCRIPT>
이렇게 해서 공격 의 목적 을 달성 했다.이런 상황 을 막 기 위해 서 는 transformHTML 함 수 를 바탕 으로\#와%를 그들 이 대응 하 는 실체 기호 로 바 꾸 는 동시에$length 매개 변 수 를 추가 하여 제출 한 데이터 의 최대 길 이 를 제한 합 니 다.
SafeHTML 을 사용 하여 XSS 공격 방지
상기 XSS 공격 에 대한 방 호 는 매우 간단 하지만 사용자 의 모든 표 시 를 포함 하지 않 으 며,필터 함 수 를 돌아 서 자 바스 크 립 트 코드 를 제출 하 는 수백 가지 방법 도 있 으 며,이 를 완전히 막 을 방법 도 없다.
현재 공격 에 의 해 돌파 되 지 않 는 다 는 단일 한 스 크 립 트 는 없 지만 상대 적 으로 보호 정도 가 더 좋 은 것 이 있다.모두 두 가지 안전 보호 방식 이 있다.화이트 리스트 와 블랙리스트.그 중에서 도 화이트 리스트 는 더욱 간단 하고 유효 하 다.
화이트 리스트 솔 루 션 은 SafeHTML 로 효과 적 인 HTML 을 지능 적 으로 식별 할 수 있 고 위험한 라벨 을 제거 할 수 있다.이것 은 HTML Sax 패 키 지 를 기반 으로 분석 해 야 합 니 다.
SafeHTML 을 사용 하 는 방법 설치 하기:
  • 1.이동http://pixel-apes.com/safehtml/?page=safehtml최신 SafeHTML
  • 다운로드
  • 2.서버 의 classes 디 렉 터 리 에 파일 을 넣 습 니 다.이 디 렉 터 리 는 모든 SafeHTML 과 HTMLSax 라 이브 러 리
  • 를 포함 합 니 다.
  • 3.자신의 스 크 립 트 에 SafeHTML 류 파일 포함
  • 4.SafeHTML 대상 구축
  • 5.parse 방법 으로 여과
  • 
    <?php
    /* If you're storing the HTMLSax3.php in the /classes directory, along
      with the safehtml.php script, define XML_HTMLSAX3 as a null string. */
    define(XML_HTMLSAX3, '');
    // Include the class file.
    require_once('classes/safehtml.php');
    // Define some sample bad code.
    $data = "This data would raise an alert <script>alert('XSS Attack')</script>";
    // Create a safehtml object.
    $safehtml = new safehtml();
    // Parse and sanitize the data.
    $safe_data = $safehtml->parse($data);
    // Display result.
    echo 'The sanitized data is ' . $safe_data;
    ?>
    SafeHTML 은 XSS 공격 을 완전히 방지 할 수 없 으 며,상대 적 으로 복잡 한 스 크 립 트 로 검증 하 는 방식 일 뿐이다.
    단 방향 HASH 암호 화 방식 으로 데 이 터 를 보호 합 니 다.
    단 방향 hash 암호 화 는 모든 사용자 에 대한 암호 가 유일한 것 이 고 해독 되 지 않 습 니 다.최종 사용자 만 비밀 번 호 를 알 고 시스템 도 원본 비밀 번 호 를 모 릅 니 다.이런 장점 중 하 나 는 시스템 이 공 격 된 후에 공격 자 도 원시 암호 데 이 터 를 알 수 없다 는 것 이다.
    암호 화 와 Hash 는 서로 다른 두 과정 이다.암호 화 와 달리 Hash 는 복호화 할 수 없고 단 방향 입 니 다.동시에 두 개의 서로 다른 문자열 은 같은 hash 값 을 얻 을 수 있 으 며,hash 값 의 유일 성 을 보장 할 수 없습니다.
    MD5 함수 가 처리 한 hash 값 은 기본적으로 풀 리 지 않 지만 항상 가능성 이 있 고 인터넷 에 도 MD5 의 hash 사전 이 있 습 니 다.
    mcrypt 암호 화 데이터 사용
    MD5 hash 함 수 는 읽 을 수 있 는 폼 에 데 이 터 를 표시 할 수 있 지만 사용자 의 신용카드 정 보 를 저장 할 때 암호 화 처리 후 저장 하고 나중에 복호화 해 야 합 니 다.
    가장 좋 은 방법 은 mcrypt 모듈 을 사용 하 는 것 입 니 다.이 모듈 은 암호 화 된 사람 만 이 데 이 터 를 복호화 할 수 있 도록 30 개가 넘 는 암호 화 방식 을 포함 하고 있 습 니 다.
    
    <?php
    $data = "Stuff you want encrypted";
    $key = "Secret passphrase used to encrypt your data";
    $cipher = "MCRYPT_SERPENT_256";
    $mode = "MCRYPT_MODE_CBC";
    function encrypt($data, $key, $cipher, $mode) {
    // Encrypt data
    return (string)
          base64_encode
            (
            mcrypt_encrypt
              (
              $cipher,
              substr(md5($key),0,mcrypt_get_key_size($cipher, $mode)),
              $data,
              $mode,
              substr(md5($key),0,mcrypt_get_block_size($cipher, $mode))
              )
            );
    }
    function decrypt($data, $key, $cipher, $mode) {
    // Decrypt data
      return (string)
          mcrypt_decrypt
            (
            $cipher,
            substr(md5($key),0,mcrypt_get_key_size($cipher, $mode)),
            base64_decode($data),
            $mode,
            substr(md5($key),0,mcrypt_get_block_size($cipher, $mode))
            );
    }
    ?>
    mcrypt 함 수 는 다음 과 같은 정보 가 필요 합 니 다:
  • 1.암호 화 대기 데이터
  • 2.데 이 터 를 암호 화하 고 복호화 하 는 key
  • 3.사용자 가 선택 한 암호 화 데이터 의 특정 알고리즘(ciper:예 를 들 어 MCRYPTTWOFISH192,MCRYPT_SERPENT_256, MCRYPT_RC2, MCRYPT_DES, and MCRYPT_LOKI97)
  • 4.암호 화 모드
  • 5.암호 화 된 피 드 는 암호 화 과정 을 시작 하 는 데 사용 되 는 데이터 로 암호 화 알고리즘 을 초기 화 하 는 추가 바 이 너 리 데이터 입 니 다
  • 6.암호 키 와 피 드 의 길이,mcrypt 사용get_key_size 함수 와 mcryptget_block_size 함수 획득 가능
  • 데이터 와 key 가 모두 도 둑 맞 으 면 공격 자 는 ciphers 를 옮 겨 다 니 며 줄 을 여 는 방식 을 찾 을 수 있 기 때문에 암호 화 된 key 를 MD5 로 한 번 진행 한 후에 안전성 을 확보 해 야 합 니 다.또한 mcrypt 함수 가 되 돌려 주 는 암호 화 데 이 터 는 바 이 너 리 데이터 이기 때문에 데이터베이스 필드 에 저장 하면 다른 오류 가 발생 할 수 있 습 니 다.base64encode 를 사용 하여 이 데 이 터 를 16 진수 로 변환 하여 저장 하기 편리 합 니 다.
    총결산
    이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.더 많은 내용 을 알 고 싶다 면 아래 링크 를 보 세 요.

    좋은 웹페이지 즐겨찾기