2017年7月4日火曜日

【注意】WordPress プラグイン「Responsive Lightbox by dFactory」にXSS脆弱性あり(要更新)

JVN#39819446
WordPress 用プラグイン Responsive Lightbox におけるクロスサイトスクリプティングの脆弱性 が出てるよ〜うち入れてたっけ?

という同僚の声が聞こえてきたので、早速先日導入した WP-CLIのエイリアス機能を使って調べてみました。
手持ちのMacマシンから、

  1. ターミナル起動
  2. script check-plugins-wps.txt
  3. wp @all plugin list
  4. exit

で、check-plugins-wps.txt をテキストエディタで開き、lightboxは使われていないことを確認。

  • wp @all plugin list |grep lightbox 

だけでもいけるが、じっくり見たほうが良さげかなぁと思って一度ファイルへプラグインリストを書き出してみた。

プラグインアップデートは、

wp @all  plugin update responsive-lightbox 

をすれば一発でできちゃいますね!
このアップデート状況を保存しておきたければ、 script を使って

script update-responsive-lightbox.txt
wp @all  plugin update responsive-lightbox 
exit

ってしておけば、exitするまでにターミナルに出てくる文字や入力した文字も含めて、 update-responsive-lightbox.txt に保存できるから、後から見直すのが楽です。

もし該当プラグインが入ってなければ、
Warning: The 'responsive-lightbox' plugin could not be found.
Error: No plugins updated.
が出るので一括でやってしまっても問題なし。

便利なエイリアスについては


に纏めてます。

2017年7月4日 @kimipooh

2017年6月30日金曜日

【備忘録】WP-CLI エイリアスを利用したリモートサーバーの WordPress 管理 #wckyoto2017

WordCamp Kyoto 2017 のセッション「WP-CLI入門」で miya0001 氏が、「WP-CLIのエイリアスを使ったら管理楽だよ〜」っておっしゃっていたのをついに実現。そのときのスライドは下記の通り。



発表動画はこちら(wordpress.tv) >>> 

これ知っていたら、バックアップ > プラグイン更新 > コア更新 という一連の流れについてわざわざ独自スクリプト作る必要なかったじゃんって感じですね。

以下前提として、WP-CLI の wpコマンドの最新版が入ってることを前提とします。

準備(パスワード確認をスルーして ssh接続)


2017年6月26日月曜日

WordCamp Kyoto 2017 に参加して #wckyoto2017

今年は職場である京都大学(国際科学イノベーション棟)でやるってことで、実行委員の会場チームに入って会場周りのサポートをしていました。まだ出来て2年ほどしかたっていないこともあり、機能的でバリアフリーでなかなかよいところです。




出町柳から京都大学へ。このまままっすぐ進むと正門に到達します。
会場では京都らしい傘が用意されてました。



大盛り上がり!!


開始直後こそ、パラパラときていた参加者も少し立てば大混雑。
セッションも全部立ち見がでるぐらいだったそうな。



今年のスタッフ Tシャツ


今年のスタッフ Tシャツは、なかなかユニークです。さらに手ぬぐいもありますね!


昼食&懇親会は無料だぜ!


昨年の WordCamp Kansai 2016同様、ランチは無料提供です!
さらに懇親会まで無料。委員長挨拶で、参加者一人当たりにかかった費用は 7000円を超えるということでした。それがすべて無料にできるほどスポンサーも集まり、また参加チケットもあっという間に無くなるぐらいの盛況ぶりでした。



懇親会も賑わってました!


二日目は、カンフォーラにいってステーキカレーを初めて食べました。
ココナッツミルクの入っていないタイカレーみたく辛かったのですが、美味しかったです。

コントリビューターDAY(2日目)


先にコントリビューターDAYの話をします。
コントリビューターDAYへの参加者の約半数が、初めて参加ということに驚きました。


私は当初の予定通り、プラグインチームに入って、自身の公式プラグイン(Google Calendar List View)の利用マニュアルを中心に、問題点の改善に取り組みました。結局、日英のマニュアルを整備できたところで終わりましたが、次の点を改善できました。

コード自体は、帰ってからと翌日かけて修正しました.. よしこれでつかえるぜ〜。

翻訳コードの部分は、変数を入れたらダメ


printf, sprintf などを使って、翻訳コードのための関数(__や_e)に渡す引数は文字にしてしまうこと。。という基本的なことを理解できたのが良かったです。

つまり例を上げると
  • _e ('hogehoge ' . $hogege . ' dayo.',  'hohoho');
なコードはGlotPressでの翻訳をしても適用されないってことです。
  • _e (printf('hogehoge %s dayo.',  $hogege),  'hohoho');

にしろってことですね。
同じく __ をつかう場合には

  • $hoge = __('hogehoge ' . $hogege . ' dayo.',  'hohoho');
ならば
  • $hoge = __(sprintf('hogehoge %s dayo.',  $hogege),  'hohoho');
ってな感じですね。

WordPress Importer でアップロード失敗する問題


プラグインチームの1つの柱として別の人があれこれやっていたら、「それって、ブラウザのタイムアウトなんかの問題じゃない?」ってツッコミが。たしかにいくらサーバーのアップロード制限を緩和したところで、ブラウザのタイムアウトを超えるデータ通信をするとどうにもなりませぬな。。ってことで終了したのでした。。。

あと初めてプラグイン開発をした方が、
  • ギャラリーの挙動変更(スライドさせたり〜)
  • エディタの文字に対して Google検索のサジェスト候補がでてくるようにする
なんてのを開発されていました。後者は申請まで出来たとか!

他のチームの発表をみていると、

WordPress ユーザーズマニュアル
https://wckansai2016.github.io/wordpress-document/

を含めて、皆さんかなり濃密な一日を過ごされたようです。
はしゃいでいる声もすくなく、結構もくもくと作業されているのが印象的でした。
もちろん歓談を楽しんでいた方もいて、全体的によい雰囲気でした!

 WP-CLI入門(の呪い)


一日目ガッツリ聞いたのは、このセッションでした。

ここで話に出てきた、WP-CLIで valet を操作しようでハマってしまい、いつも速攻でブログ書いているのに書けませんでした.. これは、普段 MAMP を対応している筆者に、MAMPはダメダメ〜って miya0001 から何度か言われている筆者への呪いということにしておきましょう (^^;  その後解決〜。

VCCWWP Total Hack でも有名な miya0001 さんが登壇。WP-CLIでもかなり貢献されています。WP-CLIは、WordPress をコマンドラインで自由自在に操作できる、インフラを含む WordPress 管理者によっては、WP-CLIは救世主ツールです。

筆者も、バックアップ → プラグイン更新 → コア更新 → 言語更新 という一連の流れを WP-CLIで実装したり、WordPressの新規構築の初期設定を一括処理するときにも重宝超重宝しています。ただ、細かい機能については追っていなかったので、ここで話をお聞き出来たのはよかったです。

ここでは備忘録として残しておきたいものをメモしておきます。

WP-CLI で valet を操作しよう!


ズボラな筆者は、MAMPばっかり使っては miya0001 さんに突っ込まれたりしてましたが、そろそろ環境を変えてみようかなということで、valet を使って見ることに。

valet インストール と W-CLI連携


MacOS Sierra な環境では
  1. Homebrew の導入
     https://brew.sh/index_ja.html (bash シェルをつかうこと)
  2. valet のインストール
    https://laravel.com/docs/5.4/valet#installation を参考に
    1. brew install homebrew/php/php71
    2. brew install homebrew/php/composer
    3. composer global require laravel/valet
    4. brew install mysql
    5. brew services start mysql 
    6. ~/.composer/vendor/bin のパスを入れる
      1. echo 'export PATH="~/.composer/vendor/bin:$PATH"' >>  ~/.bash_profie
      2. 一旦ターミナルを閉じて開き直す
    7. valet install
    8. ~/.bash_profile に
      export WP_CLI_PHP_ARGS='-d memory_limit=-1' wp
      を入れておく。
      ※あとからmiya0001 さんからの指摘:WP-CLI でメモリ不足のエラーが出る時の対処法(Qiita - miya0001)
      open -a textedit  /usr/local/php/etc/7.1/conf.d/php-memory-limits.ini
       ; memory_limit = 128M
      memory_limit = 512M
    9. wp package install aaemnnosttv/wp-cli-valet-command

<ハマった点>

wp package install aaemnnosttv/wp-cli-valet-command をしたときに、
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 1028096 bytes) in phar:///UNIX/local/bin/wp/vendor/composer/composer/src/Composer/Util/RemoteFilesystem.php on line 386

とエラーが出てしまう。/usr/local/php/etc/php.ini のmemory_limit をいじってもダメだったこと。

wp valet new demo


  1. mkdir demo
  2. cd demo
  3. valet park
  4. wp valet new demo

ちゃんと wpコマンドに valet が紐付いていたら、

Don't go anywhere, this should only take a second...
Success: demo ready! https://demo.dev

と出るはず。もし、wp core download せよとかいっていたら、紐付いていないという証拠。

https://demo.dev
404 - Not Found

telnet demo.dev 443 は接続できるのに何故だ。
~/.valet 内の nginx 設定をみても間違いが探せぬ。
ping demo.dev は 127.0.0.1 だし。。
これは miya0001さんの呪いと命名しよう(時間切れ)。

2日後にわかったが、valet park を叩いて、該当フォルダを valet として使えるように pathに含めておかねばならなかった。

あお、 nginx の restartは
sudo brew services restart nginx
でできるみたい。brew はあまり本格的に使っていなかったのでした。

MAMPと併用するためには(追記)


もし MAMPを 80/tcp で動作させている場合には、nginx とバッティングします。
  • valet stop 
でnginxも自動停止しますので、使わない時には上記コマンドを叩いておきましょう。
ただ brewで起動した mysqld は残ります。若干でもバッテリーを気にするなら、
  • brew services stop mysql  

としてサービスを停止しておきましょう。
次に利用する時には

  • valet start
  • brew services start mysql 
で利用できます。



2017年6月26日 @kimipooh

2017年6月14日水曜日

【備忘録】PHP 7.1.x で、PHP Fatal error: Uncaught Error: [] operator not supported for strings エラーがでたら・・・

手持ちの MAMP 環境を久々に更新し、PHP 5.6.30 / 7.1.1 へ切り替える設定にしました。現在のメイン PHP 利用環境は、7.0.x 系なのですが、そろそろ 7.1系でもテストしないとなぁと思い立ちました。 WordPress 4.8 でましたしね!

で、自前開発のWordPress プラグインも 最近出した Google Calendar List View 以外、 7.1系でチェックするのサボってました @@!

ということで環境変更です・・・完了。

そしてテスト開始。最初に遭遇したのが、

Uncaught Error: [] operator not supported for strings エラー


でした。
これは、 $sample[] = $sample_data; など、配列にデータを追加するに当たって、配列の初期化の型がおかしい場合におきるようですね。PHP 7.0.x まではエラーにはなりませんでした。

PHP 7.0.x まで許容


$sample = "";
$sample[] = $sample_data;

PHP 7.1.x より


$sample = array();
$sample[] = $sample_data;

ということだったのです。これは早速自前プラグインを修正し、かつ コードチェックしてくれる TRAVIS-CI の方も 7.1 を追加しないとですね〜。

ってことで手持ちのプラグインについて、 WordPress 4.8 と PHP 7.1 で動作チェック完了し、アップデート完了。

2017年6月14日 @kimipooh

2017年4月30日日曜日

WordCamp Kyoto 2017 の参加登録が開始されてるよ! #wckyoto2017

WordCamp Kyoto 2017 の参加登録が始まっているよ!


是非参加登録して、京都へ行くぜ〜って表明してみてはいかがでしょうか。
2日目はコントリビューター Dayということで、テーマやプラグイン、翻訳や WordPress本体のコアコントリビューションなど、普段体験したことのない何かを会得するにはとてもよい機会が設けられていると思います。

コントリビュートすることで得られる物


筆者はプラグインの作成方法を知ったことで、ちょっとした機能を WordPress に追加するのにプラグインを作成できることでとっても楽になりました。何か外注するときにもプラグインは筆者自身が開発したり、あるいは開発してもらうにしてもいろいろ外注先と技術的なやり取りもできるようになりました。

筆者自身英語が苦手ですが、それでも翻訳することはおすすめです。翻訳によって翻訳対象にどういった機能があるのかより詳しく知ることが出来ました。よく使うプラグインやテーマ、ドキュメントの翻訳にチャレンジしてみてはと思います。

コントリビュートときくと何かちゃんと貢献しないといけない!そんなのは敷居が高すぎる!って思われるかもしれません。でも、恐れることはありません。気軽に参加して WordPress に関心のある方々とコミュニケーションしてみませんか。分からないなら聞けばいいのです。参加してみる、、、それだけでもきっと何かの役立つと思います!

2017年4月30日 @kimipooh



2017年4月12日水曜日

Welcome to WordCamp Kyoto 2017!! #wck2017

Let's go to Kyoto!!


WordCamp Kyoto 2017 will be held on 24-25 June, 2017 at Kyoto University, Japan. It's free for join! The website was opened to the public today!!  I'm looking forward to enjoy for sharing various knowledge with attenders!


12th April, 2017
@kimipooh

2017年4月9日日曜日

【プラグイン公開】Google Calendar List View - 公開Googleカレンダーの一覧表示ショートコードプラグイン

ちょっと探したけどなかったので自前で開発して、WordPress公式プラグインとして公開しちゃいました。ブログを読み返していて気づきましたが、2014年の時点で、WordBench大阪で若干開発していたのですね。こちらは複数のカレンダーをマージして一覧表示するものだったようです。これのソースは消しちゃったかもですね。。。まぁいつでも作成できるのでもういいんですけど..

日本語翻訳も作ったのですが、「#2750 Plugin Directory: Changelogs not updating on Rosetta plugin directories」でチケット化されましたが、 WordPress Translate がおかしいため、完全に翻訳されなかったりプラグインサイトの翻訳がおかしかったりしますねぇ。なのでここで詳細を説明します。また公式プラグインについては、下記の英語版が最新なのでこちらをみてください。


利用の仕方



2017年6月25日 マニュアルの英語版も用意して、場所変更 @kimipooh

2017年3月7日火曜日

【備忘録】WordPress 4.7.3 で修正されたメディアアップロードの中身

【備忘録】WordPress 4.7.1 よりメディアアップロード時のMIMEチェックにファイル本体のチェック機能が付与されていた・・・ で finfo_open 関数の問題でアップロードできないファイルが出てきた問題について、
にて、WordPress 4.7.3で修正されるよ〜という情報があったわけですが、実際にはどうなったのでしょうか。
をみても、原文にも書かれてません。
ならばとコードをチェックしてみました。


wp-include/functions.php
2316行〜2334行 ( wp_check_filetype_and_ext 関数内)

の部分ですね。
そして今回変更があったのは、 2322〜2333行でした。

変更前


If ($real_mime !== $type) {
  $type = ext = false;
}

finfo_open でアップロードされたファイルのコンテンツをチェックした上でのMIMEタイプ($real_mime)と、アップロードされたファイルの拡張子に割り当てられたMIMEタイプ($type)とが一致しなければ、セキュリティを理由のブロックしていました。


変更後


if ( $real_mime && ( $real_mime !== $type ) && ( 0 === strpos( $real_mime, 'application' ) ) ) {
    $allowed = get_allowed_mime_types();
    if ( ! in_array( $real_mime, $allowed ) ) {
            $type = $ext = false;
    }
}

  1. finfo_open でアップロードされたファイルの中身をチェックし、MIMEタイプデータ($real_mime)がある。
  2. 「1」のMIMEタイプ($real_mime)とアップロードされたファイルの拡張子に割り当てられたMIMEタイプ($type)と一致しない
  3. 「1」のMIMEタイプ($real_mime)データが「application」から始まる場合
  4. 「1」のMIMEタイプ($real_mime)が、WordPress のMIMEタイプ($allowed)に登録されていない

この4つの条件を「すべて」満たす場合のみ、セキュリティを理由にブロックする。

と変更されていますね。
つまり変更後は、このMIMEチェックがかなり限定されてますね。
  • アップロードしたファイルの中身と拡張子が一致しない場合、中身チェックのMIMEが application の時のみ、WordPressに登録されたMIMEかどうかチェックする

具体例


テキストデータ(sample.txt)の拡張子だけ pdfに変更(sample.pdf)し、これをアップロードしてみました。

  • finfo_open でのMIMEタイプは「text/plain」($real_mime)
  • アップロードファイルの拡張子に割り当てられたMIMEタイプは「application/pdf」($type)

となります。このケースでは、変更後にはアップロードできちゃいます。
なぜなら、「3」の条件に当てはまらないから(finfo_open でチェックしたMIMEタイプ が application で始まってないから)。

もちろん、今回紹介したチェックは finfo_open を使ったチャックの部分であり、それ以前に、WordPressに登録されたMIMEの拡張子以外はアップロードできないようチェックがあります。
なので、sample.jpeg2002 とか適当な拡張子にしてもアップロードはできませぬ。
まぁただ、 sample.png を sample.txt にしてもアップロードできちゃいますけどね、、、このあたりは WordPress 4.7.1以前に戻ったよ〜って感じでしょうね。

2017年3月7日 @kimipooh

2017年2月27日月曜日

9年ぶり!京都で WordCamp Kyoto 2017 が開催!

WordCamp Kyoto 2017 が 6月24日、25日に京都大学で開催されることが公開されました! 当時にセッション登壇者の募集も始まりました。もちろん運営メンバー(実行委員)も募集されています。


WordCamp は WordPress 公式イベントであり、様々な方々がイベントに集まってきます。是非この機会に自らの裾野を広げてみては?と思います。

関連情報



2017年2月27日 @kimipooh

2017年2月14日火曜日

【備忘録】JetPackプラグインの「タイルギャラリー」の落とし穴に注意!

WordPress の JetPackプラグイン内にある「タイルギャラリー」について、ちょっと特殊な問題が起こって解決したのでメモっておきます。

制限サイトではギャラリーが表示できない


制限サイトとは、IPアドレス制限やパスワード制限されたサイトのことです。
よく準備中のサイトって一部メンバーのみチェックのために、そういった設定にしていることはありませんか。

どうやらその場合には、タイルギャラリーのギャラリーデータの画像が表示できないようです。このタイルギャラリーは、WordPress.com の CDNを通じて提供されており、画像としては ***.wp.com で生成された画像を表示することになります。制限されたサイトでは、生成された画像が GETできない(400エラー)となります。制限を解除して、キャッシュ系プラグインやシステムがあるなら、キャッシュをクリアすると問題なくでます。

以上から、WordPress.com 側がサイトの画像から直接データを取得してコンバートして CDN として提供しているのじゃないかなーと思います。なので、サイトへのアクセスが制限されていると画像が取得できなくて生成できないのかなぁと。

ただ一度サイトのアクセス制限を解除してタイルギャラリーができあがれば、再度サイトのアクセス制限をしてもギャラリーは残ります。

でも毎回やるの面倒だよ〜


その場合には、WordPress.com からのサイトへのアクセスを許可すればいけました。IPアドレスの細かい範囲は分からないので、パスワード保護されたWordPressを WordPress.com で管理するためには で以前調べた Automattic社の IPアドレス群をまるごと許可しました。
  • 192.0.64.0/18
ですね。実際に CDNは、 i0.wp.com とか i1.wp.com とかいくつかあるようで、それらはカバーしてそうです。BASIC認証をしているなら

Nginx
     satisfy any;
     auth_basic  "Hogehoge---";
     auth_basic_user_file /hogegegege/.htpasswd;
     allow 192.0.64.0/18;

Apache
   Order Deny,Allow
   Deny from all
   Allow from 192.0.64.0/18;
   AutoType Basic
   AutoUserFile  /hogegege/.htpasswd
   require valid-user
   Satisfy Any;

のように、Satisfy Any で OR条件にした上で、IPアドレス許可を追加すればいけまーす。

2017年2月14日 @kimipooh

2017年2月9日木曜日

【備忘録】WordPress の古いバージョンもセキュリティメンテナンスリリースされているけど、安全なのか

ちょっと内輪で質問されたことを受けて、調べてみても情報がなかなか見つからなかったので、フォーラムで質問してみました。皆さんからいろいろ回答頂いてやりとりしていたのですが、調べていくうちに、Make WordPress Core の Handbook に回答を見つけました。忘れない内にメモっておきます。

最新版以外は非推奨


つまりは結論的にはそうだったのでした。
確かに WordPress バージョン一覧(WordPress Codex 日本語版)をみると、WordPress 4.7.2 がリリースされた 2017年1月26日付で、WordPress 3.7以降のすべてのバージョンのマイナーバージョンがリリースされています。過去バージョンも、https://wordpress.org/download/release-archive/ よりダウンロード可能です。
WordPress.org フォーラムのモデレーターも、フォーラムにて、WordPress 4.6.2は 4.7.1(同時にリリース)のセキュリティフィックスをすべて含んでいるよという発言をされてます。

しかしながら、上記ダウンロードサイトの冒頭にも書かれていますが、
のSecurity項目の冒頭を抜粋すると

== 抜粋 ==
In the case of a purely security release, all patches should be created well ahead of time. Different patches may be necessary for trunk and stable branches. Currently, we make an effort to back port patches to all versions of WordPress that support autoupdates (3.7+). However, back porting patches is not always possible and those versions of WordPress are not officially supported as a result.
========
のように、自動更新を実装した WordPress 3.7以降のすべてのバージョンについて、可能な限りセキュリティリリースをするよう務めるけれど、すべてをフィックスできるわけではないし、公式にサポートいません。

と書かれているではないですか。
となると公式にサポートされている最新版以外は非推奨。ってことなのですよね。
確かに 一つ前のバージョンぐらいは全部フィックスされる可能性は高いですが、しかし保証されているわけではないのでアップグレードして対応するのが推奨ってことですねぇ。



なるほど〜って思った今日この頃でした。

P. S.
いろいろな事情でメジャーバージョンアップできないケースも多々あると思います。WordPressでは 3.7というかなり古いバージョンも、できる範囲でしょうが頑張ってセキュリティフィックスされている開発者の皆様には脱帽です。


2017年2月9日 @kimipooh

2017年1月13日金曜日

【備忘録】WordPress 4.7.1 よりメディアアップロード時のMIMEチェックにファイル本体のチェック機能が付与されていた・・・

あれ、PDFやPPTXがアップロードできなくなってる、、、って思って調べてみた所、つまりはそういうことだったのです。風邪引いてフラフラなのにマイナーバージョンアップで久々にデカイ変更されたなーという感じです。

wp-include/functions.php
2323行〜2333行 ( wp_check_filetype_and_ext 関数内)


のコードが、付与されていたってことです。

何が違うの?

Google+ Badge