>  기사  >  백엔드 개발  >  PHP 보안 프로그래밍 - 웹사이트 보안 설계의 몇 가지 원칙

PHP 보안 프로그래밍 - 웹사이트 보안 설계의 몇 가지 원칙

不言
不言원래의
2018-04-09 10:31:391633검색

이 글의 주요 내용은 PHP 보안 프로그래밍에서 웹사이트 보안 설계의 몇 가지 원칙에 관한 것입니다. 관심 있는 친구들은


Deep Defense


Principles of 웹사이트 보안 디자인을 살펴보세요. 심층 방어(Deep Defense)는 보안 전문가들 사이에서 잘 알려진 원칙으로, 역사적으로 입증된 중복 보안 조치의 가치를 보여줍니다.

심층방어의 원리는 프로그래밍에만 국한되지 않고 다른 분야로도 확장될 수 있습니다. 백업 낙하산을 사용해 본 스카이다이버는 주 낙하산이 고장나는 것을 결코 원하지 않지만 중복된 안전 조치의 가치를 입증할 수 있습니다. 중복 보안 조치는 기본 보안 조치의 잠재적인 실패에 중요한 역할을 할 수 있습니다.

프로그래밍 분야에서 심층 방어 원칙을 고수하려면 항상 백업 계획을 세워야 합니다. 하나의 보안 조치가 실패하면 다른 보안 조치가 일부 보호 기능을 제공해야 합니다. 예를 들어, 사용자 인증 논리에 알려진 결함이 없더라도 중요한 작업을 수행하기 전에 사용자를 재인증하는 것이 좋습니다. 인증되지 않은 사용자가 어떤 방식으로든 다른 사용자인 것처럼 가장하는 경우 비밀번호를 묻는 메시지가 표시되면 인증되지 않은(확인되지 ​​않은) 사용자가 일부 중요한 작업을 수행하지 못하게 될 수 있습니다.

심층 방어는 합리적인 원칙이지만 보안 조치를 과도하게 강화하면 비용이 증가하고 가치가 감소할 뿐입니다.

Least Privilege

저는 예전에 메이드 키가 달린 차가 있었어요. 이 키는 시동에만 사용할 수 있으므로 도어, 콘솔, 트렁크를 열 수는 없습니다. 차량 시동에만 사용할 수 있습니다. 주차관리원에게 건네드릴 수도 있고(혹은 점화장치에 맡겨둘 수도 있으며, 열쇠를 다른 용도로 사용할 수 없음을 확인합니다.)

주차 직원에게 콘솔이나 트렁크를 열 수 없는 열쇠를 주는 것이 합리적입니다. 결국 귀중품은 그 곳에 보관하고 싶을 수도 있습니다. 하지만 나에게 이해가 되지 않는 것은 왜 문을 열 수 없는가입니다. 물론 내 주장이 권위 철회에 관한 것이기 때문이다. 주차요원이 문을 열 권한을 박탈당한 이유가 무엇인지 궁금했습니다. 프로그래밍에서 이것은 매우 나쁜 생각입니다. 대신, 어떤 권한이 필요한지 고려하고 각 사람에게 업무를 수행하는 데 필요한 만큼의 권한을 부여해야 합니다.

메이드 열쇠가 차 문을 열 수 없는 이유 중 하나는 열쇠가 복사될 수 있고, 복사된 열쇠가 나중에 차를 훔치는 데 사용될 수도 있다는 것입니다. 이 시나리오는 가능성이 희박해 보일 수 있지만 권한이 조금만 증가하더라도 불필요한 인증으로 인해 위험이 어떻게 증가할 수 있는지 보여주는 예입니다. 위험 최소화는 안전 프로그램 개발의 주요 구성 요소입니다.

권한이 남용될 수 있는 모든 방법에 대해 생각할 필요는 없습니다. 실제로 모든 잠재적인 공격자의 행동을 예측하는 것은 거의 불가능합니다.

단순함은 아름답다

복잡함은 오류를 낳고, 오류는 보안 취약점으로 이어질 수 있습니다. 이 간단한 사실은 보안 애플리케이션에 단순성이 왜 중요한지 보여줍니다. 불필요한 복잡성은 불필요한 위험만큼 나쁩니다.

예를 들어 다음 코드는 최근 보안 취약점 권고에서 발췌되었습니다.

<?php
	 
	$search = (isset($_GET[&#39;search&#39;]) ? $_GET[&#39;search&#39;] : &#39;&#39;);
 
?>

이 프로세스는 특히 경험이 부족한 개발자에게 $search 변수가 오염되었다는 사실을 혼동할 수 있습니다*(참고: 오염된 변수, 즉 프로그램 실행 시 이 변수의 값은 할당문에 의해 직접 지정되지 않고 콘솔 항목, 데이터베이스 등과 같은 다른 소스에서 가져옵니다. 위의 명령문은 다음 프로그램과 동일합니다.

<?php
 
  $search = &#39;&#39;;
 
  if (isset($_GET[&#39;search&#39;]))
  {
		$search = $_GET[&#39;search&#39;];
  }
 
?>

위의 두 처리 흐름은 완전히 동일합니다. 이제 다음 문장에 주목하세요:

$search = $_GET[&#39;search&#39;];

이 문장을 사용하면 $search 변수의 상태가 프로세스에 영향을 주지 않고 그대로 유지되며, 오염 여부도 확인할 수 있습니다.

노출 최소화

PHP 애플리케이션에는 PHP와 외부 데이터 소스 간의 빈번한 통신이 필요합니다. 주요 외부 데이터 소스는 클라이언트 브라우저와 데이터베이스입니다. 데이터를 올바르게 추적하면 어떤 데이터가 노출되었는지 확인할 수 있습니다. 인터넷은 매우 공용 네트워크이기 때문에 노출의 주요 소스이며 데이터가 인터넷에 노출되지 않도록 항상 주의해야 합니다.

데이터 노출이 반드시 보안 위험을 의미하는 것은 아닙니다. 그러나 데이터 노출은 가능한 한 최소화되어야 합니다. 예를 들어, 사용자가 결제 시스템에 접속하여 자신의 신용 카드 데이터를 서버로 전송할 때 SSL을 사용하여 이를 보호해야 합니다. 확인 페이지에 신용카드 번호를 표시하려면 카드 번호 정보가 서버에서 클라이언트로 전송되므로 이를 보호하기 위해 SSL도 사용해야 합니다.

예를 들어 이전 예에서는 신용카드 번호를 표시하면 노출 가능성이 확실히 높아집니다. SSL은 위험을 줄이지만 가장 좋은 해결책은 마지막 4자리만 표시하여 위험을 완전히 제거하는 것입니다.

민감한 데이터에 대한 노출을 줄이려면 어떤 데이터가 민감한지 식별하고 동시에 추적하며 불필요한 데이터 노출을 모두 제거해야 합니다. 이 책에서는 다양한 일반적인 유형의 민감한 데이터를 보호하는 데 도움이 되는 몇 가지 기술을 보여 드리겠습니다.

관련 권장 사항:

일반적인 PHP 보안 공격 및 솔루션

PHP 보안 예제에 대한 자세한 설명

PHP 보안 개발 라이브러리에 대한 자세한 설명

위 내용은 PHP 보안 프로그래밍 - 웹사이트 보안 설계의 몇 가지 원칙의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.