데이터 유효성 검사 / 음화에 대한 플러그인의 컨텍스트는 무엇입니까?


17

데이터베이스에 들어가기 전에 그리고 브라우저로 출력하기 전에 플러그인 / 테마의 모든 데이터가 안전하게 처리되도록하고 싶습니다. 내 문제는 포스트 메타 필드를 저장할 때와 같이 API가 사용자를 위해 위생 처리를 처리하는 상황과 사용자 정의 설정을 저장할 때와 같이 플러그인 / 테마 작성자가 전적으로 책임을지는 상황이 있다는 것입니다.

이 질문의 범위에서, 나는 도메인 수준에서 데이터의 유효성을 검사하는 것에 대해 걱정하지 않습니다. 예를 들어 폼의 Age 필드가 0에서 120 사이인지 또는 전자 메일 주소가 유효한지 확인합니다. 데이터베이스에 저장할 때 SQL 주입을 피하기 위해 SQL 쿼리를 이스케이프 처리하거나 XSS를 피하기 위해 HTML 템플릿으로 출력되는 데이터를 삭제하는 등 보안에만 관심이 있습니다.

출력 위생, 나는 당신이 항상 같은 기능을 사용할 필요가 있음을 알고 esc_html()esc_attr()HTML 템플릿에 변수를 echo'ing 때. 그러나 템플릿 태그를 사용하는 경우는 어떻습니까? 그들은 모두 이미 출력을 위생 처리합니까? 그렇다면 어떤 컨텍스트 (일반 HTML, 태그 속성 등)에 대한 것입니까? 일부 함수에는 서로 다른 컨텍스트에 대한 변형이 the_title_attribute()있지만 (예 : 대부분)

입력 삭제를 위해 $wpdb->prepare()수동 쿼리를 작성할 때 사용해야 하지만, 설정 API를 사용하여 플러그인 설정 페이지를 만들거나 사용자 정의 게시물 유형에 대한 게시물 메타 필드를 저장하는 경우는 어떻습니까?

지금은 함수를 사용하여 위생 상태인지 여부를 확인할 때마다 Core를 읽고 자습서를 읽었지만 오류가 발생하기 쉽고 시간이 많이 걸립니다. 가능한 모든 상황과 API가 처리하는지 여부에 대한 포괄적 인 목록을 찾고 싶습니다. 예를 들어

API 검증 / 위생

  • 로 게시물 메타 저장 update_postmeta()
  • 로 사용자 메타 저장 update_user_meta()
  • 게시물 제목 출력-상황에 맞는 변형을 사용하십시오. the_title()
  • 기타

수동으로 유효성 검사 / 위생 처리해야합니다

  • 설정 API를 사용하여 플러그인 옵션 저장 의 세 번째 매개 변수로 콜백을 전달합니다 register_setting().
  • 직접 데이터베이스 쿼리 :에서 쿼리를 래핑하십시오 $wpdb->prepare().
  • HTML로 변수 출력. 사용 esc_attr(), esc_html()
  • 기타

또한 API가 특정 상황에서 API를 제공하는 이유를 이해하지만 다른 상황에서는 이해하지 못합니다. 데이터의 알 수없는 특성과 관련이 있다고 가정하지만 철저한 설명을 듣고 싶습니다.


나는이 질문을 좋아한다. 나는 당신과 같은 생각을 가지고 있습니다. 수동으로 유효성 검사 / 위생 처리해야 할 때와 같은 목록이 있다면 좋을 것 같습니다. +1.
Anh Tran

1
@Rilwis, 내 대답을 참조하십시오. 항상 확인해야합니다. '안전'은 상황에 따라 다르므로 위생은 더 까다 롭습니다. 일반적으로 워드 프레스 알려진 데이터 워드 프레스 API (사용하는 경우 the_title(), the_permalink()등) 당신은 잘하지만 사용자 정의 데이터를 사용하면 (예를하지 않습니다 get_post_meta()). 의심 스러우면 스스로를 소독하십시오 . 아프지 않습니다.
Stephen Harris

@StephenHarris : 귀하의 의견을 읽었습니다. 나도 알아 그러나 Ian Dunn과 같은 의견이 있습니다. 그가 요구하는 주된 이유는 "충분히, 더 이상, 더 적게"하는 것입니다.
Anh Tran

1
실제로주의를 기울이고 너무 많은 유효성 검사 / 위생을하는 것은 중요하지 않지만 물건을 두 번 탈출하는 것이 문제가 될 수 있다고 생각합니다.
Ian Dunn

답변:


15

여기에는 두 가지 개념이 있습니다.

  • 유효성 검사-데이터가 유효한지 확인하십시오 ( 예 : 정수는 정수, 날짜는 날짜 (올바른 형식 등) 임). 데이터를 저장하기 직전에 수행해야합니다.
  • sanitisation- 현재 컨텍스트에서 날짜를 안전하게 사용할 수 있도록합니다 (예 : SQL 쿼리 이스케이프 또는 출력시 HTML 이스케이프).

검증은 거의 전적으로 귀하에게 달려 있습니다 . 사용자에게 어떤 데이터를 요구하는지, 어떤 데이터를 기대하는지 알고 있습니다. 워드 프레스는 그렇지 않습니다. 예를 들어 save_post를 사용하여 데이터베이스에 저장하기 전에 후크 에서 유효성 검사를 수행 update_post_meta하거나 설정 API에서 콜백 함수를 지정하여 수행 할 수 있습니다 (워드 프레스가 데이터를 저장하기 직전에 호출 됨).

위생은 조금 더 혼합되어 있습니다. WordPress가 기본적으로 알고있는 데이터 (예 : 게시물 타일)를 처리 할 때 WordPress가 이미 데이터를 안전하게 만들었 음을 확신 할 수 있습니다. 그러나 '안전'은 상황에 따라 다릅니다. 페이지에서 사용하기에 안전한 것은 반드시 요소 속성으로서 안전하지는 않습니다. 다른 컨텍스트 (예를 들어, 따라서 워드 프레스는 다른 기능이있을 것이다 the_title(), the_title_rss(), the_title_attribute()-) 당신이 바로 하나를 사용할 필요가 있도록 .

대부분의 경우 플러그인은 메타 게시 또는 사용자 정의 테이블의 이벤트 데이터를 처리 할 수 ​​있습니다. 워드 프레스는이 데이터가 무엇인지 또는 무엇을위한 것인지 알지 못하므로 안전하게 만드는 방법을 모릅니다. 이것은 당신에게 달려 있습니다 . 이렇게하여 특히 중요하다 esc_url(), esc_attr(), esc_textarea()삽입 코드 할 수있는 악성 입력을 방지하는 등. WordPress는 next_posts()URL을 페이지에 인쇄한다고 가정하기 때문에 URL에 적용 esc_url()하지만 포스트 메타에서는 URL 또는 URL로 저장하려는 것을 알지 못합니다 (인쇄하는 esc_url()경우 리디렉션하는 경우) esc_url_raw(). 도넛에 빠진 경우-주의를 기울이고 자신을 피하십시오 -가능한 한 늦게 수행하십시오.

마지막으로-데이터 저장은 어떻습니까? 그럼 안전하게해야합니까? 마찬가지로 당신이 언급 할 수 있는지 데이터가 유효해야합니다. 그러나 워드 프레스 API (사용하는 경우 wp_insert_post(), update_post_meta()다음 데이터를 살균 할 필요가 없습니다 등) - 데이터를 저장할 때 때문에 단지 당신이 일을 할 필요가 살균하는 SQL 문을 탈출하는 것입니다 - 그리고 워드 프레스는이 작업을 수행합니다. 직접 SQL 문 (예 : 사용자 정의 테이블에서 데이터 읽기 / 쓰기)을 실행하는 경우 $wpdb클래스를 사용 하여 쿼리를 삭제해야합니다.

나는 당신이 도움이 될 수있는 데이터 위생 및 유효성 검사에 대한블로그 게시물을 썼습니다 .이 점에서 당신에게 기대되는 것에 대해 이야기합니다.


스테판, 설명해 주셔서 감사합니다. 그것은 조금 더 잘 이해하는 데 도움이되었지만 실제로 찾고있는 것은 내가 제시 한 예와 같은 일종의 포괄적 인 목록입니다. 당신의 접근 방식은 WP가 그것을 처리하는지의 여부를 교육받은 추측으로 만들거나주의 측면에서 실수하고 항상 위생 처리하는 것 같습니다. 내가 이해 한 것에 의존하기보다는 권위 있고 포괄적 인 목록을 가지고 있다면 그것에 대해 더 자신감이 생길 것이다. 또한 이중 이스케이프가 문제를 일으킬 수 있다고 걱정합니다.
Ian Dunn

또한 몇 가지 사항을 명확히하기 위해 질문을 업데이트했습니다.
Ian Dunn

0

확실하지는 않지만 플러그인이나 테마를 사용하면 사용자 입력을 소독해야합니다. 데이터베이스 조작은 $ wpdb-> 메소드를 사용하여 수행해야합니다. 모든 $ _GET 및 $ _POST 데이터를 삭제해야합니다.

이것은 WordPress보다 PHP 프로그래밍에 가장 좋습니다.

결론적으로 WordPress 기능이 있으면 변수를 사용하지 않고 직접 입력하십시오.

내가 너무 모호한 경우 더 구체적인 질문을하십시오.


3
나는 항상 소독해야한다는 것을 이해하지만 문제는 각 특정 상황에서 누가 소독을 수행하는지에 관한 것입니다. 때로는 WordPress에서 자동으로 수행하며 때로는 수동으로 수행해야합니다. 더 명확하게하기 위해 질문을 업데이트했습니다.
Ian Dunn

update_user_meta ()를 사용하는 경우에도 업데이트 된 값은 노출 된 양식 또는 사용자 입력에서 올 수 있으므로 여전히 유효성을 검증해야합니다. 내부 결정과 같은 스크립트, if / else 루프에서 오는 값이면 소독하지 않아야합니다.
Ciprian

1
당신이 전달하는 값은하기 update_user_meta()를 통해 전달되는 stripslashes_deep()sanitize_meta()에서 update_metadata(), 다음 $wpdb->prepare()에서 $wpdb->update(). 그래서 나는 당신이 그것을 소독해야한다고 생각하지 않습니다. 뭔가 빠졌습니까?
Ian Dunn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.