wpdb-> insert: preciso me preparar para a injeção de SQL?

14

Preciso usar o wpdb prepare antes de wpdb-> insert?

Se estou inserindo valores em uma tabela wordpress usando wpdb-> insert, preciso "limpar" meus dados antes de inseri-los ou esse método (wpdb-> insert) faz isso por mim?

conservatório
fonte

Respostas:

21

Não, você não deve preparar ou escapar dos dados; isso é feito pela wpdbclasse.

Na referência da classe wpdb :

dados :

(matriz) Dados a serem inseridos (na coluna => pares de valores). As colunas $ data e os valores $ data devem ser "brutos" (nenhum escape de SQL).

Se, no entanto, você estava escrevendo seu próprio SQL em vez de usar o insertmétodo, então sim, você deve escapar do uso prepare.

ninguém
fonte
8
Para adicionar uma nota: Ambos inserte updatenão precisam disso. Mas deve ser usado com query.
precisa
1

A seguir, um aviso para a classe wpdb.

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

Um aviso

Algumas das funções nesta classe usam uma instrução SQL como entrada. Você deve escapar do SQL todos os valores não confiáveis ​​que você incorporar na consulta SQL para impedir ataques de injeção de SQL. Verifique a documentação para ver se a função que você planeja usar escapa do SQL para você ou espera que ela seja pré-escapada.

Então, eu li isso como - a classe wpdb não prepara ou escapa automaticamente os dados para você.

Tenho certeza de que, se você não pode confiar 100% na fonte de dados em seu código, sugiro usar a classe de preparação (?).

Não pense que o uso da classe de preparação o consertará sem o uso adequado da classe de preparação. Eu sou bastante novo nisso, portanto, poste quaisquer correções como resposta, se não estiver certo.

$ wpdb-> prepare ("SELECT * FROM tabela WHERE ID =% d AND nome =% s", $ id, $ nome);

Na declaração acima, existem 2 atributos extras. Um para o ID e um para o nome. Tanto quanto eu li, cada um corresponde ao número de itens em sua consulta. Também% s = string,% d = inteiro e% f = flutuante.

Além disso, pela minha leitura, se você não colocar os atributos extras, o preparo não fará nada. Haverá um aviso, mas se você desligar, talvez não saiba.

Aqui está um exemplo da própria referência de classe em que eles adicionam uma classe de preparação a um INSERT abaixo.

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

$ wpdb-> query ($ wpdb-> prepare ("INSERIR EM $ wpdb-> postmeta (post_id, meta_key, meta_value) VALORES (% d,% s,% s)"), array (10, $ metakey, $ metavalue) ));

Minha preocupação é que a resposta votada esteja incorreta de acordo com a mesma página que 'ninguém' faz referência. Estou assumindo que você usa o prepare (), mas não outros métodos padrão de escape do php, porque eu tomei essa resposta tão correta também ... até que me aprofundou mais.

Enfim ... talvez as coisas tenham mudado desde a resposta original.

Felixius
fonte
hmmm, isso soa mais como uma pergunta do que uma resposta
Mark Kaplun
A resposta aceita está correta. Quando você usa funções como $wpdb->insert(), $ wpdb-> update () `ou $wpdb->delete()dados devem ser RAW. Em uma situação em que você usa, por exemplo, $wpdb->query()e passa a instrução SQL como entrada, você deve escapar de dados não confiáveis.
RMN
RMN, acho que entendo agora. Então, para esclarecer ... para minha sanidade ... o que você usou como exemplo é 'o método de inserção e' o método de exclusão ', em oposição aos exemplos que eu usei usando o' método de consulta '... (% wpdb -> consulta). Eu excluo minha resposta? Ou deixa?
Felixius 29/08/18