wpdb-> 삽입 : SQL 인젝션에 대비해야합니까?


14

wpdb-> 삽입 전에 wpdb 준비를 사용해야합니까?

wpdb-> insert를 사용하여 워드 프레스 테이블에 값을 삽입하는 경우 데이터를 삽입하기 전에 데이터를 "정리"해야합니까, 아니면이 메소드 (wpdb-> insert)가이를 수행합니까?

답변:


21

아니요, 데이터를 준비하거나 이스케이프하면 안됩니다 wpdb. 이것은 수업에 의해 수행됩니다 .

로부터 wpdb 클래스 참조 :

데이터 :

(배열) 삽입 할 데이터 (열 => 값 쌍). $ data 열과 $ data 값은 모두 "raw"여야합니다 (SQL 이스케이프도 아님).

그러나 insert메소드를 사용하지 않고 자신의 SQL을 작성했다면 그렇습니다 prepare.


8
메모를 추가하려면 두 insertupdate그 필요하지 않습니다. 그러나와 함께 사용해야합니다 query.
카이저

1

다음은 wpdb 클래스에 대한 경고입니다.

https://codex.wordpress.org/Class_Reference/wpdb

경고

이 클래스의 일부 함수는 SQL 문을 입력으로 사용합니다. SQL 주입 공격을 방지하려면 SQL 쿼리에 통합 한 신뢰할 수없는 모든 값을 SQL 이스케이프해야합니다. 사용하려는 기능이 SQL을 이스케이프하거나 사전 이스케이프 될 것으로 예상되는지 문서를 확인하십시오.

wpdb 클래스는 자동으로 데이터를 준비하거나 이스케이프하지 않습니다.

코드에서 100 % 데이터 소스를 신뢰할 수 없다면 준비 클래스 (?)를 사용하는 것이 좋습니다.

준비 클래스를 사용하면 준비 클래스를 올바르게 사용하지 않고도 문제를 해결할 것이라고 생각하지 마십시오. 나는 이것에 상당히 익숙하지 않으므로 내가 옳지 않으면 모든 수정 사항을 회신으로 게시하십시오.

$ wpdb-> prepare ( ""표에서 ID = % d AND 이름 = % s ", $ id, $ name);

위의 문장에는 2 가지 추가 속성이 있습니다. 하나는 ID이고 하나는 이름입니다. 내가 읽는 한, 각 항목은 쿼리의 항목 수에 해당합니다. 또한 % s = 문자열, % d = 정수 및 % f = float입니다.

또한 내 독서에서 추가 속성을 넣지 않으면 준비는 실제로 아무것도하지 않습니다. 경고가 표시되지만 끄면 알 수 없을 것입니다.

다음은 준비 클래스를 아래의 INSERT에 추가하는 클래스 참조 자체의 예입니다.

https://codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks

$ wpdb-> query ($ wpdb-> prepare ( "$ wpdb-> postmeta (post_id, meta_key, meta_value)에 삽입 VALUES (% d, % s, % s)", 배열 (10, $ metakey, $ metavalue) ));

내 관심사는 '아무도'참조하지 않은 동일한 페이지에 따라 upvoted 답변이 잘못되었다는 것입니다. 나는 당신이 Prepare ()를 사용한다고 가정하고 있지만,이 답변을 올바르게 취했기 때문에 탈출의 다른 표준 PHP 메소드는 사용하지 않는다고 가정하고 있습니다.

어쨌든 ... 아마도 원래의 대답 이후로 상황이 바뀌었을 것입니다.


흠, 이것은 대답보다 질문처럼 들립니다
Mark Kaplun

허용 된 답변이 맞습니다. $wpdb->insert(), $ wpdb-> update ()` 와 같은 함수를 사용 하거나 $wpdb->delete()데이터는 RAW 여야합니다. 예를 들어 $wpdb->query()SQL 문을 입력으로 전달 하는 경우 신뢰할 수없는 데이터를 이스케이프해야합니다.
nmr

nmr, 나는 지금 이해하고 있다고 생각합니다. 예를 들어 당신이 예제로 사용한 것은 '쿼리 방법'을 사용한 예와는 달리 '삽입 방법과'삭제 방법 '입니다. (% wpdb -> 쿼리). 답변을 삭제합니까? 아니면 떠나?
Felixius

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