WordPress 플러그인 및 테마에 대한 보안 모범 사례는 무엇입니까? [닫은]


22

이 질문에서 제안한 것처럼 플러그인 / 테마 보안에 대한 모범 사례에 관한 커뮤니티 토론 / 투표를 위해이 주제를 새로운 질문으로 추가하고 있습니다.

테마를 검토하는 데 사용되는 현재 (진행중인) 설정 / 데이터 보안 검사 목록을 기반으로하는 시작 점검 목록은 다음과 같습니다 (테마의 경우와 플러그인의 원칙이 다르지 않아야 함).

안전하고 확실하게 코딩 된 테마 설정 페이지가있는 테마를 체크 아웃하려면 다음 테마를 확인하십시오.
http://wordpress.org/extend/themes/coraline


적절한 권한을 가진 사람이 이것을 커뮤니티 위키로 만드는 것이 마음에 들지 않는다면?
— Chip Bennett

위키 모드에서 질문을 받으려면 mod가 질문에 적절하게 태그를
— 달아야합니다

코랄 린의 특별한 점은 무엇입니까? Imo에 들어갈 수있는 방법이 여전히 있습니다. 나는 다음과 같이 anons A를 연결하는 것이 좋습니다 : wordpress.stackexchange.com/questions/13539/…
— kaiser

Coraline에는 특별한 것이 없습니다. 테마를 검토 할 때 현재 테마 개발자에게 지적한 것은 단순한 보안 관련 테마 검토를 많이 수행 한 Justin Tadlock의 예제이기 때문입니다. 나는 좋은 예로써 Oenology도 제공하지만, 나 자신의 테마를 포주하려고 시도하는 것을 원하지 않습니다. :)
— Chip Bennett

답변:



12

데이터 살균, 검증 및 이스케이프

프론트 엔드와 백엔드 모두에서 데이터베이스에 출입 할 수있는 모든 것을 살균하십시오!

플러그인 및 테마는 적절한 데이터 유효성 검사를 수행해야합니다.

  1. 데이터베이스에 데이터를 입력하기 전에 신뢰할 수없는 모든 데이터의 유효성 검사 및 삭제
  2. 설정 양식 필드에 출력하기 전에 신뢰할 수없는 모든 데이터를 이스케이프 처리
  3. 테마 템플릿 파일로 출력하기 전에 신뢰할 수없는 모든 데이터를 이스케이프 처리

플러그인 및 테마는 esc_attr()텍스트 입력 및 esc_html()/ 또는 esc_textarea()텍스트 영역에 사용해야 합니다.

WordPress API esc_url()에서도 esc_url_raw(), esc_js()및을 사용할 수 있습니다 wp_filter_kses().

나쁜 예 :

<?php $url = 'javascript:pwnd()'; ?>
<a href="<?php echo $url; ?>">anchor</a>

좋은 예 :

<a href="<?php echo esc_url($url); ?>">anchor</a>

다음은 이스케이프 기능의 사용법을 설명하는 Mark Jaquith의 훌륭한 비디오입니다.


3
도중에
— 소독

9

더 나은 API를 사용할 수없는 경우에만 $ _GET / $ _POST / $ _REQUEST 만 사용하십시오.

플러그인 및 테마 얻을 및 양식 입력 데이터를 저장하는 대신에 의존하려면 설정 API를 사용해야 $_POST하고 $_REQUEST직접 데이터.


3
항상 $ _POST, $ _REQUEST 및 $ _GET을 안전하지 않은 것으로 취급하십시오. 해당 배열의 값을 삭제하고 허용하고 자신의 변수에 넣습니다. 사용자로부터 오는 값을 위생 처리하지 말고 다시 $ _POST에 넣습니다.
— goldenapples

2
사용해야하는 키가 적절한 배열로 설정되어 있는지 항상 확인하십시오. isset () is your friend :)
— mfields

9

용도 $wpdb->prepare

$wpdb개체 를 통해 사용자 지정 쿼리를 $wpdb->prepare작성할 때는 mysql_*패밀리 함수가 모든 사람을 잘못 가르쳤 기 때문에 SQL 코드와 혼합 된 데이터로 쿼리를 작성하는 대신 항상 자리 표시자를 값으로 채우십시오 .


$wpdb->prepare입니다 하지 준비된 명령문과 동일.
— hakre

8

악성 코드를 실행하는 데 사용될 수있는 PHP 기능에주의하십시오

PHP를 작성하는 사람이라면 누구나 읽을 수 있습니다. StackOverflow의 취약성 PHP 함수

사용 테마 수정 API

테마는 자체 발명 된 이름 체계가 아닌set_theme_mod() 관련 기능을 사용해야합니다 . theme_mod API는 설정 API를위한 특수화 된 계층입니다. 고유 한 이름을 보장하고 모든 옵션을 하나의 배열 로 푸시하며 경험상 훨씬 쉽게 처리 할 수 ​​있습니다. 또한 플러그인에 대한 표준화 된 필터를 제공하므로 상호 운용성이 좋습니다.

사용하지 마십시오 register_globals

에 의존하지 마십시오 register_globals = on. 내 마지막 고객이 구입 한 Pro 테마 는 정확히이 작업을 수행합니다. 5 분
안에이 테마를 사용하는 사이트를 해킹 할 수있었습니다. ThimbThumb도이 작업을 수행했습니다.

불필요한 광범위한 액세스 권한이있는 파일을 만들지 마십시오

너무 자유로운 액세스 권한을 가진 파일을 만들지 마십시오.

가능한 경우 SSL 사용

당신의 포인트 트위터 / 페이스 북 / 뭐든지에서 공유 가능한 경우 HTTPS URI에 대한 링크. 독자의 보안도 중요합니다.


2
당신은에 정교한 set_theme_mod()특히, 방법을 적절하게 설정 API 사용을 함께 결합하는 것이?
— Chip Bennett

@ Chip Bennett 내 답변에 정보를 추가했습니다.
— fuxia

더 작은 답변으로이 미니리스트를 분류 할 수 있습니까? 더 작은 청크로 커뮤니티 위키를 쉽게 관리 할 수 ​​있습니다. TIA
— Rarst

3
칩 : 테마 모드 시스템이 설정 API와 너무 잘 통합되지 않습니다. 조만간 올바른 방법을 설명하는 게시물을 작성하겠습니다.
— Otto

7

단일 배열로 데이터 저장

플러그인 및 테마는 설정 페이지에 여러 옵션을 작성하는 대신 단일 배열로 옵션을 저장해야합니다. 설정 API를 사용하면이를 처리 할 수 ​​있습니다.


6

설정 페이지 추가 및 출력시 적절한 기능 확인

플러그인은 설정 페이지를 추가 할 수있는 적절한 기능 (예 :)을 사용해야합니다 manage_options.

테마는 설정 페이지를 추가하기 edit_theme_options위한 적절한 기능 으로 사용해야 합니다.


1
작지만 중요한 참고 사항 :edit_theme_options 설정 API와 함께 사용할 수는 없지만 manage_options업데이트를 제출하기 위해 옵션 제출이 하드 코딩되어 있습니다. 관련 Trac 티켓은 여기 에서 찾을 수 있습니다 .
— t31os

사실 1) 관리자에게는 영향을 미치지 않는 편집자에게만 영향을 미칩니다. 2) 링크 된 Trac 티켓을 통해 곧 해결 될 수 있기를 바랍니다.
— Chip Bennett

항상 사용자 정의 역할 또는 일반 역할이 edit_theme_options제한 될 가능성이 있습니다. 현재 상태의 설정 API는 manage_options기능 이있는 역할에서만 사용할 수 있다고 지적하는 것이 편리 할 수 ​​있다고 생각했습니다 .
— t31os

5

최신 튜토리얼 및 정보 사용

플러그인 및 테마는 모두 옵션 및 설정 페이지는 의도적으로하고 구현해야 하지 에 의존 복사 및 붙여 넣기 오래된 및 아래에 나열된 것과 같은 적절한 데이터 보안을 포함하지 않습니다되는 웹 사이트 자습서.

하지 말아야 할 것의 예 :


1
나는 정보를 훑어보고 그 앞의 단락을 읽지 않고 링크를 클릭하기 쉽기 때문에 링크가하지 말아야 할 것의 예임을 나타 내기 위해 약간 강조된 텍스트를 추가했습니다. 또한 내가 거기에있는 동안 답변을 조금 더 예쁘게 만들었습니다 ...;)
— t31os

2
이것은 예제 튜토리얼이 잘못하거나 오래된 방식으로 정확히 무엇을하는지 설명 할 수 있습니다.
— Rarst

4

설정 API 사용

플러그인과 테마는 사용하기 쉽고 안전하며 설정 페이지의 많은 노력을 처리하는 설정 API를 사용해야합니다.

설정 API 사용에 대한 유용한 자습서는 다음을 참조하십시오.


설정 API 및 테마 옵션과 관련 하여이 답변에 대한 내 의견을 참조하십시오 .
— t31os

1

체크 박스를 선택 옵션의 경우, 플러그인과 테마가 사용해야 checked()및 selected()출력 기능을 checked="checked"하고 selected="selected"각각.


내가 뭔가를 놓치지 않는 한 실제로 보안 문제는 아닙니다. 여전히 매우 편리하고 사용하기 좋습니다. :)
— Rarst

아마도, 아마도 아닐 수도 있습니다. 동일한 작업을 수행하기위한 많은 사용자 정의 코드를 보았습니다. 더 많은 코드 스파게티 = 보안 위험을 유발할 수있는 더 많은 기회. :)
— Chip Bennett

Bennet-며칠 전에 toscho로 메일을 보내면서-나는 우리 둘 다에게 말할 수 있다고 생각합니다. 가장 간단한 함수는 그 함수보다 읽고 이해하기가 훨씬 쉽습니다. 나는 다운되지는 않지만 이것을지지하지도 않습니다. 이모 이것은 가치를 추가하지 않기 때문에 핵심의 일부가되어서는 안됩니다.
— 카이저

2
그보다 쉽게와 함께 너희들이 해낸 궁금 checked( $theme_options['whatever_option'] )하거나 checked( 'some_value' == $theme_options['whatever_option'] ). 나는 그것이 그것보다 간결 해지는 방법을 모른다?
— 칩 베넷

1

접두사 함수 및 변수 이름

플러그인에는 모든 옵션, 사용자 정의 함수, 사용자 정의 변수 및 사용자 정의 상수 앞에 플러그인 슬러그가 있어야합니다.

테마는 테마-슬러그로 모든 옵션, 사용자 정의 함수, 사용자 정의 변수 및 사용자 정의 상수를 접두어로 사용해야합니다.


post_types 및 taxonomies와 같은 사용자 정의 객체의 이름뿐만 아니라 모든 클래스 이름으로 이것을 확장합니다.
— mfields


0

관리자 메뉴의 해당 섹션에 설정 페이지 추가

플러그인은 최상위 메뉴를 추가하는 대신 add_options_page()플러그인 설정 페이지를 Settings메뉴 에 추가 하는 기능을 사용해야 add_menu_page()합니다.

테마는 최상위 메뉴를 추가하는 데 사용하지 add_theme_page()않고이 기능을 사용하여 테마 설정 페이지를 Appearance메뉴 add_menu_page()에 추가해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.