WordPress 플러그인 및 테마 개발자를 위한 보안 모범 사례

게시 됨: 2020-12-09

WordPress 개발자로서 작업할 작업에 대해 많은 결정을 내려야 합니다. 귀하의 주요 관심과 우선 순위는 놀라운 테마 또는 플러그인을 구축하는 것이며, 코드 작업을 위해 운전석에 앉을 때 보안 조치는 종종 뒷전입니다. 마지막으로 앉아서 보안 문제에 대해 자신의 코드를 검토한 것이 언제였습니까? 아니, 나는 그렇게 생각하지 않았다

이 팁은 CleverPlugins에서 플러그인을 개발하고 수많은 고객이 해킹된 후 웹사이트를 다시 온라인 상태로 되돌릴 수 있도록 도운 제 경험을 기반으로 합니다. WP Security Ninja와 같은 보안 플러그인을 개발한다고 해서 다른 사람들의 코드에 대해 덜 편집증적이게 된 것은 아닙니다.

해킹된 웹사이트의 가장 일반적인 이유는 여전히 형편없는 비밀번호 관리이지만, 이것이 코드를 보호할 수 있는 간단한 방법 중 일부를 사용하는 변명이 되어서는 안 됩니다.

플러그인이나 테마를 개발할 때 인기를 얻고 가능한 한 많은 웹사이트에 설치되기를 원합니다. 귀하의 성공이 클수록 사람들이 귀하의 작업을 악용하여 사용자의 웹사이트를 해킹할 가능성이 커집니다.

WordPress의 인기로 인해 해커의 가장 일반적인 대상 중 하나가 되었습니다. 플러그인이나 테마에서 취약점이 감지되면 수십만 개는 아니더라도 수천 개의 웹사이트가 남용될 수 있습니다.

유감스럽게도 잘 알려진 제품에 취약점이 나타나는 일이 정기적으로 발생하므로 사용자를 위해 코드를 보호하기 위해 몇 가지 기본적인 보안 조치를 취하는 것이 좋습니다.

WordPress.org 검토 팀은 어떻습니까?

공식 리포지토리에 게시하기 전에 플러그인과 테마를 검토하는 팀이 모든 종류의 보안 문제를 확인한다고 생각할 수 있지만 팀이 작고 소수로 구성되어 있습니다. 확인해야 할 플러그인과 테마의 대기열이 지속적으로 증가하므로 각각을 검토해야 하는 시간이 제한됩니다.

그러나 무언가를 찾으면 수정하거나 특정 기간 전에 취약점을 수정해야 한다는 경고 이메일을 보낼 때까지 플러그인을 자동으로 닫을 수 있습니다.

요점은 플러그인이나 테마가 리포지토리에 나열되면 추가 검사 없이 리포지토리를 통해 업데이트를 푸시할 수 있으므로 취약점이 언제든지 쉽게 잠입하여 거의 모든 기간 동안 탐지되지 않을 수 있다는 것입니다.

기본적으로 플러그인 보안 조치를 강화하는 것은 귀하에게 달려 있으므로 WordPress 제품을 보호하고 많은 두통과 잠재적으로 브랜드에 대한 부정적인 영향을 예방할 수 있는 몇 가지 방법을 살펴보겠습니다.

WordPress 플러그인 또는 테마를 안전하게 개발하기 위해 할 수 있는 일은 다음과 같습니다.

1. 모든 관점에서 보안을 생각하십시오!

누가 플러그인이나 테마를 사용하고 있는지, 보안에 대해 어느 정도 이해하고 있는지 전혀 알 수 없습니다.

누가 귀하의 플러그인이나 테마를 사용하고 있는지, 보안에 대해 어느 정도 이해하고 있는지 전혀 알 수 없습니다.Tweet

고객 웹사이트의 관리자, 편집자 또는 일반 사용자는 보안 암호를 사용하지 않을 수 있으며 계정이 해킹될 수 있습니다. 제품에 보안이 설정되지 않은 경우 이러한 계정이 악용되어 고객 웹사이트에 악성 코드를 설치할 수 있는 추가 액세스 권한을 얻을 수 있습니다.

웹 사이트가 실행되는 서버를 구성한 서버 관리자가 동일한 서버의 다른 사이트로부터 웹 사이트를 보호하는 방법에 대해 충분히 알 것이라고 기대해서는 안 됩니다. 웹사이트가 대규모 공급자에 의해 호스팅되는 경우 웹사이트가 적절하게 "분리"될 것으로 예상할 수 있지만 제품이 설치될 위치는 알 수 없습니다.

편집증처럼 들리나요? 아마도. 그러나 플러그인이나 테마가 인기를 얻게 되면 보안에 대해 편집증적인 접근 방식을 취하게 되어 기쁠 것입니다.

플러그인이나 테마가 인기를 얻게 되면 보안에 대해 편집증적인 접근 방식을 취하게 되어 기쁩니다.Tweet

2. XSS 방지 – Cross-Site Scripting 공격

WordPress가 Gutenberg 및 ReactJS와 함께 보다 프론트엔드 중심의 프로젝트가 됨에 따라 이것은 점점 더 중요해지고 있습니다.

WordPress 개발자의 가장 흔한 실수 중 하나는 코드의 유효성을 검사하고 삭제하는 것을 잊어버려 XSS 공격에 노출된 상태로 남겨두는 것입니다. XSS에는 몇 가지 변형이 있지만 일반적으로 XSS 공격은 해커가 서버에 코드를 삽입한 다음 방문자의 브라우저에서 실행하도록 허용할 때 발생합니다.

입력 필드가 있다고 상상해보십시오. 편의상 사용자 또는 방문자가 게시물에 댓글을 제출할 수 있는 댓글 필드라고 가정하겠습니다.

해커는 "<script>alert('XSS');</script>" 를 사용하여 댓글을 제출하려고 시도합니다.

이제 이것은 사용자 화면에 경고를 표시하는 기본 예일 뿐이며 다른 것은 없습니다. 실제 해커는 댓글 필드를 사용하여 방문자의 브라우저 등에서 정보를 훔칠 수 있는 코드를 사이트에서 로드하는 코드를 삽입합니다.

유효성 검사, 소독 및 탈출을 통해 이러한 일이 발생하지 않도록 방지할 수 있습니다.

유효성 검사 는 데이터베이스에 저장하는 것과 같은 작업을 수행하기 전에 제출된 데이터를 확인하는 것입니다. 데이터가 제출될 때마다 이를 확인하고 허용 가능한지 확인할 수 있습니다. 수량 필드인 경우 숫자가 필요합니다. 숫자가 아닌 경우 사용자에게 오류 메시지를 반환할 수 있습니다.

데이터 를 삭제하는 것은 제출된 정보를 처리하고 원하지 않는 문자를 제거하는 등 저장하고 싶지 않은 내용이 포함되어 있지 않은지 확인하는 것입니다. WordPress에는 이를 돕기 위해 몇 가지 기능이 내장되어 있습니다. 잠시 후 살균에 대해 자세히 알아보십시오.

이스케이프 는 악성 코드가 실제로 브라우저에서 실행되는 것을 방지합니다. 웹사이트에 이미 악성 코드가 삽입되어 있거나 다른 플러그인 또는 테마를 통해 해커가 사용 중인 데이터에 코드를 삽입할 수 있다고 가정해 보겠습니다. 데이터를 표시하기 전에 화면으로 이스케이프하면 문제가 되지 않습니다.

"<script>alert('XSS');</script>" 이전에 사용한 것과 동일한 간단한 예를 살펴보겠습니다.

이 코드로 아무것도 하지 않으면 브라우저는 그것이 HTML 코드라고 생각할 것입니다. 여기서 중요한 세부 사항은 HTML 태그를 정의하는 데 사용되는 < > 문자입니다. 이것을 이스케이프함으로써 <&lt;> 으로 &gt; 이제 브라우저는 이것이 실제 HTML 코드가 아니라는 것을 이해하고 대신 보다 작음 및 보다 큼 기호를 표시해야 합니다.

애플리케이션에 들어오고 나가는 모든 데이터를 검증, 삭제 및 이스케이프함으로써 가장 일반적인 공격 방법 중 하나로부터 사용자를 보호할 수 있습니다.

3. SQL 인젝션에 주의

이름에서 알 수 있듯이 공격자는 SQL 주입을 사용하여 웹사이트에서 수정된 SQL 쿼리를 처리하고 이를 사용하여 데이터베이스에 액세스할 수 있습니다.

웹사이트에 저장하는 데이터에 따라 SQL 주입 공격으로 웹사이트 데이터가 유출되는 것은 당혹스러운 일에서 평판과 비즈니스를 완전히 망칠 수 있습니다.

SQL 인젝션은 웹 사이트를 공격하는 오래된 방법이지만 여전히 매우 효과적이며 이러한 형태의 공격을 사용할 방법을 찾는 사람들이 많습니다. 2020년 10월 인기 있는 Loginizer WordPress 플러그인은 백만 개 이상의 웹사이트를 위험에 빠뜨리는 SQL 주입 취약점이 있다고 발표했습니다.

2019년에는 알려지지 않은 해커가 SQL 인젝션 공격을 통해 수백만 명의 불가리아인의 세금 데이터를 훔쳤고, 2016년에는 러시아 해커 그룹이 오하이오에서 약 50만 명의 유권자 정보를 추출했습니다. 이러한 종류의 공격은 여전히 ​​매우 효과적이며 이에 대한 많은 정보를 찾을 수 있습니다.

데이터 입력 살균에 관한 연재 만화

출처: https://xkcd.com/327/

SQL 주입이 발생하는 가장 일반적인 장소는 사용자 입력(예: 이름)을 허용하는 양식 필드입니다. 공격은 입력 필드에 SQL 코드의 일부를 입력하여 사용자가 예상한 것과 다른 결과를 제공하는 사용자 지정 쿼리를 생성함으로써 발생합니다.

사람들이 특정 이름을 검색할 수 있는 양식이 있다고 가정해 보겠습니다.

SELECT * FROM wp_postmeta WHERE meta_value = 'Henry' AND meta_key = 'celebrity_name';

이 간단한 예는 이름이 Henry 이고 특정 키가 celebrity_name 이름인 모든 행이 있는 포스트 메타 테이블에서 모든 행을 선택합니다. 이렇게 하면 전체 데이터베이스를 반환하지 않고 필요한 특정 행만 반환합니다.

공격자는 다른 값(예: 'Henry' OR 1=1-- 을 구문 분석하려고 시도합니다.

SQL에서 OR 1=1 이 항상 true이기 때문에 쿼리는 이제 특정 값 또는 다른 모든 행을 포함하는 모든 행을 반환합니다.

더 나빠지지만. 우리의 SQL 쿼리는 meta_key 가 우리가 찾고 있는 특정 값과 일치하는 결과만 요구하므로 모든 것을 반환하지는 않습니다. 이것은 SQL 주입 공격의 영향을 제한해야 합니다. 맞습니까?

글쎄, 그렇지 않다. SQL에서 이중 대시는 주석 표시기이므로 이 뒤에 오는 모든 것이 주석 처리됩니다.

SELECT * FROM wp_postmeta WHERE meta_value = 'Henry' OR 1=1--' AND meta_key = 'celebrity_name';

즉, 쿼리는 다음과 같습니다.

SELECT * FROM wp_postmeta WHERE meta_value = 'Henry' OR 1=1

이제 쿼리는 기본적으로 해당 데이터베이스 테이블의 모든 항목을 반환합니다.

이것은 단순한 예에 불과했습니다. 데이터베이스의 모든 정보는 아니지만 대부분의 정보에 액세스하는 더 복잡한 방법이 많이 있습니다. 공격자는 블라인드 SQL 주입 공격을 시도할 수 있습니다. 즉, 데이터베이스에서 코드를 실행하여 새 관리자를 추가하고 모든 데이터를 제거하는 등의 작업을 수행할 수 있습니다.

대부분의 공격은 웹사이트 양식에 제출된 SQL의 일부를 포함하는 임의의 쿼리 문자열 형태일 것입니다. 자동화된 스크립트는 웹사이트 출력의 변경 사항을 감지한 다음 공격 가능성을 감지합니다.

간단하고 효과적인 방법은 입력으로 ' 아포스트로피 ' 를 보내어 변경 사항이 있는지, 오류가 발생하는지 또는 더 많은 결과가 반환되는지 확인하는 것입니다.

구출에 워드 프레스

데이터베이스와 직접 상호 작용하는 대신 모든 개발자는 WordPress에 내장된 데이터베이스 추상화 클래스인 $wpdb 를 사용해야 합니다.

WordPress의 $wpdb 클래스에는 데이터베이스와 안전하게 상호 작용하는 데 필요한 모든 CRUD 기능이 있으며 플러그인 또는 테마가 필요한 경우 클래스를 사용하여 자체 데이터베이스 테이블과 상호 작용할 수도 있습니다.

각 입력 양식에 어떤 데이터를 합리적으로 입력해야 하는지 예상하면 문제를 해결할 수 있습니다. 이전 예에서는 이름을 검색했습니다. 문자만 허용하도록 입력을 소독할 수 있습니다. 몇 가지 옵션만 포함하는 선택 상자 또는 라디오 그룹이 있는 경우 데이터를 확인하여 허용하는 선택 사항 중 하나일 뿐인지 확인할 수 있습니다.

문제를 해결하기 위해 할 수 있는 가장 중요한 것은 $wpdb->prepare() 함수로 데이터를 준비하는 것입니다.

이 함수는 준비된 쿼리 문자열과 SQL 쿼리에 추가하려는 인수의 배열을 사용합니다.

$meta_key = 'celebrity_name';
$meta_val = 'Henry'
$allhenrys = $wpdb->get_results(
  $wpdb->prepare(
    "SELECT * FROM $wpdb-&gt;postmeta WHERE meta_key = %s AND meta_value = %s",
    $meta_key,
    $meta_val
  )
);

모든 작업은 prepare() 함수 내에서 이루어집니다. 첫 번째 매개변수인 준비된 쿼리에는 실제 값 대신 자리 표시자 %s 이(가) 포함되어 있습니다. 이것은 다른 구문 분석된 변수인 $meta_key$meta_val 로 대체됩니다.

참고 – 쿼리에서 자리 표시자를 둘러싸는 아포스트로피를 사용하지 않는 것이 중요합니다. 함수가 자동으로 추가할 것이기 때문입니다.

이것은 단순화된 예이지만 동일한 프로세스를 모든 데이터베이스 쿼리에 사용할 수 있으며 문자열에는 %s , 정수에는 %d , 부동 소수점에는 %f 를 사용할 수 있습니다.

데이터베이스에 새 행을 추가하는 것과 같은 특정 상황을 위한 기능도 있습니다. 이를 위해 $wpdb->insert() 를 사용할 수 있습니다.

$wpdb->insert(
  "{$wpdb->prefix}my_custom_table",
  array(
    'name'   => 'Henry',
    'userid' => 123,
    'score'  => 10,
  ),
  array(
    '%s',
    '%d',
    '%d',
  )
);

준비 기능을 사용하면 제품에 대한 대부분의 SQL 주입 시도를 방지할 수 있습니다.

$wpdb 문서를 확인하는 것을 잊지 마십시오. 일부 함수는 입력을 이스케이프 처리합니다. 다른 사람들은 함수에 대한 데이터를 구문 분석하기 전에 입력을 직접 이스케이프하기를 기대합니다.

4. nonce를 사용하여 요청 보호

WordPress에서 nonce 시스템을 사용하면 많은 공격을 방지할 수 있습니다. 보안상 nonce는 한 번만 사용되는 숫자입니다. 아이디어는 이 요청이 합법적인지 확인하는 방법으로 코드에서 WordPress 설치에 대한 모든 요청에 ​​이 고유 번호를 추가하는 것입니다.

클럽에 들어가기 위해 경비원에게 알려야 하는 비밀 비밀번호가 있는 것과 조금 비슷합니다.

그러나 WordPress의 nonce는 약간 다릅니다. nonce는 숫자가 아니며 한 번만 사용되지도 않습니다.

기술적으로 WordPress의 nonce는 소문자와 숫자를 모두 포함할 수 있으며 한 번만 사용되는 대신 일정 기간 후에 재생성됩니다.

nonce를 사용하는 방법은 JavaScript 파일을 등록하는 PHP 코드가 숫자와 문자의 약간 고유한 조합을 생성하고 JS 코드가 읽을 수 있도록 구문 분석하는 것입니다.

JavaScript 코드가 웹사이트에 요청을 보낼 때마다 해당 코드를 함께 보내며, 코드가 일치하지 않으면 코드는 요청을 완전히 무시해야 합니다.

예제를 사용하면 항상 조금 더 쉽기 때문에 다음 단계에 따라 플러그인에서 .js 파일을 로드하는 간단한 방법을 살펴보겠습니다.

WordPress 플러그인에서 nonce 사용

add_action('wp_enqueue_scripts', 'load_my_plugin_script');

function load_my_plugin_script() {
  // Register the script with all details and ensures it is loaded after jQuery
  wp_register_script('secure-plugin', plugin_dir_url( __FILE__ ). 'js/secure-plugin.js', array( 'jquery' ) );

  // Here happens the magic, we add some details to an object that we can later reference and read from in our JS code.
  wp_localize_script(
    'secure-plugin',
    'plugin_ajax_object',
    array(
      'nonce' => wp_create_nonce('secure-plugin-nonce')
    )
  );

  // Once that is done, we can now enqueue the script
  wp_enqueue_script('secure-plugin');
}

이 함수에서 WordPress에 JavaScript 파일을 로드하도록 지시합니다. 먼저 로드하려는 파일을 wp_register_script() 로 등록합니다.

그런 다음 wp_localize_script() 를 사용하여 데이터 배열, 특히 JS 코드에서 사용하려는 고유한 nonce를 포함하는 "nonce"를 구문 분석합니다. 그 배열에 있는 모든 종류의 다른 정보도 보낼 수 있지만 이 예에서는 단순하게 유지한다는 것을 기억하십시오.

JavaScript 파일에서 요청을 보낼 때 고유한 nonce를 포함해야 합니다. 그렇게 하는 것은 쉽습니다.

JavaScript 파일에서 WordPress 플러그인의 nonce 사용

jQuery(document).ready(function($) {
  $.ajax({
    url: ajaxurl, // WP variable, contains URL pointing to admin-ajax.php
    type: 'POST',
    data: {
      'action':      'get_custom_data',
      '_ajax_nonce': plugin_ajax_object.nonce,
      'user_data':   'Some input from a user'
    },
    success: function( response ) {
      // Here we do what happens if all is good - update the interface with a success message!?
    },
    error: function( response ) {
      // Whooops, something went wrong!
      // console.log(response);
    }
  });
});

wp_localize_script() 를 사용했기 때문에 JavaScript에서 plugin_ajax_object 변수를 사용할 수 있습니다. nonce를 변수 _ajax_nonce 로 보냅니다.

JavaScript 코드에서 WordPress 플러그인의 nonce 확인 및 확인

add_action('wp_ajax_get_custom_data', 'get_custom_data');

function get_custom_data() {
  // Ready for the magic to protect your code?
  check_ajax_referer('secure-plugin-nonce');

  /**
   * That's it - the check_ajax_referer function verifies the nonce is correct or it dies and stops code execution if it fails.
   *
   * If you want to customize the error handling and perhaps return an error to your JS code, you could change the code to something like:
   * if ( ! check_ajax_referer( 'secure-plugin-nonce', false, false ) ) {    
   *   wp_send_json_error( 'Invalid nonce' );
   * }
   */

  $sanitized_user_data = sanitize_text_field( $_POST['user_data'] );

  // ... continue with the rest of your plugin's function code ...
}

마술은 nonce를 확인하고 nonce가 예상한 것과 일치하지 않으면 단순히 실패하고 추가 코드 실행을 중지하는 check_ajax_referer() 함수에서 발생합니다.

코드를 추가로 사용자 정의하여 발생한 일에 대한 특정 정보를 사용자에게 반환할 수 있습니다.

코드에서 nonce를 사용하는 것은 다양한 유형의 해킹 시도를 방지하는 빠르고 쉽고 효과적인 방법입니다. 그렇다고 해서 다른 모든 보안 조치를 건너뛸 수 있다는 의미는 아니지만 최악의 문제를 줄이는 데 도움이 됩니다.

아무도 믿지 않는 것에 대해 내가 말한 것을 기억하십니까? 이를 통해 코드를 보호하는 또 다른 방법인 완전 삭제를 수행할 수 있습니다.

구독하고 우리 책의 무료 사본을 받으세요

신용 카드 분쟁 승소율을 740% 높이는 11가지 입증된 기술

친구와 공유

친구의 이메일 주소를 입력하세요. 스카우트님, 이 책만 이메일로 보내드리겠습니다.

공유해 주셔서 감사합니다.

굉장함 - '신용카드 분쟁 승소율을 740%까지 높이는 11가지 입증된 기술' 사본이 방금 다음 주소로 발송되었습니다. . 우리가 더 널리 알리도록 돕고 싶습니까? 계속해서 친구 및 동료와 책을 공유하십시오.

구독해주셔서 감사합니다!

- 귀하의 '신용카드 분쟁 승소율을 740%까지 높이는 11가지 입증된 기술' 사본을 다음 주소로 보냈습니다. .

이메일에 오타가 있습니까? 이메일 주소를 수정하고 다시 보내려면 여기를 클릭하세요.

책 표지
책 표지

5. 사용자 입력 살균

이전 예에서는 JS에서 PHP로 전송된 추가 데이터를 포함했습니다. 코드에 데이터를 가져올 때마다 안전하지 않을 것으로 예상해야 합니다.

'user_data':'Some input from a user'

이 예에서는 간단한 문자열이지만 PHP로 데이터를 다시 전송하기 때문에 입력에 PHP 환경에서 악용될 수 있거나 추가 남용을 허용하는 데이터베이스에 저장될 수 있는 코드가 포함되지 않도록 해야 합니다.

살균이 옵니다. WordPress에는 사용자가 제공하는 모든 입력을 받아 데이터를 사용자에게 반환하기 전에 정리하는 다양한 기능이 있습니다.

이 예에서는 sanitize_text_field() 함수를 사용했지만 WordPress에는 다양한 유형의 데이터에 적합한 많은 살균 기능이 있습니다.

코드를 안전하게 유지하고 남용을 방지하는 데 사용할 수 있는 다른 많은 훌륭한 기능과 방법이 WordPress에 내장되어 있습니다.

코드로 전송된 데이터를 먼저 삭제하지 않고 사용해서는 절대 안 됩니다. 일반적인 WordPress 개발자 실수에 대한 이 기사에서 살균 및 기타 유용한 팁에 대한 자세한 내용을 확인하세요.

그러면 대부분의 WordPress 개발자가 경험한 다음 팁이 표시됩니다.

6. is_admin() 은 당신이 생각하는 것이 아님을 기억하십시오

코드를 악의적인 것으로부터 보호하는 것에 대해 처음 생각하기 시작하면 아마도 is_admin() 함수를 우연히 보게 될 것이고, 이름에서 그것은 당신이 필요로 하는 모든 것으로 들리고, 당신이 해야 할 일은 그것으로 코드를 래핑하는 것뿐입니다. 모든 것이 잘 될 것입니다.

아니요, 불행히도 그렇지 않습니다. is_admin() 함수는 웹사이트의 관리 측에서 코드가 실행되고 있는지 여부만 감지합니다. 코드가 일반 사용자 또는 관리자에 의해 실행되고 있는지 감지하는 작업은 수행하지 않습니다.

관리 인터페이스에서 코드를 실행하고 있을 가능성이 높기 때문에 플러그인에 코드를 입력하기만 하면 결코 알아차리지 못할 것입니다. 즉, 코드가 true 로 평가되고 이에 대한 생각을 멈추고 다른 작업으로 넘어갈 것입니다. 또 다른.

사용자가 관리자인지 확인하는 올바른 방법은 사용자 기능을 확인하는 것입니다.

  if ( current_user_can( 'activate_plugins' ) ) { 
    // Do your code here
  }

다양한 사용자 역할에 대해 다양한 기능이 있으므로 훨씬 더 세부적으로 제어할 수 있습니다. 대부분의 경우 'activate_plugins' 는 관리자에게만 필요한 것입니다.

관리자와 편집자 모두가 작업을 수행할 수 있도록 하려면 'edit_pages' 기능을 테스트해야 합니다.

7. 링크에 rel=”noopener” 또는 rel=”noreferrer” 추가

외부 리소스에 연결하는 것은 매우 일반적이며 해당 링크에 target="_blank" 를 추가하는 구식 방법은 사용자가 플러그인/테마 페이지를 떠나는 것을 원하지 않기 때문에 의미가 있습니다.

그러나 이것은 Tabnabbing이라고 불리는 것을 열어줍니다. 이것은 악성 JavaScript 코드가 JavaScript window.opener 기능을 남용하여 사용자의 정보를 훔칠 수 있는 보안 문제입니다.

이를 방지하는 것은 링크에 rel="noopener" 를 추가하는 것만큼 간단할 수 있습니다. 오늘 링크한 페이지는 괜찮을지 모르지만 미래에는 바뀔 수 있습니다.

rel=noopener 는 링크된 페이지가 정보에 액세스하거나 페이지를 제어할 수 없음을 의미합니다.

rel=noreferrer 는 동일한 작업을 수행하며, 또한 Referrer 헤더를 통해 참조 정보를 전달하지 않도록 브라우저에 지시합니다. rel="noreferrer" 를 추가하면 링크하는 페이지가 방문자의 출처를 알지 못합니다.

참고: 이 두 속성은 SEO와 관련된 rel=nofollow 와 혼동되어서는 안 됩니다.

8. 타사 API와 함께 HTTPS 및 보안 토큰 사용

개발자는 종종 API를 통합해야 하며, 이 작업을 안전하게 수행하여 주고받는 데이터를 보호하는 것이 중요합니다.

다행히도 이를 안전하게 수행하는 방법에 대한 표준이 이미 설정되어 있습니다. 그 중 하나는 HTTPS입니다. HTTPS를 사용하면 전송되는 모든 데이터가 암호화되는 보안 계층이 도입됩니다.

그러나 데이터를 감시하는 눈으로부터 보호하려면 HTTPS를 사용하는 것만으로는 충분하지 않습니다.

Ars Technica의 이 기사에서 설명하는 것처럼 "HTTPS는 데이터가 안전하다는 의미가 아니라 연결이 안전하다는 의미입니다."

보안 토큰 – JWT

통신 및 API 통합을 처리하는 보안 표준은 JWT인 JSON 웹 토큰을 사용하는 것입니다.

보안 토큰은 사용자의 로그인 세부 정보를 확인하고 사용자 이름, ID 등과 같은 데이터를 포함하는 작은 문자열인 토큰을 생성하는 서버에 요청을 보내 생성됩니다.

후속 요청을 서버에 보낼 때 해당 토큰을 요청에 포함합니다. 이 토큰은 귀하가 인증되었으며 액세스 권한이 있음을 증명합니다. 토큰이 유효하고 만료되지 않은 경우 서버는 토큰에 포함된 사용자 세부 정보를 사용하고 요청된 데이터를 가져옵니다.

데이터 처리를 결정하기 전에 해당 키를 통해 사용자를 조회해야 하는 API 키를 사용하는 것과 비교하여 서버는 이러한 방식으로 요청을 빠르게 처리할 수 있습니다. 토큰을 사용하여 토큰 내부에 사용자에 대한 데이터를 포함하고 여러 데이터베이스 쿼리를 저장할 수 있습니다.

보안 토큰이 생성되고 사용되는 방식으로 가짜 토큰을 생성하거나 토큰의 내용을 조작하는 것은 불가능합니다. 플랫폼 뒤에 있는 회사가 잘 숨길 수 있는 비밀 키를 알아야만 유효한 토큰을 생성할 수 있습니다.

기억해야 할 매우 중요한 점은 토큰 내부의 데이터는 암호화되지 않는다는 것입니다. 토큰 내용을 무효화하지 않고 변조하는 것은 불가능하지만, 토큰 내부의 데이터는 누구나 쉽게 읽을 수 있으므로 민감한 데이터를 저장하기에 좋은 장소가 아닙니다.

토큰과 토큰 작동 방식에 대해 자세히 알아보려면 JSON 웹 토큰 소개를 참조하세요.

9. CDN의 외부 라이브러리를 사용하지 마십시오.

cdnjs.com 또는 기타 무료 글로벌 CDN을 통해 필요할 수 있는 라이브러리를 포함하고 싶을 수 있지만 몇 가지 단점이 있습니다.

우선, 포함하는 파일에 몰래 들어가는 라이브러리와 악성 코드를 제어할 수 없습니다.

CDN은 정의상 일반적으로 안정적이고 빠르지만 더 많은 공격을 받기도 합니다. 코드가 공격을 받고 있는 CDN의 JS 라이브러리에 의존하는 경우 플러그인과 테마가 매우 느리게 로드되거나 전혀 로드되지 않습니다.

이 문제는 당시 플러그인이 사용하고 있던 공개 CDN이 일부 지역의 사용자에게 시간 초과되어 인터페이스를 사용할 수 없게 만드는 고객 웹 사이트에서 발생했습니다. 결국 빠른 수정 대신 JS 스크립트의 로컬 복사본을 사용하도록 플러그인을 변경해야 했습니다.

외부 타사 소스를 사용하는 것도 개인 정보를 손상시킬 수 있습니다. CDN은 모든 사용자 IP를 기록할 수 있습니다. GDPR 정책을 확인하고 고객에게 알려야 합니다.

일반적으로 평판이 좋은 타사 CDN 공급자를 사용하면 문제가 발생하지 않지만 가장 간단하고 안정적인 방법은 제품에 포함된 JS 라이브러리를 배포하는 것입니다.

알고 계셨나요? WordPress에는 여러 JS 라이브러리가 포함되어 있습니다. 사용하려는 일반적인 JS 라이브러리 중 상당수가 WordPress에 포함되어 있습니다. 이 라이브러리는 대부분의 기본 요구 사항을 다룹니다.

개발자 팁: 필요한 특정 페이지에만 추가 JS 및 CSS 파일을 로드하세요. 개발자이자 사용자로서 저는 모든 페이지에 불필요한 JS 및 CSS 파일을 로드하여 관리자 속도를 늦추는 플러그인을 매우 싫어합니다. 다른 관리 페이지의 속도를 늦출 뿐만 아니라 시각적 레이아웃을 엉망으로 만들고 일부 관리 페이지를 거의 사용할 수 없게 만들 수도 있습니다. 제발

코드를 보호하는 데 도움이 되는 몇 가지 도구도 있으며 무료로 사용할 수 있는 훌륭한 도구는 Coderisk입니다.

고용이다
수석 PHP 개발자
Freemius 제품, 서비스 및 API의 핵심을 구축하고 WordPress 플러그인 및 테마 비즈니스에 대한 직접적인 영향을 확인하십시오.
전자상거래 마이그레이션 전문가
Freemius로 판매를 시작하는 플러그인 및 테마 비즈니스를 위한 라이선스 마이그레이션 및 제품 통합 프로세스를 관리합니다.
콘텐츠 마케터
플러그인 및 테마를 판매하는 가장 좋은 방법에 대한 실행 가능한 서면, 시각 및 오디오 콘텐츠를 통해 지식을 공유하십시오.

10. 도구와 서비스를 사용하여 코드 분석

코드리스크

코드 문제를 식별하는 데 도움이 되는 많은 자동화된 서비스가 있습니다. Exakat, SonarSource 및 PHPStan을 예로 들 수 있으며 제가 즐겨 사용하는 Coderisk.com은 코드에서 보다 명백한 보안 오류를 쉽게 찾을 수 있는 방법입니다.

이 회사는 공개 WordPress.org 저장소에서 모든 WordPress 플러그인을 검색합니다. 그들의 소프트웨어는 다양한 코딩 표준을 기반으로 수백 가지 보안 문제를 스캔하고 식별할 수 있습니다.

자체 통계에 따르면 지금까지 40억 줄 이상의 공개 코드를 스캔했으며 상위 플러그인에도 상당한 문제가 있습니다.

무료 서비스에 가입하는 것은 매우 간단합니다. 무료 계정을 만든 다음 플러그인 청구를 시작할 수 있습니다. 플러그인을 요청하는 것은 다음 번에 새 버전을 배포할 때 readme.txt에 넣는 한 줄의 코드를 사용하는 것만큼 간단합니다.

이를 통해 플러그인의 최신 스캔에 액세스할 수 있으며 내부에는 코드에 대한 직접 링크와 함께 각 문제에 대한 특정 정보와 세부 정보가 있습니다.

Coderisk 보안 대시보드

이것은 무료 서비스이므로 플러그인 스캔을 자주 업데이트하지 않을 수 있지만 알림을 받으면 마지막으로 검토한 이후에 실수를 도입했을 수 있으므로 코드를 확인할 가치가 있습니다. 당신의 코드.

인터페이스는 일단 익숙해지면 탐색하기가 매우 쉽고 시스템은 매우 유용하여 오류를 추적하는 데 도움이 되는 잘못된 내용에 대한 지침을 매우 쉽게 이해할 수 있습니다.

버그를 필터링하는 방법도 많이 있으며, 각 문제를 수정된 것으로 표시하거나 모든 문제에 대한 개요를 빠르게 얻는 데 도움이 되는 기타 여러 옵션을 지정할 수 있습니다.

참고: 코드에서 Coderisk(또는 해당 범주의 다른 도구)를 실행한 적이 없다면 경고를 받을 의심되는 문제의 수에 대해 걱정하지 마십시오. 이러한 도구는 비즈니스 논리를 이해하지 않고 코드만 분석하기 때문에 많은 양의 오탐을 생성할 수 있습니다. 도구의 출력을 검토할 항목의 확실한 시작 목록으로 사용하십시오.

PHP_CodeSniffer

코드를 확인하는 또 다른 훌륭한 도구는 PHP_CodeSniffer입니다. PHPCS는 코드를 확인하고 오류를 보고하는 PHPCS와 PHPCS가 식별하는 광범위한 문제를 자동으로 수정할 수 있는 PHPCBF의 두 가지 스크립트로 구성됩니다.

PHPCS를 설치하면 명령줄에서 사용하기가 매우 쉽습니다. 이 도구는 코드에 나타나는 보안 문제를 방지하지는 않지만 더 큰 문제를 남용하기 어렵게 만드는 간단한 코딩 실수를 제거할 수 있습니다.

또한 PHPCS를 Sublime Text 및 Visual Code와 같은 편집기에 직접 통합할 수도 있습니다. 이렇게 하면 실수를 쉽게 확인하고 IDE에서 빠르게 수정할 수 있습니다.

팀으로 작업하든 단일 개발자로 작업하든 관계없이 자동화 시스템을 사용하면 놓칠 수 있는 기본적인 보안 문제를 쉽게 제거할 수 있으므로 가치가 있습니다.

자동화된 시스템을 사용하여 코드에서 보안 문제를 검사하는 것은 모든 버그를 잡는 안전한 방법은 아니지만 가장 명백한 실수를 찾아내는 데 도움이 될 수 있습니다.

11. 적절한 검토 없이 웹에서 코드를 복사하여 붙여넣지 마십시오.

WP 제품을 가능한 한 안전하게 유지하는 것은 일시적인 것이 아니라 지속적인 프로세스여야 합니다. 새로운 기능을 도입하거나 코드를 제거할 때 새로운 보안 문제도 발생할 수 있습니다.

Google이 항상 당신의 친구는 아닙니다. 개발자로서 당신은 영감을 주는 코드 예제를 찾기 위해 인터넷을 확인하는 데 익숙합니다.

인터넷에서 찾을 수 있는 대부분의 코드는 안전한 프로덕션 환경에서 사용할 준비가 거의 되어 있지 않으며 수정하려는 코딩 문제의 예를 의미합니다. 이러한 코드 조각을 검토 없이 맹목적으로 사용하면 문제가 매우 빠르게 발생할 수 있습니다.

WordPress 개발자로서 해야 할 일이 많고 수천 개의 설치로 플러그인의 긴급 보안 문제를 수정하는 것은 그 중 하나가 되어서는 안 됩니다.

당신의 평판이 위험하다는 것을 명심하십시오

플러그인이나 테마 보안에 주의를 기울이지 않으면 사용자, 사용자의 비즈니스, 비즈니스 및 평판이 위험에 처하게 됩니다. 그것은 잠재적으로 많은 시간과 돈을 낭비할 수 있습니다!

보안 취약점은 고객이 브랜드 또는 제품에 부여하는 신뢰와 확신에 막대한 영향을 미칠 수 있습니다. 위의 Loginizer 예제는 가장 당혹스러운 보안 취약점조차도 보안 플러그인 개발자 자신에게 발생할 수 있음을 보여줍니다! 그리고 유권자 사기 및 정부 해킹에 대한 다른 예는 누구나 취약하다는 것을 알려줍니다.

취약점을 발견한 경우 신속하게 조치를 취하여 해결하고 수정 사항 릴리스와 함께 문제를 공개적으로(필요한 경우) 발표하기 위한 모범 사례를 따르십시오.

취약성으로 인해 발생할 수 있는 커뮤니케이션 및 "홍보" 문제와 관련하여 게임보다 앞서 있으면 몇 가지 큰 골칫거리를 피하고 평판을 손상시키는 대신 평판을 높일 수 있습니다.

읽어 주셔서 감사합니다!

처음부터 무엇을 찾아야 할지 모를 때 해야 할 모든 일을 조사하는 것은 어려울 수 있으며 올바른 정보를 찾기 어려울 수 있습니다. 어디서부터 시작해야 할지 모르겠다면 WP 보안 전문가에게 제품 검토를 받는 것을 고려해야 합니다(저도 보안 검토를 수행합니다).

보안 검토를 위한 시간이나 비용을 절약하고 싶은 마음이 들지만, 제품을 최대한 보호하지 않는 비용은 장기적으로 훨씬 더 높을 수 있습니다.

이는 WordPress 제품이 남용되지 않도록 보호할 수 있고 보호해야 하는 방법 중 일부일 뿐입니다. 의심이 가는 경우 기억하십시오 – 아무도 믿지 마십시오