Traffic optimization

タカハシシステム(旧技術関係ブログ) : WordPress

カテゴリー ‘WordPress’

全世界のWordPressサイトに大規模攻撃; デフォルトのアドミンユーザ名’admin’がねらわれている

最初から「admin」じゃなくて想像されにくいユーザー名にしておくべきだったのですが、残念ながら「admin」を使ってるサイトがありました。

ということで作業しようとしたところ(マルチサイトにしてたのが原因か?)管理画面から変更できなかったので … データベースを直接変更した際のメモです。出来ない原因も探った方がよさそうですが、それはまた別の機会に。

WordPressのバージョンは3.5.1(マルチサイトを利用)くれぐれも作業は自己責任でお願いします!ちゃんとバックアップを取っておいてくださいね。

一般的なadminの削除方法

一般的な(?)マルチサイトのadmin削除(変更)方法です。

  1. 新しいユーザーを作成する
  2. 作成したユーザーに特権管理者権限を与える
  3. ログアウトして新しく作成したユーザーでログインする
  4. 「admin」の特権管理者権限を外す
  5. 「このユーザーはネットワーク管理者用メールを持っているため特権管理者権限は削除できません。」と表示される場合は、adminのメールアドレスを変更する
  6. 「admin」が削除できるようになるので削除する

マルチサイトじゃない場合は以下の記事がわかりやすかったです。素敵!
乗っ取られる前にセキュリティ強化。WordPressのadminユーザーを変更(削除)する方法

上記の方法じゃ削除できなかった

ユーザー一覧から「削除」をクリックしても反応がなくて(空振りしてしまう)削除できませんでした。あんまりやりたくないけど … とりいそぎDBを直接変更するしかなさそうです。

迂闊にDBをいじると最悪の事態(データが全部消えてしまう)が起こるかもしれませんので慎重に。

しょうがないのでDBを直接変更

以下を「admin」から新しいユーザー名「hogehoge(例)」に変更。


■ wp_users
ユーザー名(必須):user_login
ニックネーム(任意):user_nicename
ブログ上の表示名(任意):display_name

■ wp_usermeta
ニックネーム(任意):nickname

■ wp_sitemeta
特権管理者(必須):meta_key = site_admins


「wp_sitemeta」の「meta_value」はシリアライズされてるので注意。

たぶんこんな感じ「a:1:{i:0;s:5:”admin”;}」になってるので、
こんな感じ「a:1:{i:0;s:8:”hogehoge”;}」に変更。

sはバイト数なので「admin」から「hogehoge」に変えるなら「5」から「8」に変えなくちゃいけないです。

(補足)シリアライズ

配列をデータベースに保存したい場合に使います。

これをデータベースに保存したい場合は
array([0] => hogehoge)

こんな感じでシリアライズ

<?php
echo serialize(array([0] => hogehoge));
?>

実行結果 → a:1:{i:0;s:8:”hogehoge”;}

ちなみにアンシリアライズはこんな感じ

<?php
print_r(unserialize('a:1:{i:0;s:8:"hogehoge";}'));
?>

実行結果 → array([0] => hogehoge)

メモでした。

ブログなどにソーシャルボタンを配置すると、右側の余白が気になることありませんか?こんな感じで。

結構有名な会社とかメディアでもズレたままになってたりします。

なんとかしたい

なんとか揃えたいなーと思って考えてみました。

ボタンのカウントを取得できれば、その桁数に応じて幅を調整してやれば(環境によって異なるので厳密にはアレですが)ざっくり大丈夫かなと。

とはいえ … 細かいところはサンデープログラマなのでご容赦ください。

TwitterやFacebookボタンのカウントを取得する

こちらの記事「ソーシャルボタン系のカウント数をPHPで取得して表示する」を参考に(ありがとうございます!)カウントを取得してみます。

/*
 * Get Social Button Count
 * facebook twitter hatena
 */
function get_social_counts($url){
    $counts = array();

    //encode url
    $encode_url = urlencode($url);

    //facebook likecount
    $likecount          = file_get_contents('http://graph.facebook.com/' . $encode_url, true);
    $decode_likecount   = json_decode($likecount, true);
    $facebook_likecount = ($decode_likecount[shares])? $decode_likecount[shares] : 0;

    //twitter tweetcount
    $tweetcount         = file_get_contents('http://urls.api.twitter.com/1/urls/count.json?url=' . $encode_url, true);
    $decode_tweetcount  = json_decode($tweetcount, true);
    $twitter_tweetcount = $decode_tweetcount['count'];

    //hatena bookmarkcount
    $bookmarkcount        = file_get_contents('http://api.b.st-hatena.com/entry.count?url=' . $encode_url, true);
    if(empty($bookmarkcount)){ $bookmarkcount = "0"; }
    $hatena_bookmarkcount = $bookmarkcount;

    //set array
    $count['facebook'] = $facebook_likecount;
    $count['twitter']  = $twitter_tweetcount;
    $count['hatena']   = $hatena_bookmarkcount;

    return $count;
}

引用:ソーシャルボタン系のカウント数をPHPで取得して表示する

カウントに応じて幅を決める

で取得したカウントを元に幅を決めていきます。

Facebookボタンが「0桁 = 70px、1桁 = 100px、 10桁 = 100px、 1,000桁 = 105px」ぐらい。

Twitterボタンが「0桁 = 88px、1桁 = 93px、 10桁 = 98px、 1,000桁 = 108px」ぐらいなので、ざっくりと設定。

function get_social_width($count){

	$width = array();

	if ($count['facebook'] == 0) {
		$facebook_width = 70;
	} elseif ($count['facebook'] > 0) {
		$facebook_width = 100;
	} elseif ($count['facebook'] > 99) {
		$facebook_width = 100;
	} elseif ($count['facebook'] > 999) {
		$facebook_width = 115;
	}

	if ($count['twitter'] == 0) {
		$twitter_width = 88;
	} elseif ($count['twitter'] > 0) {
		$twitter_width = 93;
	} elseif ($count['twitter'] > 99) {
		$twitter_width = 98;
	} elseif ($count['twitter'] > 999) {
		$twitter_width = 108;
	}

    //set array
    $width['facebook'] = $facebook_width;
    $width['twitter']  = $twitter_width;

    return $width;

}

これらの幅を各ボタンに指定してやればOKです。

でも問題がある

これだとブラウザの更新ボタン押さないと反映されないんですよね。課題が残りました。

このブログにアクセスすると右側に「Follow me」バッヂが表示されるのですが、スマートフォンでアクセスしたとき少し邪魔だなと気になっていました。

ということで、こちらの記事「Web サイトのスマートフォン最適化: UA 判別篇」を参考に function.php に関数を用意して判定することにしました。とても参考になりました!

参考記事でも触れられてますがUA判別のために文字列でリストを作るのは、なんだかスマートじゃないですよね。やはりメディアクエリで振り分けたほうがいいのか…。

500記事書くことにしたので、こちらの記事「 WordPressをちょちょいと使いやすくする15のスニペット 」を参考に、現在の投稿数をサイドバーに出すようにしてみました。

sushi-paku webさんがサイドバーに投稿数を表示していて「あれいいなー」と思ってたんです。ということで実装してみました。

今まで他のブックマークサービスのボタンを付けていたのですが、そろそろ見直しするかということで、はてなブックマーク、twitter、facebookのボタンを設置してみました。

以下、ざっくりとした設置方法です。コードを取得してWordpressのテーマに貼り付けてるだけです。

はてなブックマークのボタン設置

以下サイトで設定
http://b.hatena.ne.jp/guide/bbutton

コード例

個別記事に設置するので <?php the_permalink(); ?> で指定。

twitterのボタン設置

以下サイトで設定
http://twitter.com/goodies/tweetbutton

コード例

これは個別記事のURLを持ってきてくれるので指定なし。「data-via」に入れたアカウント宛のメンションとなります。

facebookのボタン設置

以下サイトで設定
http://developers.facebook.com/docs/reference/plugins/like/

コード例

こちらも、個別記事に設置するので <?php the_permalink(); ?> 。