かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

CSS3 マークアップ別Flexboxで要素を左端・センター・右端揃えのレイアウトを作る

IE8以下のサポートも終わり自動アップデートになってきていますし、CSS3のFlexboxもそろそろ実制作で活用できる用になってきていると思っています。
f:id:kikiki-kiki:20170323200844p:plain
flex サポート状況

なので、下記画像のようなWEBサイトのグローバルナビゲーションとかでよくある例えばロゴ・ナビゲーション+ボタンの様な構成で、ロゴを左端、ナビゲーションをセンターにしてボタンを右端に置くデザインをFlexboxで作ってみようと思います。
f:id:kikiki-kiki:20170323201153p:plain ※いつもの事ながらIEではチェックしていません。

並べたい各要素が同じ階層のマークアップの場合

HTML

<header class="header">
  <div class="nav-wrapper">
    <p class="logo">LOGO</p>
    <nav class="navigation">
      <ul class="nav-list">
        <li class="nav-link"><a href="">LINK</a></li>
        ...
      </ul>
    </nav>
    <div class="nav-btn">
      <a class="btn">BUTTON</a>
    </div>
  </div>
</header>

Flexboxの揃え方 justify-content: space-between を使う方法

CSS

/* ▼ 共通部分 ▼ */
.header,
.logo,
.navigation
.nav-list,
.nav-btn
  box-sizing: border-box
.header
  width: 100%
.nav-list
  padding: 0 1em // 最小の左右のマージンを持たせておく
/* ▲ 共通部分 ▲ */
// Flex
.nav-wrapper
  display: flex
  flex-flow: row nowrap
  justify-content: space-between
  align-items: baseline

flexboxにjustify-content: space-between と指定すれば、ロゴ・ナビゲーション・ボタンの間隔が均等になるのでデザインが実現できます。

margin auto を利用する方法

CSS

/* 共通部分省略 */
// Flex
.nav-wrapper
  display: flex
  flex-flow: row nowrap
  // justify-content: space-start <- default値
  align-items: baseline
.navigation
  margin: 0 auto

親要素がflexの子要素でmargin autoを使用すると親要素の幅内でいい感じに配置してくれる様です。
ですので、センター揃えにしたいナビゲーションにmargin: 0 autoを与えると右マージンに押されてボタンが右端に配置されデザインを実現することができます。
このautoで付けたマージンもjustify-content: space-betweenの間隔と同じように可変なのでレスポンシブやリキッドレイアウトにも対応可能かと思います。

おまけ margin autoを利用するとロゴだけ左揃えにもできる

ナビゲーションとボタンがflexを親に持つ同じ子要素なので、ロゴを左揃え・ナビゲーション・ボタンを右揃えにしたい時にはjustify-content: space-betweenは使えませんので、margin: autoがいい感じに幅を取ってくれることを利用すると実現が可能となります。

/* 共通部分省略 */
// Flex
.nav-wrapper
  display: flex
  flex-flow: row nowrap
  justify-content: space-end // 右を基点にする (全体右寄せ)
  align-items: baseline
.logo
  margin-right: auto

ロゴにmargin-right: autoを与えるとロゴの右側に取れるだけのマージンが付くので、ロゴのみ左揃えになります。
f:id:kikiki-kiki:20170323203950p:plain
 

ナビゲーションと内にボタンがあるマークアップの場合

レスポンシブデザインでナビゲーションとボタンを同時に変化させたい時とかこの様なマークアップもありそうです。
HTML

<header class="header">
  <div class="nav-wrapper">
    <p class="logo">LOGO</p>
    <nav class="navigation">
      <ul class="nav-list">
        <li class="nav-link"><a href="">LINK</a></li>
        ...
      </ul>
      <div class="nav-btn">
        <a class="btn">BUTTON</a>
      </div>
    </nav>
  </div>
</header>

2段重ねのFlexboxで実現する

‘.navigation'内の子要素も横並びにするので、ここもdisplay: flexにし、センター揃えにしたいナビゲーション(.nav-list)で調整する事で、キレイに左端揃え・センター揃え・右端揃えのレイアウトを実現することができます。

/* 共通部分省略 */
// Flex1 .logo と .navigation の並び
.nav-wrapper
  display: flex
  flex-flow: row nowrap
  // justify-content: space-start <- default値
  align-items: baseline
// Flex2 .nav-list と .nav-btn の並び
.navigation
  display: flex
  flex-flow: row nowrap
  justify-content: center // 全体中揃え
  width: 100% // 残りの幅全体にする
  box-sizing: border-box // 必須
.nav4 .nav-list
  margin: 0 auto
  1. .logo.navigationflexにする
    f:id:kikiki-kiki:20170323210413p:plain
  2. widtth: 100%.navigationを残りの部分一杯の領域にする
    f:id:kikiki-kiki:20170323210420p:plain
  3. ナビゲーション(.nav-list)の左右のマージンをautoにして全体のセンターにする
    f:id:kikiki-kiki:20170323210430p:plain

 

ボタンがナビゲーションのリスト内にある場合

<header class="header">
  <div class="nav-wrapper">
    <p class="logo">LOGO</p>
    <nav class="navigation">
      <ul class="nav-list">
        <li class="nav-link"><a href="">LINK</a></li>
        ...
        <li class="nav-btn">
          <a class="btn">BUTTON</a>
        </li>
      </ul>
    </nav>
  </div>
</header>

このマークアップだと完璧にナビゲーションのリンク部分だけをheaderのセンターに揃える方法を見つけることができませんでした。

ボタンにマージンを%で設定して調整するパターン

/* 共通部分省略 */
.nav-wrapper
  display: flex
  flex-flow: row nowrap
  justify-content: space-betwee
  align-items: baseline
.navigation
  width: 100%
  box-sizing: border-box // 必須
.nav-list
  display: flex
  flex-flow: row wrap
  justify-content: flex-end // 右端を基点にする
  padding-right: 0
.nav-btn
  margin-left: 25% // 適当な値に設定

.logo.navigationjustify-content: space-between で等間隔にし、.nav-listflexにして子要素を並べ、リストの最後になるボタン(.nav-btn)の左マージンを適当な%で指定してそれっぽくすることができました。ボタンのマージンは親要素のn%なので、ブラウザの幅が狭いとロゴとの間隔が狭くなり、逆にブラウザの幅が広いとボタンとの間隔に対してロゴとの間隔が広くなります。
f:id:kikiki-kiki:20170323215701p:plain

ボタンをposition: absoluteで右端に固定するパターン

/* 共通部分省略 */
.nav-wrapper
  display: flex
  flex-flow: row nowrap
  justify-content: space-betwee
  align-items: baseline
  position: relative
.navigation
  display: flex
  flex-flow: row nowrap
  justify-content: space-around  // .logoとの間隔を作る
  width: 100%
  box-sizing: border-box // 必須
.nav-list
  display: flex
  flex-flow: row wrap
  // justify-content: space-start <- default値
  padding-right: 0
.nav-btn
  position: absolute
  right: 0

ナビゲーション内のリスト左揃えで始めボタンだけposition: absoluteで右端に固定しflex配置から外します。そして.navigationをFlexboxにしてjustify-content: space-aroundを指定するとロゴとの間隔もいい感じになります。しかし、absolute配置しているボタンの幅は無いものして計算されるのでブラウザの幅が狭くなるとナビゲーションのリストとボタンが重なってしまいますので、メディアクエリなどで小さくなった時のCSSを別途作成する必要がありそうです。
f:id:kikiki-kiki:20170323221203p:plain
 

サンプル

See the Pen Flex nav sample by KIKIKI (@chaika-design) on CodePen.

 

今までどうしてもIE対応があったりで、Bootstrapで流行ったfloatdisplay: tableを使ったCSSを書くことが多くFlexboxをちゃんと使いこなせていなかったので今回この記事をかいて少しFlexboxにも慣れてきた感じがしてきました。
コーディングしない期間が続くと書き方を忘れていたり、新しいやり方のキャッチアップが疎かになってしまうので気をつけなきゃな―っとしみじみ感じています。


[参考]

Adobe illustrator パターンをオブジェクトにしたい

パターンで付けた柄をオブジェクト化(アウトライン化?)する方法。
オブジェクトを選択して、メニュバーからオブジェクト > 分割・拡張...を選択すればOK
f:id:kikiki-kiki:20170311224902p:plain
ダイアログが出るのでそのままOKを押せばパターンがオブジェクトに変換されます👇
f:id:kikiki-kiki:20170311224935p:plain

イラレで印刷に出すのバージョンとかの問題でパターンとかブレンドとかそのまま出すの不安なので、全部オブジェクトに変換しているのだけれど正しいのかな?(イラレ嫌いでPhotoshopで印刷データ作るタイプ)


神速Illustrator [グラフィックデザイン編] CC対応

神速Illustrator [グラフィックデザイン編] CC対応

WordPress 4.7, 4.7.1 はAPIに致命的なバグがあって認証無しで誰でも記事を改ざんできちゃうっぽい!

WordPress 4.7, 4.7.1 のサイトは直ぐに4.7.2にアップデートするのです!

Twitterで大学や国会議員や公的機関のサイトが大量に改ざんされてるという情報を朝から目にした日でした。

どうやら改ざんされていたのはWordPressのサイトの様で、事の顛末は、
WordPressはアップデートの際には何を修正したかを公開していたのですが、今回はWordPress 4.7.2で修正をしたバグが致命的なものだったために直ぐにセキュリティに関わるアップデートの内容を公開せずに1週間後に情報を公開したようです。( WordPress 4.7.2のリリースが1月26日、バグの情報が公開されたのが2月1日 )
そして、それ以降もWordPressをアップデートせずに、4.7、4.7.1のバージョンのままだったサイトが軒並みこのバグを利用されて記事を改ざんされていったと言うのが今回の件のようです。

今回の話題になってるバグとは?

特定のAPIのURLにPOSTでデータを送るだけで、WordPressのログインも認証もなしに投稿内容を更新することができてしまうというバグ…そしてバグの内容が公開されていて、少しググれば簡単に攻撃スクリプトが解ってしまうというくらい簡単なもの。
これはWordPress 4.7 で導入された投稿の取得や新規追加、更新を行うことができるREST APIに含まれていたバグ。なので、4.7より古いバージョンのサイトはこの攻撃で改ざんされないっぽい。古いのはあまり良くないけど、結果的に今回は良かったみたいな…

ローカル環境で試してみました。

WordPressのバージョンは管理画面 >ダッシュボードで確認ができます。 f:id:kikiki-kiki:20170206143252p:plain
※ ここが、4.74.7.1 の人はすぐにアップデートしましょう!

バグの具体的な内容はWordPress公式のリリースノートの記事や、そこにある報告者のリンク先の記事内に書かれています。
攻撃したいWordPressのサイトのAPIのURLに、改ざんしたい記事の投稿IDを紐付けて、データにタイトルと本文を持たせてPOSTするだけ。

なので、こんなサイトに…
f:id:kikiki-kiki:20170206150323p:plain
次のような公式の記事とかを参考に作った攻撃コード ( 調べればすぐ解りますがキーとか隠しておきます )
f:id:kikiki-kiki:20170206150202p:plain
これをリクエストすると…

f:id:kikiki-kiki:20170206150331p:plain
はい。認証も何もなしに記事を書き換えることができました。
このAPIを利用して記事を改ざんするとWordPress管理画面から見れる投稿のリビジョンでは、ユーザー名が表示されないようです。
f:id:kikiki-kiki:20170206151734p:plain

ね?簡単でしょ!?

_人人人人人人人人人人人人人人人_  
> 簡単でしょ!?じゃねーよ!!!! <  
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄  

試してみた所、HTMLタグも入れ放題なんですよ。
そして、攻撃に必要になる「WordPressの投稿ID」なのですが、デフォルトとか多くのテーマだとHTMLタグにid名やclass名で投稿IDが出力されています。
HTMLに出力されていなくてもRSSを利用している場合RSSに出力されているURLはパーマネントリンク設定で変更されたURLではなく?p=1の形式になっており投稿IDが丸わかりなのです…

このバグ
f:id:kikiki-kiki:20170206142825p:plain

はてなブックマーク - WordPress 4.7.1 の権限昇格脆弱性について検証した | 徳丸浩の日記
👆 コトの重大性に溢れたコメントが並んでいます。マジやばくね?

解決方法

こちらの記事にあるように、下記の方法を取ればこの致命的なバグには対応することができそうです。

  1. WordPressを最新の4.7.2にアップデートする
  2. ただちに最新版へアップデートすることが困難な場合、REST APIを無効化するプラグインを使用する

そして、可能な限りWordPressの自動更新をONにしておくのが良いのではないかと思いました。
しかし私の持っていたサイトの中には更新の通知が来ても実際には更新されなかったサイトもあったので自動更新機能を過信しすぎてもダメかもしれません。

改ざんされたサイトの対応

改ざんされた記事そのものはリビジョンから直ぐにもとに戻すことが可能です。
今回のAPIを利用した攻撃の場合、できても記事のタイトルと本文の更新のようなので記事内にスクリプトやiframe埋め込むことはできると思うのですが、サイトのテーマ自体にコードを追加したり、DBからデータを抜き取ったり、ログイン情報を取得したりとかは難しいのかな〜?と思っているのですが、これは私もハッキリとした事が言えないので、むしろ教えてほしい部分です!!

WordPressのような既に多くの人がコミットしているプロジェクトでもこんな重大な脆弱性が発生したりするんだなぁ〜って驚きました。
それより、WrodPressのサイトを持っている方は直ぐにチェックしてみることをオススメします。  
 
追記
REST APIのバグを利用しての改竄は観測している中ではISISを中傷する改竄が多かったのですが、中には「私はホワイトハッカーだ。君のサイトのWordPressアップデートした方が良いぞ。」と注意喚起のような記事を改ざんするハッカーも観られるようになってきました。
f:id:kikiki-kiki:20170206200127p:plain
まぁ いずれにせよ、改ざんされちゃってるわけですけどね。。。


[参考]

👇 徳丸 先生のありがた〜い本 👇