이 기사에서는 주로 PHP 웹 사이트 개발을 해결하기 위한 몇 가지 일반적인 공격 방법을 공유합니다. PHP 웹 사이트 구축에서 흔히 발생하는 보안 위협에는 SQL 주입, GET 및 POST 변수 조작, 버퍼 오버플로 공격, 크로스 사이트 스크립팅 공격 및 브라우저 내 공격이 포함됩니다. 데이터 조작 및 원격 양식 제출.
SQL 주입 공격에서는 사용자가 양식을 조작하거나 GET 쿼리 문자열을 조작하여 데이터베이스 쿼리에 정보를 추가합니다.
예를 들어 간단한 로그인 데이터베이스를 상상해 보세요. 이 데이터베이스의 각 레코드에는 사용자 이름 필드와 비밀번호 필드가 있습니다. 사용자가 로그인할 수 있도록 로그인 양식을 작성하십시오.
이 문제에 대한 해결책은 PHP에 내장된 mysql_real_escape_string() 함수를 사용자 입력 주위의 래퍼로 사용하는 것입니다.
이 함수는 문자열의 문자를 이스케이프하여 문자열에서 아포스트로피와 같은 특수 문자를 전달하는 것을 불가능하게 만들고 MySQL이 특수 문자를 기반으로 작동하도록 합니다. Listing 7은 이스케이프된 코드를 보여준다.
사용자가 유효한 비밀번호를 가지고 있다고 해서 규칙에 따라 행동한다는 의미는 아닙니다. 피해를 입힐 수 있는 기회가 많습니다. 예를 들어, 애플리케이션을 통해 사용자는 특별한 콘텐츠를 볼 수 있습니다.
예: template.php?pid=33 또는 template.php?pid=321. 물음표 뒤의 URL 부분을 쿼리 문자열이라고 합니다. 쿼리 문자열은 URL에 직접 배치되므로 GET 쿼리 문자열이라고도 합니다.
여기에 문제가 있나요?
우선, 브라우저의 GET 변수 pid는 암묵적으로 안전하다고 신뢰됩니다.
무슨 일이 일어날까요?
대부분의 사용자는 의미론적 공격을 구성할 만큼 똑똑하지 않습니다. 그러나 브라우저의 URL 위치 필드에 pid=33이 표시되면 문제가 발생할 수 있습니다.
다른 숫자를 입력하면 괜찮을 수 있지만, SQL 명령이나 파일 이름(예: /etc/passwd)을 입력하는 등 다른 것을 입력하거나 다른 숫자를 입력하는 등의 장난을 친다면 최대 3,000자까지 입력하면 어떻게 되나요?
이 경우 기본 규칙을 기억하세요. 사용자 입력을 신뢰하지 마세요.
애플리케이션 개발자는 template.php에서 허용하는 개인 식별자(PID)가 숫자여야 한다는 것을 알고 있으므로 PHP의 is_numeric() 함수를 사용하여 숫자가 아닌 PID가 허용되지 않도록 할 수 있습니다.
strlen()을 사용하여 변수의 길이가 0이 아닌지 확인하기만 하면 됩니다. 그렇다면 전체 숫자 정규식을 사용하여 데이터 요소가 유효한지 확인하세요. PID에 문자, 슬래시, 마침표 또는 16진수와 유사한 내용이 포함된 경우 이 루틴은 이를 캡처하고 해당 페이지에서 사용자 활동을 차단합니다.
버퍼 오버플로 공격은 PHP 애플리케이션(또는 더 정확하게는 Apache 또는 기본 운영 체제)에서 메모리 할당 버퍼를 오버플로하려고 시도합니다.
웹 애플리케이션을 PHP와 같은 고급 언어로 작성하지만 궁극적으로는 C(Apache의 경우)를 호출한다는 점을 기억하세요. 대부분의 저수준 언어와 마찬가지로 C에는 메모리 할당에 대한 엄격한 규칙이 있습니다.
버퍼 오버플로 공격은 대량의 데이터를 버퍼로 보내 일부 데이터가 인접한 메모리 버퍼로 오버플로되도록 하여 버퍼를 파괴하거나 로직을 다시 작성하는 것입니다. 이로 인해 서비스 거부가 발생하거나 데이터가 손상되거나 원격 서버에서 악성 코드가 실행될 수 있습니다.
버퍼 오버플로 공격을 방지하는 유일한 방법은 모든 사용자 입력의 길이를 확인하는 것입니다.
버퍼 오버플로 공격은 긴 숫자나 문자에만 국한되지 않습니다. 긴 16진수 문자열(종종 xA3 또는 xFF처럼 보임)도 볼 수 있습니다.
버퍼 오버플로 공격의 목표는 특정 버퍼를 플러딩하고 악성 코드나 명령을 다음 버퍼에 배치하여 데이터를 손상시키거나 악성 코드를 실행하는 것입니다.
16진수 버퍼 오버플로를 처리하는 가장 쉬운 방법은 입력이 특정 길이를 초과하지 않도록 하는 것입니다.
데이터베이스에 더 긴 항목을 허용하는 양식 텍스트 영역을 처리하는 경우 클라이언트 측에서 데이터 길이를 쉽게 제한할 수 있는 방법이 없습니다. 데이터가 PHP에 도달한 후 정규식을 사용하여 16진수 같은 문자열을 지울 수 있습니다.
교차 사이트 스크립팅(XSS) 공격에서는 악의적인 사용자가 양식(또는 다른 사용자 입력 방법을 통해)으로 정보를 입력하는 경우가 많으며 이러한 입력은 악성 클라이언트 측 태그를 삽입합니다. 프로세스 또는 데이터베이스에 있습니다.
예를 들어, 방문자가 이름, 이메일 주소, 간단한 메시지를 남길 수 있는 간단한 방명록 프로그램이 사이트에 있다고 가정해 보겠습니다.
악의적인 사용자는 이 기회를 이용하여 다른 사용자에게 부적절한 이미지나 사용자를 다른 사이트로 리디렉션하는 JavaScript 등 짧은 메시지가 아닌 다른 내용을 삽입하거나 쿠키 정보를 도용하는 등의 행위를 할 수 있습니다.
다행히도 PHP는 HTML 태그로 둘러싸인 모든 내용을 제거할 수 있는 Strip_tags() 함수를 제공합니다. Strip_tags() 함수를 사용하면 허용된 태그 목록을 제공할 수도 있습니다.
공개 사용자 입력을 위해 Strip_tags()를 사용하는 것은 보안 관점에서 필요합니다. 양식이 보호된 영역(예: 콘텐츠 관리 시스템)에 있고 사용자가 작업(예: 웹 사이트용 HTML 콘텐츠 생성)을 올바르게 수행할 것이라고 신뢰하는 경우, Strip_tags() 사용은 불필요할 수 있으며 생산성에 영향을 줄 수 있습니다.
질문 하나 더: 게시물에 대한 댓글이나 게스트 항목과 같은 사용자 입력을 받아들이고 이 입력을 다른 사용자에게 표시해야 하는 경우 PHP의 htmlspecialchars() 함수에 응답을 넣어야 합니다.
이 함수는 앰퍼샌드, < 및 > 기호를 HTML 엔터티로 변환합니다. 예를 들어 앰퍼샌드(&)는 &가 됩니다. 이 경우 악성 콘텐츠가 프런트엔드의 Strip_tags() 처리를 벗어나더라도 백엔드에서는 htmlspecialchars()를 통해 처리됩니다.
사용자가 페이지의 헤더 요소와 양식 요소를 조작할 수 있는 일종의 브라우저 플러그인이 있습니다. Mozilla 플러그인인 Tamper Data를 사용하면 숨겨진 텍스트 필드가 많이 있는 간단한 양식을 쉽게 조작하여 PHP 및 MySQL에 지침을 보낼 수 있습니다.
사용자가 양식에서 제출을 클릭하기 전에 데이터 변조를 시작할 수 있습니다. 양식을 제출하면 양식 데이터 필드 목록이 표시됩니다.
Tamper Data를 사용하면 브라우저가 양식 제출을 완료하기 전에 사용자가 이 데이터를 조작할 수 있습니다.
이 도구를 방어하기 위한 가장 쉬운 방법은 모든 사용자가 변조 데이터(또는 유사한 도구)를 사용할 가능성이 있다고 가정하는 것입니다.
양식을 처리하기 위해 시스템에 필요한 최소한의 정보만 제공하고 양식을 전용 로직에 제출하세요. 예를 들어 등록 양식은 등록 로직에만 제출되어야 합니다.
공통 양식 처리 기능을 구축했고 많은 페이지에서 이 공통 로직을 사용한다면 어떻게 될까요?
숨겨진 변수를 사용하여 흐름을 제어한다면 어떨까요?
예를 들어, 어떤 데이터베이스 테이블에 쓸지, 어떤 파일 저장소를 사용할지 숨겨진 양식 변수로 지정할 수 있습니다. 4가지 옵션이 있습니다:
아무 것도 변경하지 말고 시스템에 악의적인 사용자가 없기를 몰래 기도하세요.
더 안전한 전용 양식 처리 기능을 사용하고 숨겨진 양식 변수 사용을 방지하기 위해 기능을 다시 작성합니다.
md5() 또는 기타 암호화 메커니즘을 사용하여 숨겨진 양식 변수에 있는 테이블 이름이나 기타 민감한 정보를 암호화하세요. PHP 측에서 암호를 해독하는 것을 잊지 마세요.
약어나 별명을 사용하여 값의 의미를 모호하게 만든 다음 이러한 값을 PHP 양식 처리 함수에서 변환합니다. 예를 들어 사용자 테이블을 참조하려는 경우 u 또는 임의의 문자열(예: u8y90×0jkL)을 사용하여 참조할 수 있습니다.
후자의 두 가지 옵션은 완벽하지는 않지만 사용자가 미들웨어 로직이나 데이터 모델을 쉽게 추측하도록 하는 것보다 훨씬 낫습니다.
웹의 장점은 정보와 서비스를 공유할 수 있다는 것입니다. 단점은 어떤 사람들은 양심의 가책도 없이 일을 하기 때문에 정보와 서비스를 공유한다는 것입니다.
양식을 예로 들어보세요. 누구나 웹 사이트를 방문하고 브라우저에서 파일 > 다른 이름으로 저장을 사용하여 양식의 로컬 복사본을 만들 수 있습니다. 그런 다음 그는 완전한 URL(formHandler.php가 아니라 양식이 이 사이트에 있으므로 http://www.yoursite.com/formHandler.php)을 가리키도록 작업 매개변수를 수정하고 원하는 작업을 수행할 수 있습니다. 변경 사항을 적용하고 제출을 클릭하면 서버는 법적 통신 흐름으로 이 양식 데이터를 수신하게 됩니다.
먼저 요청이 자신의 서버에서 오는지 확인하기 위해 $_SERVER['HTTP_REFERER']를 확인하는 것이 좋습니다. 이 방법은 대부분의 악의적인 사용자를 차단할 수 있지만 가장 정교한 해커를 차단할 수는 없습니다. 이 사람들은 양식의 원격 복사본이 서버에서 제출된 것처럼 보이도록 헤더의 참조 정보를 조작할 만큼 똑똑합니다.
원격 양식 제출을 처리하는 더 좋은 방법은 고유한 문자열이나 타임스탬프를 기반으로 토큰을 생성하고 이 토큰을 세션 변수와 양식에 넣는 것입니다. 양식을 제출한 후 두 토큰이 일치하는지 확인하세요. 일치하지 않으면 누군가가 양식의 원격 복사본에서 데이터를 보내려고 하는 것입니다.
SQL 삽입 문제를 방지하려면 mysql_real_escape_string()을 사용하세요.
정규식과 strlen()을 사용하여 GET 데이터가 변조되지 않았는지 확인하세요.
정규 표현식과 strlen()을 사용하여 사용자가 제출한 데이터가 메모리 버퍼를 오버플로하지 않도록 하세요.
strip_tags() 및 htmlspecialchars()를 사용하여 사용자가 잠재적으로 유해한 HTML 태그를 제출하지 못하도록 방지하세요.
Tamper Data와 같은 도구로 시스템이 침해되는 것을 방지하세요.
사용자가 원격으로 서버에 양식을 제출하는 것을 방지하려면 고유한 토큰을 사용하세요.
관련 권장 사항:
php에서 양식 제출 데이터 확인 기능을 구현하고 SQL 삽입 및 XSS 공격을 방지하는 방법
웹 공격을 방지하는 방법--php 초보자가 알아야 할 보안 문제
방법 공격 방지를 위한 악성 IP 주소 일괄 차단에 대한 Linux 사례 연구에서 수행하세요
위 내용은 PHP 웹사이트 개발에서 몇 가지 일반적인 공격 방법을 해결합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!