댓글 검색 목록

[php] 웹 사이트 보안 : 공격으로부터 웹 사이트를 보호하는 11 단계 ?‍?

페이지 정보

작성자 운영자 작성일 21-05-14 14:24 조회 2,422 댓글 0

이 순간 수많은 웹 사이트가 해커 공격의 표적이 됩니다. 종종 제거 된 업데이트와 무지가 비난을 받습니다. 웹 사이트에 대한 해커 공격을 방지하기 위해 수행 할 수 있는 작업은 여기에서 확인할 수 있습니다.


해커 공격은 영향을 받는 사람들에게 매우 불쾌하며 수익 손실, 고객 신뢰 상실 및 기타 불쾌한 결과를 초래할 수 있습니다. 따라서 웹 사이트 보안에 잠재적인 보안 취약점이 있는지 정기적으로 확인하고 가능한 한 빨리 수정해야 합니다.


몇 가지 약점은 몇 가지 작은 단계로 아주 쉽게 제거 할 수 있습니다. 해커로부터 귀하의 웹 사이트를 최상의 방법으로 보호하기 위해 웹 사이트를 구현 (프로그래밍) 할 때 관찰해야 하는 특정 기술도 있습니다.


웹 사이트 보안 검사 ✔️ 


웹 사이트 보안은 매우 복잡한 주제이며 일반적으로 해킹 할 수 없는 시스템은 없습니다!


그러나 공격자, 특히 Brute-Force-Attacks와 같은 대량 공격에 대해 매우 어렵게 만들 수 있습니다. 상대적으로 쉽게 자신을 보호 할 수 있습니다.


누군가가 이를 발견하고 악의적으로 악용 할 수 있기 전에 가능한 한 빨리 보안 허점을 닫는 것이 가장 좋습니다. 이를 감지하기 위해 Siwecos 또는 VirusTotal과 같은 온라인 도구가 많이 있습니다.


이러한 도구는 가능한 모든 취약점을 검사합니다. 그들 중 대부분은 권장 사항 일 뿐이며 나머지는 확실히 수정해야 합니다. 그러나 실제로 중요한 취약점이 이러한 도구에 의해 항상 탐지 되는 것은 아니므로 수동 검사가 반드시 필요합니다.


어떠한 경우에도 다음과 같은 안전 측면을 확인하고 구현해야 합니다.


가능한 공격 시나리오 ⚔️ 


웹사이트나 웹서버에는 거의 무한한 수의 공격 시나리오가 있습니다. 다음에서는 가장 일반적인 시나리오에 대해 간략히 설명하고 공격 중에 발생하는 상황에 대해 간략하게 설명합니다. "좋은"공격에서는 종종 다양한 방법을 조합하여 시스템을 해킹합니다.


SQL 주입 (SQLi) : 데이터를 읽거나 액세스 권한을 얻기 위해 악성 데이터베이스 쿼리가 주입됩니다.

Brute-Force-Attacks : 시행 착오를 통해 시스템에 접근 할 수 있습니다.

LFI (Local File Inclusion) : 악성 소스 코드가 대상 시스템에서 실행되며 시스템 탈취와 같은 다양한 결과를 초래할 수 있습니다.

Cross-Site-Scripting (XSS) : 웹 사이트 방문자의 브라우저에서 악성 자바 스크립트 코드 실행.

Defacement : 웹 사이트에 대한 정보 침투 / 변경 (예 : 정치적 선전을 전파합니다.

DDoS Angriff : 목표는 대상 시스템을 오버로드하여 충돌 시키는 것입니다.

Take over website/web server and use as bot : 예를 들어 웹 서버는 봇넷의 일부가 되어 악성 코드를 확산시킵니다.


공격 유형의 목표는 다를 수 있습니다. 일부는 사용자 데이터를 도청하는 것을 목표로 하고 다른 일부는 시스템에 과부하를 일으키고 충돌을 일으키고 다른 일부는 단순히 혼란을 일으키고 싶어합니다.


웹 사이트 보안 향상 ? 


1. Use TLS (SSL) certificate 


웹 사이트에 대한 TLS 인증서 (SSL이라고도 함 – SSL은 프로토콜의 이전 버전 임)는 클라이언트와 서버 간의 보안 통신을 담당하며 웹 사이트 보안의 매우 중요한 부분입니다. 인증서는 브라우저 (클라이언트)와 웹 사이트 (서버)간에 교환되는 모든 데이터를 암호화합니다. 이 암호화가 없으면 공격자가 모든 암호 또는 은행 데이터를 일반 텍스트로 가로 챌 수 있습니다.


보안 (암호화 된) 연결은 다음과 같이 도메인 앞의 잠금과 앞의 https://로 인식 할 수 있습니다.

https:// of the domain webdeasy.de 

또한 GlobalSign과 같은 CA (인증 기관)는 도메인 또는 전체 회사의 진위 여부를 확인합니다. 이것은 예를 들어 피싱 사이트 또는 유사 사이트가 아닌 실제 웹 사이트임을 보장합니다. 특히 로그인 사이트의 경우 항상 이 잠금이 도메인 앞에 표시되는지 확인해야 합니다.


웹 사이트에서 개인 데이터를 처리하는 경우 반드시 TLS 인증서가 필요합니다. 그 사용은 해당 단락의 개인 정보 보호 정책에도 언급되어야 합니다. 자세한 내용은 데이터 보호 담당자에게 문의하십시오.


대부분의 호스팅 업체에는 무료 TLS 인증서가 포함되어 있습니다. 그렇지 않으면 적은 비용으로 대여 할 수 있습니다. 또는 Let ’s Encrypt에서 무료 인증서를 생성 할 수도 있습니다. Plesk를 사용하여 웹 사이트를 관리하는 경우 확장 프로그램을 무료로 설치하고 도메인 및 메일 서버를 보호하는 데 사용할 수 있습니다.


FunFact : Google은 자체 인증 기관 (CA)이므로 사실상 스스로를 인증합니다. ? 

*.google.com Certificate 


2. SQL 주입 방지 


SQL 인젝션은 서버의 서버 측 시스템에서 외부 SQL 코드가 실행되는 공격입니다. 이러한 방식으로 공격자는 서버에서 SQL 쿼리를 실행하여 데이터를 수정하거나 읽을 수 있습니다.


Whhhaaaaattt? 걱정하지 마세요. 여기에 간단한 예가 있습니다.


SELECT name, place, phone FROM index WHERE ID=4;


"4"는 사용자 입력에 의해 SQL 문에 기록되었으며 모든 것이 정상입니다. 그러나 사용자는 HTML 입력 또는 HTML 텍스트 영역에 다음을 입력 할 수도 있습니다.“4; UPDATE name SET place =’somewhere’WHERE ID = 4”.


SQL 문은 다음과 같습니다.


SELECT name, place, phone FROM index WHERE ID=4; UPDATE name SET place='somewhere' WHERE ID=4;


업데이트 명령이 명령문에 삽입되었습니다. 공격자는 단순히 데이터베이스에서 레코드를 변경하는 데 사용했습니다.


이 예에서는 중요하지 않은 값만 변경됩니다. 그러나 이러한 공격은 암호를 변경하고 데이터베이스에서 기밀 데이터를 읽을 수도 있습니다. 물론 공격자는 이 작업을 수동으로 수행하지 않지만 이를 위해 도구를 사용합니다. 또한 웹 사이트가 취약한 지 확인하기 위해 사용할 수도 있습니다.


이를 방지하려면 데이터베이스에서 실행되기 전에 모든 사용자 입력을 마스킹해야 합니다. 작동 방식은 프로그래밍 언어에 따라 다릅니다.



3. XSS (CORS) Issue 


XSS는 Cross-Site Scripting의 약자로 방문자의 브라우저에서 악성 코드를 실행하는 공격입니다. 어떻게 이런 일이 일어나는지는 아주 간단합니다. 예 : 웹 사이트의 양식에 일반 텍스트를 작성할 수 있습니다. 웹 사이트에 텍스트가 표시되는 방명록이 있다고 가정 해 보겠습니다. 즉 사용자 입력은 웹 사이트에 1 : 1로 로드됩니다.

단, 공격자가 텍스트 대신 악성 코드로 자바 스크립트 태그 (예 : <script> alert ( 'HIHIHAHA H4CK3D! ?'); </ script>)를 입력하여 웹 사이트에 삽입하면 모든 사용자를 대상으로 실행됩니다. 브라우저에서.


CORS는 Cross-Origin Resource Sharing의 약자로 이러한 공격을 방지 할 수 있습니다. 특정 스크립트 또는 URL에 대한 연결을 금지 (또는 허용)합니다. 따라서 서버에서 CORS 구성을 확실히 확인해야 합니다.


이 악성 코드는 사용자 입력을 통해 서버에 침입하므로 모든 사용자 입력을 확인하는 것이 좋습니다. 이를 위해 블랙리스트 또는 화이트리스트를 사용할 수 있습니다. 몇 가지 입력 만 허용하려면 화이트리스트를 사용하고 입력이 화이트리스트에 있는지 확인해야 합니다. 항목이 많고 몇 개만 거부하려면 블랙리스트에 "금지"라고 쓰고 블랙리스트의 내용이 있는 항목은 거부 할 수 있습니다.


다음은 블랙리스트에 대한 JavaScript의 모습입니다.


let userInput = '<script></script>';  // this variable comes from your html input
let blacklist = ['<script>', '<link>'];  // These are the FORBIDDEN words
blacklist.forEach(blacklistEntry => {
  if(userInput.includes(blacklistEntry)) {
    console.log('You used a forbidden word! Stop it!');
    return false;
  }
});
console.log('Everything is great! Go on!');


다음과 같은 화이트리스트의 경우 :


let userInput = 'edit';  // this variable comes from your html input
let whitelist = ['delete', 'add', 'edit'];  // only these words are ALLOWED
let isValid = false;
for(let i = 0; i < whitelist.length; i++) {
  if(userInput.includes(whitelist[i])) {
    isValid = true;
  }
}
if(isValid) {
  console.log('Everything is great! Go on!');
} else {
  console.log('You have not used the right word!');
}


여기에서 CORS에 대한 자세한 정보를 찾을 수 있습니다.


4. DDOS 공격 방지 


DDOS는 Distributed Denial of Service의 약자로 서버가 과부하로 인해 무릎을 꿇는 공격입니다. 이는 거대한 컴퓨터 네트워크 (봇넷)가 연결을 통해 서버를 "스팸"하기 때문에 발생합니다.


Visualized DDOS Attack, Source: https://de.wikipedia.org/wiki/Denial_of_Service#/media/File:Stachledraht_DDos_Attack.svg 

Source: https://de.wikipedia.org/wiki/Denial_of_Service#/media/File:Stachledraht_DDos_Attack.svg


다행히도 이러한 공격을 완전히 차단할 수는 없지만 적어도 특정 지점까지 차단할 수 있는 서비스가 있습니다. 예를 들어 한 공급자는 Cloudflare입니다. 그러나 원칙적으로 이러한 서비스에는 요금이 부과됩니다. 따라서 DDOS 공격에 대한 보호가 필요한지 신중하게 고려해야 합니다.


5. 강력한 암호 사용 


이 단계는 모든 사람에게 중요합니다. 관리자뿐만 아니라 개인도 보안 암호에 주의를 기울여야 합니다. 여기에는 대소 문자, 숫자, 숫자 및 특수 문자가 포함됩니다. 제 생각에는 비밀번호는 8 자 이상이어야 합니다. 여기에서 쉽고 안전하게 비밀번호를 생성 할 수 있습니다.


그러면 많은 수의 암호가 있고 기억하기 어렵기 때문에 KeePass와 같은 암호 관리자로 생활을 더 쉽게 만들 수 있습니다.


6. 세션 관리 및 쿠키 처리 


로그인하려면 세션에서 로그인 한 사용자와 수행 할 수 있는 작업을 알아야 합니다. 사용자를 고유하게 식별하기 위해 고유 한 세션 ID가 저장됩니다. 과거에는 URL에 종종 추가되었습니다. 예를 들어 다음과 같습니다. example.com/dashboard?sid=89234nFJK98nkdf823njkFsdn387$


그러나 친구에게 이 페이지를 표시하기 위해 이 링크를 보내면 친구가 직접 로그인 됩니다. 세션 ID가 링크와 함께 전송되었으며 서버는 동일한 사용자라고 생각합니다. 이러한 링크를 가까운 친구에게 보내면 비극적이지 않습니다. 하지만 소셜 네트워크에서 이 링크를 공유한다고 상상해보세요. ?


따라서 수년 전에 더 나은 솔루션을 찾기로 결정했습니다. 이것이 오늘날 링크가 https://example.com/dashboard와 같은 모습이어야 하는 이유입니다.


여기서 세션 ID는 URL에 포함되지 않고 사용자의 임시 메모리에만 저장되는 쿠키에 저장됩니다. 링크를 호출하는 다른 사람들은 (이 방법으로) 그의 세션을 이어받을 가능성이 없습니다.


여기에서 Node.js로 보안 로그인 시스템을 구현하는 방법을 살펴볼 수 있습니다.


7. 공개 (민감한) 정보 숨기기 


공개 도메인에 속하지 않는 정보가 있습니다. 예를 들어 웹 사이트의 경우 이것은 PHP 버전, 웹 사이트의 절대 파일 경로 (예 : /var/www/html/webroot/site1990/new/stage/) 또는 서버 운영 체제입니다.


이를 설명하기 위해 여기에 무서운 예가 있습니다. Google을 사용하면 특정 키워드뿐만 아니라 매개 변수 (예 : 매개 변수)도 검색 할 수 있습니다. 파일 확장자 및 인용. 따라서 이 검색을 통해 공개적으로 액세스 할 수 있는 phpinfo 파일이 있는 페이지를 표시 할 수 있습니다. 이 파일에서 서버의 전체 PHP 구성이 공개되고 서버에 대한 많은 흥미로운 정보를 얻을 수 있습니다.


Google 검색에 "ext : php intitle : phpinfo"를 입력하고 몇 가지 결과를 얻었습니다. 한 결과가 이 페이지를 얻었습니다.


Public phpinfo.php of a page<br> 

그중에는 모든 PHP 설정이 포함 된 수백 줄이 있습니다. 이 서버는 여전히 PHP 버전 4.4.2를 실행 중이므로 치명적입니다. 이 PHP 버전의 지원 및 추가 개발은 2008 년 이후 이미 중단되었으며 심각한 보안 취약점이 포함되어 있습니다.


Source: https://de.wikipedia.org/wiki/PHP#PHP_4


따라서 사용 후 이러한 민감한 파일을 삭제하거나 비밀번호 (예 : .htaccess 파일을 통해)로 보호해야 합니다.


또한 display_errors 변수가 라이브 시스템에서 Off로 설정되어 있는지 확인해야 합니다. 공격자가 내부 파일 시스템에 대한 정보도 수신하기 때문입니다. 데이터베이스 오류로 인해 더욱 악화됩니다. 여기서 최악의 경우에는 액세스 데이터도 출력됩니다. 물론 이것은 어떤 대가를 치르더라도 예방해야 합니다! PHP 설정에서 대신 오류 메시지가 로그 파일에 기록되도록 지정할 수 있습니다.


Apache 웹 서버를 사용하면 php.ini의 행을 Off로 변경할 수 있습니다.


display_errors = Off


이 파일에 대한 액세스 권한이 없는 경우 개별 PHP 스크립트의 파일 시작 부분에 다음 행을 삽입 할 수 있습니다. 이 명령은 첫 번째 출력 전에 실행하는 것이 중요합니다.


ini_set('display_errors', 0);



이것은 당분간 모든 오류 메시지를 비활성화 합니다. 그러나 때때로 스크립트를 디버그 하려면 출력이 필요합니다. 이 경우 자신의 IP에 대해서만 출력을 출력하는 것이 좋습니다. PHP에서는 다음과 같이 작동합니다.


if($_SERVER["REMOTE_ADDR"] == "YOUR.IPV4.ADDRESS.HERE") {
  print_r("your debug output");
}


8. 사용자 입력 유효성 검사 


유효성 검사의 주제는 매우 크고 흥미롭고 개발자에게도 필수적입니다. 유효성 검사는 특정 규칙에 따라 클라이언트에서 서버로 전송 된 데이터를 확인하고 유효성을 검사하는 것입니다. 잘못된 입력은 악성 코드를 포함 할 수 있으므로 프로세스에서 거부됩니다. 이 단계는 XSS 공격에 대해서도 중요합니다.


특히 데이터가 데이터베이스에 기록 될 때 유효성 검사가 훨씬 더 중요합니다. 이렇게 하면 서버 명령도 실행할 수 있습니다. 최악의 경우 데이터도 삭제되거나 서버가 종료 될 수 있습니다. 2. SQL 주입 방지에서 이미 다뤘습니다.


유효성 검사의 의미를 명확히 하기 위해 다음은 PHP의 예입니다.

<?php
$id = $_GET["id"];
$type = $_GET["type"];
// if id is not a number
if(!is_numeric($id)) {
    exit("id not valid");
}
// type must be one of the following strings
$types = array("slow", "slower", "normal", "fast", "faster");
if(!in_array($type, $types)) {
    exit("invalid type");
}
// Parameters successfully validated
// Code goes here
exit("success");
?>



여기서 매개 변수 id와 type은 GET 매개 변수로 전달됩니다. id가 숫자가 아니거나 유형이 $ types 화이트리스트에 없으면 스크립트가 중단됩니다. 그런 다음 스크립트는 exit ()로 종료됩니다. 조건이 적용되지 않으면 나머지 코드를 실행할 수 있습니다.


9. 정기적으로 업데이트 설치 


많은 웹 사이트는 WordPress, Drupal 또는 Joomla와 같은 CMS (콘텐츠 관리 시스템)를 기반으로 합니다. 보안을 위해 정기적인 업데이트가 있습니다. 개발자는 가능한 한 빨리 새로운 보안 허점을 발견하고 닫습니다. 따라서 CMS 설치는 항상 최신 상태여야합니다. 대부분의 CMS에서 새 업데이트에 대한 알림을 받을 이메일 알림을 설정할 수 있습니다. 이를 활용하고 정기적으로 업데이트가 있는지 페이지를 수동으로 확인해야 합니다.


WPHackedHelp 도구를 사용하면 WordPress 사이트에서 보안 취약성을 확인할 수 있습니다. 


설치된 플러그인에도 동일하게 적용됩니다. 안정적인 업데이트를 사용할 수 있게 되면 바로 설치해야 합니다.


또한 호스트 시스템 (서버 시스템)은 항상 최신 상태여야 합니다. 최신 Ubuntu 20.04 대신 Ubuntu 18.04가 여전히 있으면 큰 문제가 아닙니다. 중요한 것은 여전히 ​​활성 보안 업데이트를 받는 버전을 사용한다는 것입니다. 일반적으로 제조업체 페이지에서 개별 릴리스의 세부 정보가 나열된 개요를 찾을 수 있습니다. 약어 LTS (Long Term Support)를 읽으면 일반적으로 모든 것이 좋습니다. 이는 귀하의 버전이 더 오래 지원됨을 의미합니다. 즉, 다른 버전보다 현재 업데이트가 더 오래 제공됩니다.


웹 사이트와 플러그인을 최신 버전으로 업데이트하기 전에 업데이트 중에 문제가 발생하여 원래 버전을 복원해야 하는 경우를 대비하여 백업을 만들어야 합니다. 


10. 정기 백업 생성 


정기적인 백업은 웹 사이트 보안에 간접적으로 기여합니다. 오늘 귀하의 웹 사이트가 손상되었다는 사실을 알게 되면 쉽게 이전 상태로 되돌리고 보안 허점을 닫을 수 있습니다.


많은 호스팅 업체는 무료 또는 추가 요금으로 정기적 인 스냅 샷을 제공합니다. Plesk를 통해 호스팅을 관리하는 경우 백업 관리자를 사용하거나 /var/www/vhosts와 같은 디렉토리를 외부 백업 저장소에 백업하는 셸 스크립트를 직접 만들 수 있습니다. 호스팅 업체는 반드시 올바른 백업 솔루션을 선택하도록 도와 줄 것입니다.


외부 백업은 완전히 다른 시스템에 저장된 백업입니다. 가장 좋은 경우에는 다른 데이터 센터에도 있습니다. 과거에 보았 듯이 데이터 센터조차 외부 영향으로부터 안전하지 않기 때문입니다.


11. 문의 양식에서 스팸 방지 



많은 (잘 알려진) 웹 사이트는 웹 사이트에 모든 종류의 형태로 스팸을 남기는 봇에 큰 문제가 있습니다. 이것은 매우 성 가실 수 있습니다.


이를 방지하기 위해 Google reCAPTCHA를 쉽게 설치하거나 WordPress를 사용하는 경우 Antispam Bee 플러그인을 추천 할 수 있습니다. 설치 및 설정 만하면 됩니다.


결론 ? 


아휴! 웹 사이트 보안을 개선하기 위한 몇 가지 단계였습니다. 웹 사이트에 구현 된 보안 측면과 따라 잡는 보안 측면은 무엇입니까? 아니면 공격으로부터 자신을 보호하기 위한 몇 가지 단계가 더 있습니까?



https://dev.to/webdeasy/website-security-11-steps-to-protect-your-website-from-attacks-207d




댓글목록 0

등록된 댓글이 없습니다.

웹학교 로고

온라인 코딩학교

코리아뉴스 2001 - , All right reserved.