2011年6月24日金曜日

MySQLのインデックスと高速化について

インデックスの注意点

!=, <> はインデックスが使われない
LIKE 検索は前方一致のみでしかインデックスが使われない
OR や不等号を使った検索でインデックスが使われない場合がある。
ORDER BY するとインデックスが使われないパターンが出る。
EXPLAINを学ぶと高速にしょりできる。

あとは高速化のリンクをご紹介します。

参考になるリンクのご紹介

MySQLを高速化する10の方法

MySQLのEXPLAINを徹底解説!!

NoSQLにすると何がうれしいか?

NoSQLにすると何がうれしいか?それはスケールアウトする時にRDBがボトルネックになってNoSQLだとそれを回避できるからです。SNSやソーシャルゲーム等スケールアウト必至のアクセス数に達した時の手段です。企業がNoSQLにあまり関心が無いのはそこまで莫大なアクセス数をさばく必要がないからですね。また、Zingaの様にMySQLをクラスタ化してボトルネックを解消する手法もあります。それもまた1つの方法。
RoRで利用されているMongoDBがPHPでも利用可能なのを最近しりました。今後、NoSQLのCMSも出てくるかもしれませんね。
MongoDB
http://php.net/manual/ja/class.mongodb.php
NoSQLはRDBMSに取って代わるものなのか?
http://www.atmarkit.co.jp/flinux/rensai/noSQL/noSQL_01/01_2.html


MySQL Clusterを試す - クラスタ化した分散アドレス帳をつくる
http://journal.mycom.co.jp/special/2004/mysql/index.html
 

2011年6月20日月曜日

XSNSをメニューで選択した時にマイページを呼び出すプチ・ハック

最初にマイページが表示されるのがmixi流とお客さんに要望された場合のメモ。
<?php
require_once '../../mainfile.php';
require_once 'config.php';

// get も post もなければ mypage を表示
if(!$_GET && !$_POST){
    $page_name = 'mypage';
}else{
// パラメータが付いていればコミュニティのページを表示
    $page_name = isset($_REQUEST[XSNS_PAGE_ARG]) ? preg_replace('/[^0-9a-zA-Z_]/', '', $_REQUEST[XSNS_PAGE_ARG]) : 'index';
}
require_once XSNS_FRAMEWORK_DIR.'/loader.php';
require_once XSNS_TRUST_PATH.'/include/language.php';
xsns_load_language('main.php');
XsnsController::execute($page_name);
?>

2011年6月17日金曜日

WordPress のコア関数を使って外部ブログの更新情報一覧を表示する方法

WordPress コアの rss.php を使って外部の様々なブログから更新情報を拾い全てのブログを日付順に並び替えて表示する方法

buddypress/bp-activity/bp-activity-templatetag.php の関数の書き換えですが、他へも流用可。
echo 部分をリターンで返せば他でも使えるでしょう。

function bp_activity_get_rss() {
        $blogReadArr = file("./org/blog-URLs.txt"); // title TAB URL改行 のテキスト

        $iArray = array();
        foreach ($blogReadArr as $value) {
            $blogPartArr = explode("\t", $value);
            $blogTitle = $blogPartArr[0];
            $blogRSS = $blogPartArr[1];
            include_once(ABSPATH . WPINC . '/rss.php');
            $rss = fetch_rss("$blogRSS");
            $maxitems = 3;
            $items = array_slice($rss->items, 0, $maxitems);
           
            if ($items) {
                foreach ( $items as $item ){
                    $dt = NULL;
                    if (isset($item["dc"]["date"])) $dt = substr($item["dc"]["date"],5,14);
                    if (isset($item["pubdate"])){
                        $pdt = strtotime($item["pubdate"]);
                        $dt = date("m-d",$pdt)."T".date("H:i:s",$pdt);
                    }
                    $iArray[$dt] = array("date"=>$dt, "link"=>$item["link"], "title"=>$item["title"], "name"=>$blogTitle);
                }
            }
        }
        arsort($iArray);
        foreach ( $iArray as $item ){
            $link = $item["link"];
            $title = $item["title"];
            $name = $item["name"];
            $dt = substr($item["date"],0,5);
            echo "<li>$dt $name <a href=\"$link\" title=\"$title\" arget=\"_blank\">$title</a></li>";
        }
}

2011年6月8日水曜日

fgetcsv setlocale に頼らない CSV ファイルの読み込み関数

fgetcsv でCSVが簡単に読み込める場合は問題有りませんが、setlocaleでいろいろごにょごにょしないと文字化けにハマるし、設定に依存するのでサーバが変わると不具合が発生したりと、安心してつかえません。

fgetsで1行もってきてexplodeで切ればいいかというとCSV中に改行が入っていたり、ダブルクォーテーション文字列中に入っていたりする場合うまく行きません。

そこで、全てを網羅してきちんとCSVの1レコード分を読み込む関数を作りました。

    /*
     * Load CSV Line
     *         with CR+LF included in the columns
     *     Licenced GPL Ver.2: Copyright(c) Yoshi Sakai @ Bluemoon inc.
     *
     *     &$handle = File pointer
     *     $fieldNumber = Field number ( Max colmuns )
     */
    function fgets_csv( &$handle, $fieldNumber=0 ){
        if ( $fieldNumber==0 || feof($handle) ) return TRUE;
        $line = fgets($handle);                                    // Load 1 line anyway
        while ( 1 ){
            // Check CR+LF in the double cuotation and load
            $str = preg_replace('/"{2}/','"', $line);
            while ( substr_count($str,'"') % 2 > 0 ){
                if (feof($handle)) break;
                $line .= fgets($handle);
                $str = preg_replace('/"{2}/','"', $line);
            }
             // Check Field number
            $str = preg_replace('/"(.*?)"/',"", $line);            // cut double cuotation
            $n = substr_count($str,',');                        // count comma
            if ( feof($handle) || $n+1 >= $fieldNumber ) break;    // Field Ok?
        }       
        return $line;
    }

2011年6月6日月曜日

XOOPS Cube のユーザー名を変更可能にするハック

デフォルトでユーザー名を流し込んで、後からユーザー自身に変えさせるという場合XOOPS Cube はユーザー名変更できないという件に対応。本当はもっと煩雑な手続きを入れた方がいいんですけどとりあえずサクッと変更できる感じで。

modules/user/templtes/user_edituser.html

26行目付近に uname を入力可能にします。
      <!-- {$thisUser->getShow('uname')} -->
      <{xoops_input name=uname size=25 maxlength=25 value=$thisUser->getShow('uname')}>
  modules/user/forms/EditUserForm.class.php に uname追加

27行目付近
        $this->mFormProperties['uid'] =& new XCube_IntProperty('uid');
        $this->mFormProperties['uname'] =& new XCube_StringProperty('uname');
        $this->mFormProperties['name'] =& new XCube_StringProperty('name');

192行目付近
    function update(&$obj)
    {
        $obj->set('uname', $this->get('uname'));    // bluemooninc
        $obj->set('name', $this->get('name'));

2011年6月5日日曜日

ソニーの情報流出について

今週のWeeklyCMSではImpressCMSコミュニティからセキュリティについての放送をした事で、そろそろCMSとセキュリティについて特集を組まなければならないと思い始めました。

最近の流れとして情報流出にフォーカスが来ていると思います。思い起こせば、前回のOpenID特集もオバマ大統領の新戦略「サイバースペースにおける認証済み身元情報のための国家戦略(National Strategy for Trusted Identities in Cyberspace NSTIC)」もそうですし、最近話題のソニーの情報流出もそうです。

ソニーの場合ゲーム機だから比較的安全と見られていたという記事を見かけますが、情報流出はゲーム機ではなく、サーバですから他のPCと何ら条件は変わりません。 ジョージ・ホッツ氏によるプレイステーション3のハッキングに端を発し、これを知的財産権侵害としてソニー側が訴えた事でPS3を自由に使いたいハッカー達を刺激した様です。当初はDDoS攻撃による抗議行動だった様ですが、米国匿名ハッカーが「SCEが(配信サービスの)PSNをどのように管理しているのか」についての詳細な情報(SCEによるユーザー行動の監視、クレジットカード情報のテキストファイル送信、収集情報のオンライン・サーバ 上の配置)が明らかになり今回の史上最大の情報流出を招いた様です。

元記事「ソニー、ハッカーとの暗闘 脆弱だった「プレステネット」 個人情報流出 ゲームジャーナリスト 新 清士」

ここからは私の雑感ですが、「プレステネット」自体の開発がセキュリティ専門家が関わらずにアウトソーシングで作られ、通り一遍等の脆弱性スキャナーに通って安心して運用していたという様な感じではないでしょうか。オーダー先はシリコンバレーで、開発の中心はインドや中国等で世界的なアウトソーシングかもしれません。報道される内容からするとパスワードが平文だったりクレジットカードもテキストファイルだったり、収集した情報がオンラインサーバ上に有ったりと開発者目線で「へっ!?」という事が沢山ありました。

今回の事を教訓とするなら、安易なアウトソーシングはかえって高く付くという事でしょうか。そうは言っても、アウトソーシングは無くならないので、認証や個人情報はやはりNSTICの様な方向で調整されていくと思います。

では 外部認証を導入すれば安全は確保されるでしょうか?答えはNOです。サーバにデータがあり、外部とのインターフェースを持てばそこにセキュリティホールが発生する可能性があります。

という事で、インターネットがインフラとなっている昨今、 IPA(独立行政法人情報処理推進機構)にご協力頂き、各CMSコミュニティと皆さんと一緒に WeeklyCMS としてのセキュリティ特集を今後考えて行きたいと思います。

2011年6月4日土曜日

CMSとセキュリティ

今週はImpressCMSでセキュリティ対策について話題がでましたが、 CMS(特にPHP)で気にすべきセキュリティ項目は以下がメインとなります。 漏れていればコメント下さい。セエキュリティはいずれIPAと共同で何か放送を検討したいと思っています。

  1. クロスサイト・スクリプティング

  2. スクリプト(コード)・インジェクション

  3. SQL インジェクション

  4. ディレクトリ・トラバーサル

  5. クロスサイト・リクエスト・フォージェリ(CSRF)

    その他攻撃

    ヌルバイト攻撃、変数汚染攻撃、HTTPレスポンス分割攻撃、インクルード攻撃、eval利用攻撃、外部コマンド実行攻撃、ファイルアップロード攻撃、セッションハイジャック、スパムメール踏み台攻撃、DoSアタック、クリックジャック攻撃

 それぞれ、のキーワードに?と思ったらIPA(独立行政法人 情報処理推進機構セキュリティセンター)のホームページへお立ち寄り下さい。

http://www.ipa.go.jp/security/vuln/CWE.html