wpdb 준비를 사용해야합니까?


28

나는 SQL을 처음 사용 wpdb->prepare하고 내가 만든 테이블에 다음 쿼리에 사용 해야하는지 궁금합니다.

global $wpdb;
$tablename = $wpdb->prefix . "my_custom_table";
$sql = "SELECT * FROM " . $tablename . " ORDER BY date_created DESC";
$resulst = $wpdb->get_results( $sql , ARRAY_A );

prepare여기서 사용해야 합니까? 어떻게해야합니까?

건배

답변:


33

항상 사용하는 prepare것이 가장 좋지만 주된 용도는 SQL 주입 공격을 방지하는 것입니다. 사용자 / 방문자의 입력이 없거나 쿼리에 영향을 줄 수 없으므로 현재 예제에서는 문제가되지 않습니다.

그러나 내가 그것을 사용하는 것이 가장 좋은 연습 전에 전에 말했듯이 일단 사용을 시작하면 멈추지 않으므로 예제에서는 다음과 같이 사용할 수 있습니다.

global $wpdb;
$tablename = $wpdb->prefix . "my_custom_table";
$sql = $wpdb->prepare( "SELECT * FROM %s ORDER BY date_created DESC",$tablename );
$results = $wpdb->get_results( $sql , ARRAY_A );

코덱 을 사용하는 방법에 대한 자세한 내용은


안녕하세요 @ Bainternet, 명확한 설명에 감사드립니다-어떤 이유로 든 코드를 시도하면 빈 배열이 반환됩니다. 오타가 있는지 확인하고 두 배로 확인했습니다. 준비되지 않은 쿼리를 수행하면 배열을 얻습니다. 왜 작동하지 않는지 모르겠습니다 ..!
Richard Sweeney

이상한. 다른 쿼리와 동일한 코드를 사용해 보았습니다. $tablename = $wpdb->prefix . "my_custom_table"; $concert_id = 1; $sql = "SELECT * FROM " . $tablename . " WHERE concert_id = %d LIMIT 1;"; $prep_sql = $wpdb->prepare( $sql, $concert_id ); $get_concerts = $wpdb->get_results( $prep_sql , ARRAY_A ); 그리고 훌륭하게 작동합니다! 왜 그런지 잘 모르겠습니다. 그러나 나는 어쨌든 지금 그것을 얻는다!
Richard Sweeney

6
작은 따옴표로 테이블 이름묶으면 작동하지 않습니다. 정상적인 이스케이프 처리는 백틱으로 이루어 지므로 쿼리는 다음과 같이 보입니다 SELECT * FROM `wp_my_custom_table`. 큰 따옴표 지원을 사용할 수 있지만 다음과 같이 표시되어야합니다 SELECT * FROM "wp_my_custom_table".
Jan Fabry

3
이 답변에 동의하지 않습니다. 함수가 이미 모든 것을 벗어날 때 왜 탈출해야합니까? Wordpress가 코어에서 이스케이프를 제거하기로 결정할 것이라고 생각하십니까? 또한 하드 코딩되어 있고 괜찮다는 것을 알고 있기 때문에 테이블 이름을 이스케이프 할 점이 없습니다. :) 나는 이것이 단지 예일 뿐이지 만 어쨌든 테이블 이름을 이스케이프하지 않습니다. 테이블 이름으로 준비를 사용할 때 백틱 및 SQL 트로 오류가 추가됩니다.
Tommixoft

@Tommixoft 대답을 다시 읽으면 실제로 내가 말한 것과 같은 말을하고 테이블 이름이 예임을 알 수 있습니다.
Bainternet

0

당신이 준비를 사용하면 SQL 주입 취약점으로부터 코드를 보호합니다.

다음은 사용하기 위해 수정해야하는 코드입니다 prepare().

global $wpdb;
$tablename = $wpdb->prefix . "my_custom_table";
$sql = $wpdb->prepare( "SELECT * FROM {$tablename} ORDER BY date_created DESC");
$resulst = $wpdb->get_results( $sql , ARRAY_A );

0

귀하의 경우 가능한 SQL 주입 공격 입니다. 게시, 가져 오기, 요청, 쿠키와 같은 사용자 입력을 사용하지 않으므로 코드에 추가 보호가 필요하지 않습니다.

서버 리소스를 절약 할 필요가없는 경우 복잡한 기능을 사용하지 마십시오.

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