web-dev-qa-db-ja.com

wpdb-> insert:SQLインジェクションに備えて準備する必要がありますか?

Wpdb-> insertの前にwpdb prepareを使用する必要がありますか?

Wpdb-> insertを使ってワードプレスのテーブルに値を挿入する場合、それを挿入する前に自分のデータを "きれいにする"必要がありますか。

12
redconservatory

いいえ、データを準備したりエスケープしたりしないでください。これはwpdbクラスによって行われます。

wpdbクラスリファレンスから

データ

(配列)挿入するデータ(列=>値の組)。 $ data列と$ data値はどちらも "raw"である必要があります(どちらもSQLエスケープしないでください)。

ただし、insertメソッドを使用するのではなく独自のSQLを作成していた場合は、prepareを使用してエスケープする必要があります。

18
nobody

以下は、wpdbクラスに関する警告です。

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

警告

このクラスの一部の関数は、入力としてSQL文を受け取ります。 SQLインジェクション攻撃を防ぐために、SQLクエリに組み込むすべての信頼できない値をSQLエスケープする必要があります。ドキュメントを調べて、使用する予定の関数がSQLをエスケープしているのか、それともエスケープされているのかを確認してください。

だから私はこれを読む - wpdbクラスは自動的にあなたのためにデータを準備したりエスケープしたりしない。

コード内のデータソースを100%信頼できない場合は、prepareクラス(?)を使用することをお勧めします。

Prepareクラスを使用しても、prepareクラスを適切に使用しなくてもそれが修正されるとは思わないでください。私はこれにかなり馴染みがないので、私が正しくないならば、どんな修正でも返信として投稿してください。

$ wpdb-> prepare( "SELECT * FROMテーブルWHERE ID =%d AND名前=%s"、$ id、$ name);

上記のステートメントでは、2つの追加属性があります。 1つはID用、もう1つは名前用です。私が読む限りでは、それぞれはあなたの問い合わせの中の項目の数に順に対応しています。 %s =文字列、%d =整数、%f = floatです。

また、私が読んだところで、余分な属性を入れないと、prepareは実際には何もしません。警告が表示されますが、これをオフにした場合は、おそらくわかりません。

以下は、クラス参照自体からの例です。この例では、準備クラスを以下の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)への挿入")、array(10、$ metakey、$ metavalue) ;);

私の懸念は、「誰も」参照していないのと同じページによると、支持された回答が間違っていることです。私はあなたがprepare()を使用しているが他の標準的なphpのエスケープ方法は使用していないと仮定しています。

とにかく…おそらく最初の答えから事態が変わったのでしょう。

0
Felixius
0
oguegbu ijeoma