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.