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 을 사용 하 는 방법 설치 하기:
<?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 함 수 는 다음 과 같은 정보 가 필요 합 니 다:총결산
이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.더 많은 내용 을 알 고 싶다 면 아래 링크 를 보 세 요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Laravel - 변환된 유효성 검사 규칙으로 API 요청 제공동적 콘텐츠를 위해 API를 통해 Laravel CMS에 연결하는 모바일 앱(또는 웹사이트) 구축을 고려하십시오. 이제 앱은 CMS에서 번역된 콘텐츠를 받을 것으로 예상되는 다국어 앱이 될 수 있습니다. 일반적으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.