데이터 삭제 : 코드 예제가 포함 된 모범 사례


15

WordPress의 보안 테마를 작성하는 데 도움이되는 데이터 삭제 (데이터 유효성 검사 아님)를 이해하려고합니다. 모범 사례를 자세히 설명하는 테마 개발자를위한 포괄적 인 안내서를 찾으려고 인터넷을 검색했습니다. 데이터 유효성 검사라는 제목의 코덱스 페이지를 포함하여 내가 찾은 몇 가지 리소스가 있었지만 나에게 유용한 것은 없었습니다. 코덱스 페이지에는 사용 가능한 살균 기능, 사용법 및 기능이 나열되어 있지만, 왜 다른 위생 기능을 사용하는지 또는 어떤 상황에서 특정 위생 기능을 사용하는지 설명하지 못합니다. 이 게시물의 목적은 모든 사람이 잘못된 / 위생되지 않은 코드의 예를 제공하고 적절한 위생을 위해 코드를 다시 작성하는 방법을 제공하도록 요청하는 것입니다. 이것은 게시물 제목을 삭제하거나 게시물 축소판을 삭제하는 일반 코드 일 수 있습니다.$_POST Ajax 요청에 대한 데이터.

또한 데이터베이스를 추가 / 업데이트하기위한 WordPress 기능 (예 : 아래 코드 블록에 언급 된 기능)이 자동으로 위생 처리 작업을 처리하는지 알고 싶습니다. 그렇다면, 이러한 WordPress 기능으로 전송 된 데이터를 삭제하기 위해 추가 조치를 취할 때 예외가 있습니까?

add_user_meta
update_user_meta
add_post_meta
update_post_meta
//just to name a few

또한 PHP 인라인 HTML과 PHP에서 HTML을 에코 할 때 살균을 다르게 수행해야합니까? 내가 묻는 것을 더 명확하게하기 위해 코드는 다음과 같습니다.

<?php echo '<div class="some-div ' . $another_class . '" data-id="' . $id . '" >' . $text . '</div>'; ?>

<div class="some-div <?php echo $another_class; ?>" data-id="<?php echo $id; ?>"><?php echo $text; ?></div>

위의 진술은 모두 같은 것을 달성합니다. 그러나 그들은 다르게 산물을 가져야합니까?


1
우리가 알고 있다면 그것은 도움이 될 수 있습니다 무엇을 당신이 위생적으로하고있었습니다. 테마는 데이터를 제시하기위한 것입니다. 사용자가 제출 한 데이터 만 삭제하면됩니다. 제출은 일반적으로 플러그인에 의해 처리됩니다.
EAMann

esc_attr, esc_html 등과 같은 @EAMann 이스케이프 기능은 출력을 이스케이프하도록 빌드되었습니다. 내가 틀렸다면 나를 바로 잡으십시오. 데이터 표시는 데이터를 출력한다는 의미이므로 테마 내에서 이스케이프가 필요합니다. 그렇지 않으면 esc 함수가 필요하지 않았을 것입니다. WordPress 테마의 위생 처리를 이해하고 하나 또는 두 개의 코드 조각의 위생 처리에만 국한되지 않습니다.
John

"데이터 표시는 데이터를 출력한다는 의미이므로 테마 내에서도 이스케이프가 필요합니다."-아니요. 다시, 당신은 당신이 신뢰하지 않는 데이터 만
피해야

@OneTrickPony 더 명확 해지고 있습니다. 내가 이것을 이해하고 있음을 절대적으로 확신하기 위해-주석 내용을 이스케이프하지만 주석 ID 또는 게시물 ID를 HTML로 출력하는 경우 이스케이프하지는 않습니다. 죄송합니다. 질문을 계속해서 보내려고합니다.
John

2
"당신은 당신이 믿지 않는 데이터 만 피해야합니다"– 전적으로 동의합니다. ) 내가 추가 거라고있는 유일한 방법은 그 당신이해야 결코 신뢰 데이터입니다
이안 던

답변:


12

코덱스 페이지 는 내가 생각하는 것을 잘 설명합니다.

가장 중요하고 일반적으로 사용되는 기능은 아마도입니다 esc_attr. 이 예제를 보자 :

<a href="<?php print $author_url; ?>" title="<?php print $author_name; ?>"> 
  <?php print $author_name; ?>
</a>

문자 $author_name가 포함되어 있으면 "속성이 닫히고 그 문자 뒤에 오는 경우 onclick="do_something();"악화 될 수 있습니다 :)

그렇게 print esc_attr($author_name)하면 그러한 문자가 인코딩되고 브라우저가하지 말아야 할 일을하지 않습니다.

필요하지 않은 경우가 하나 있습니다. 숫자를 예상 할 때 입력 데이터를 정수로 캐스트 할 수 있습니다. 예를 들면 다음과 같습니다.

print (int)$_POST['some_number'];


여기에 나열된 메타 * 기능은 이미 데이터베이스 스토리지의 입력을 삭제하는 데주의를 기울이므로 걱정할 필요가 없습니다.

wpdb->prepare()당신이 DB를 직접 조회 할 때 방법이 사용되어야한다. 예를 들면 다음과 같습니다.

$sql = $wpdb->prepare('
    UPDATE wp_posts SET post_title = %s WHERE ID = %d', 
      $_POST['title'], $_POST['id']);

$wpdb->query($sql);

%s%d키워드는 당신의 살균 $의 _POST 값으로 대체 얻을 것이다.

WP.org 저장소의 많은 플러그인에서 흔히 볼 수있는 실수는 다음과 같이 이미 준비된 쿼리를 쿼리에 전달하는 것입니다.

$wpdb->prepare('UPDATE wp_posts SET post_title = \''.$_POST['title'].' WHERE ...

이 작업을 수행하지 마십시오 :)

또한 PHP 인라인 HTML과 PHP에서 HTML을 에코 할 때 살균을 다르게 수행해야합니까?

위의 진술은 모두 같은 것을 달성합니다. 그러나 그들은 다르게 산물을 가져야합니까?

아니.


입력을위한 Thx. 당신의 설명은 나를 더 명확하게 만듭니다.
John

약간의 설명이 더 필요합니다. PHP에서 var (예 : $ var = 'string';)에 문자열을 전달하고 HTML 속성으로 에코하면 에코 할 때 $ var를 삭제합니까? 또는 데이터베이스에서 $ var 값을 가져온 경우에만 위생 처리해야합니다.
John

어떤 식 으로든 화면에 에코 할 때
onetrickpony

따라서 PHP 코드 내에서 $ var로 문자열을 전달했거나 데이터베이스에서 데이터를 가져와 $ var로 전달했는지 여부를 올바르게 이해하면 출력을 esc해야합니다. 옳은?
John

예, 예를 들어 댓글 작성자의 이름과 같은 데이터가 사용자 입력 인 경우 "PHP 코드 내에서 문자열을 $ var로 전달했다"는 것은 변수에 알고있는 값을 할당했다는 것을 의미합니다.
onetrickpony

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