質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

1258閲覧

$wpdbでの取得は、サニタイズもprepareも自分でやらなければならないのはなぜですか?

marusankakun

総合スコア16

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/01/27 00:37

編集2020/01/27 01:15

###質問
WordPressでデータベースに接続する際に、SQLインジェクション攻撃を防ぐために提供されている関数は「保存、更新、置換」だけで、「取得」がないのはなぜでしょうか?

###「保存、更新、置換」は関数が用意されている
$wpdb->insert
$wpdb->update
$wpdb->replace

など「保存、更新、置換」は、引数に『値と型』を渡せば、サニタイズもprepareも勝手にやってくれますよね。

以下のように『$dataと$format』を渡せば安全に実行されます。

php

1$wpdb->insert( wp_table, $data, $format );

###「取得」は自分で書かないといけない
しかし

$wpdb->get_results
$wpdb->get_col
$wpdb->get_row

など「取得」に関するものたちは、引数が『$query』となっており、自分でサニタイズもprepareもしなければならないようです。

以下のように『prepareを使ったSQL文』を渡さないといけません。さらに値のエスケープも自分で書かないといけないようです。

php

1$wpdb->get_row( $wpdb->prepare("SELECT * FROM wp_table WHERE id = %d", esc_html($id)) );

なぜでしょうか。「取得」も『値と型』を渡すだけで安全にできてくれたっていいだろう、と思うのですが、なぜ「取得」の方はそうなっていないのでしょうか?

この仕様について妥当な理由が知りたいのですが、詳しい方いらっしゃいましたらお願い致します。

###補足
「妥当な理由」といいましたが、「必ずこうだ」というものではなく、「こうではないか」などの推測で十分うれしく思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

なぜでしょうか。「取得」も『値と型』を渡すだけで安全にできてくれたっていいだろう、と思うのですが、なぜ「取得」の方はそうなっていないのでしょうか?

おそらくは歴史的な経緯かと思います。WordPressは昔からあるプロジェクトですので、一度「直接SQL文を渡す」という形にした関数はそのままサポートし続けざるを得なくなってしまいます。

さらに値のエスケープも自分で書かないといけないようです。

こちらは不要ですし不適切です。esc_htmlは書いての通りHTMLのエスケープに使う関数で、prepareの引数に渡す場面では本来不要です(データベースに入れる時点でesc_htmlしてしまっていた場合は、それに合わせるためにesc_htmlせざるを得ないかもしれませんが、それは設計ミスです)。

prepareの引数に渡す値は「値は SQL エスケープしてはいけません。」とドキュメントに明記されています。

投稿2020/01/27 00:43

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marusankakun

2020/01/27 01:17

なるほど、その経緯はありえますね。ありがとうございます。エスケープの件につきましても細やかなご配慮に感謝致します。
guest

0

まず$wpdbのことは忘れたほうがいい。
取得なら他の方法があるし$wpdb使いたいと思ってる時点でどこか使い方を間違えてると思っていい。

$wpdbは複雑なプラグイン作りたいとかWordPress内部のことに詳しい人だけが使うもの。
WordPressには互換のために仕方なく残ってる仕様がものすごく多いので
現代ではWordPressの作り方は参考にしてはいけない。

投稿2020/01/27 01:45

kawax

総合スコア10377

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

WordPress制作者しかその「妥当な理由」を説明できないのでは。
一番詳しいのは作った人です。最も納得できるのは作った人からの説明かと思います。
興味がおありでしたらWordPressのコアソースを追ってみれば良いかと思います。そこで見えてくることもあるでしょう。

ここで回答を求めてもおそらく推測の域を出ないものです。
それで納得されるかどうかは誰にも分かりませんし、「推測」では「妥当な理由」になり得ないと思っています。

投稿2020/01/27 00:42

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問