ArrayIteratorは、ソート中に自分自身を変更することはできません。
まあ普通は、ソート中に中身を書き換えられたらすごく困りますね。
ところで何となくJVNを見ていたらJVNDB-2014-003302、CVE-2014-4698というものを発見しました。
http://jvndb.jvn.jp/ja/contents/2014/JVNDB-2014-003302.html
https://bugs.php.net/bug.php?id=67539
解放して、もう使わなくなったはずのメモリにアクセスしてしまうバグだそうです。
場合によってはサービス運用妨害に至るそうです。
これはバッファオーバーランなのかな?
2014/06/29に発見され、2014/07/02に修正されています。
当然PHP5.6.0RC2の時点では修正されていません。
エラーは出ませんが、実はC言語レベルでは不正なメモリ読み出しが発生しています。
そのあたりはMemcheckで確認可能です。
あとはArrayIteratorの中身をうまいこと書き換えれば、メモリの不正な読み出し箇所にコードを忍ばせて何か攻撃できるかもしれません。
が、そのあたりは詳しくないので具体的にどのようにすればいいかはよくわかりません。
というか、そもそもソート中に中身を書き換えるようなソースを書く方が悪いだろこれ。
JVNでの深刻度は4.6ですが、本当にこれで影響を受けるシステムが存在するのか疑問に思うレベル。
ちなみに
意味がわからぬ。
まあ普通は、ソート中に中身を書き換えられたらすごく困りますね。
<?php $arrayIterator = new ArrayIterator(['A','B']); $GLOBALS['arrayIterator'][0] = 'C'; // 問題なし // ソート中に中身を変更 function badsort($a, $b) { $GLOBALS['arrayIterator'][0] = 'D'; return $a > $b; } $arrayIterator->uksort('badsort'); // Warning: Modification of ArrayObject during sorting is prohibitedWarningが発生し、中身の変更は拒否されます。
ところで何となくJVNを見ていたらJVNDB-2014-003302、CVE-2014-4698というものを発見しました。
http://jvndb.jvn.jp/ja/contents/2014/JVNDB-2014-003302.html
https://bugs.php.net/bug.php?id=67539
解放して、もう使わなくなったはずのメモリにアクセスしてしまうバグだそうです。
場合によってはサービス運用妨害に至るそうです。
これはバッファオーバーランなのかな?
2014/06/29に発見され、2014/07/02に修正されています。
当然PHP5.6.0RC2の時点では修正されていません。
<?php $arrayIterator = new ArrayIterator(['A','B']); // ソート中にunserialize function badsort($a, $b) { $GLOBALS['it']->unserialize($GLOBALS['it']->serialize()); return $a > $b; } $a->uksort('badsort'); // エラーは出ないunserializeだとエラーが発生せずに中身が書き換えられます。
エラーは出ませんが、実はC言語レベルでは不正なメモリ読み出しが発生しています。
そのあたりはMemcheckで確認可能です。
あとはArrayIteratorの中身をうまいこと書き換えれば、メモリの不正な読み出し箇所にコードを忍ばせて何か攻撃できるかもしれません。
が、そのあたりは詳しくないので具体的にどのようにすればいいかはよくわかりません。
というか、そもそもソート中に中身を書き換えるようなソースを書く方が悪いだろこれ。
JVNでの深刻度は4.6ですが、本当にこれで影響を受けるシステムが存在するのか疑問に思うレベル。
ちなみに
<?php $arrayIterator = new ArrayIterator(['A','B']); // ソート中にunserializeで中身を入れ替え function badsort($a, $b) { $d = new ArrayIterator(['C','D']); $e = $d->serialize(); $GLOBALS['arrayIterator']->unserialize($e); return $a > $b; } $a->uksort('badsort'); // ソート中に$arrayIteratorを直接変更 function badsort2($a, $b) { $GLOBALS['arrayIterator'] = new ArrayIterator(['C','D']); return $a > $b; } $arrayIterator->uksort('badsort2');このように書くと書き換えができるうえに不正なメモリ読み出しも発生しません。
意味がわからぬ。
PR
http://www.php.net/manual/ja/function.gmp-nextprime.php
前エラトステネスの篩で素数を求めたのですが、普通に標準関数に存在していました。
なんでもありだなPHP。
ということで速度はそれなり、メモリ使用量はずっと少ない、そして見た目が圧倒的に簡単という結果になりました。
どうしても速度をひたすら追求しなければならないんだ、なんて時以外はgmp_nextprime()を使っておけば十分でしょう。
というか速度が必要なら他の言語を使え。
前エラトステネスの篩で素数を求めたのですが、普通に標準関数に存在していました。
なんでもありだなPHP。
<?php // GMPを使ったエラトステネスの篩 // 初期値 $max = 1000000; $now = 1; $prime = ''; // 素数を求める while(($now = gmp_nextprime($now)) < $max){ $prime .= $now.PHP_EOL; } // 出力 echo $prime;
ファイル名 | 10000件時間(秒) | 1000件メモリ(kb) | 1000000件時間(秒) | 1000000件メモリ(kb) |
---|---|---|---|---|
katsurayama_sosu.php | 0.00400043 | 134.38 | 1.78117800 | 1362.41 |
maeda_sosu.php | 0.30502999 | 991.88 | Maximum execution time of 180 seconds exceeded | |
sosu_sample.php | 2.81178141 | 992.17 | Maximum execution time of 180 seconds exceeded | |
tanaka_sosu.php | 0.00449991 | 248.15 | 0.99830055 | 8166.82 |
NurseAngel ArrayIterator | 0.00450063 | 993.30 | 0.48954952 | 84322.09 |
NurseAngel str_repeat | 0.00250053 | 145.05 | 0.19101894 | 2363.26 |
NurseAngel gmp_nextprime | 0.01266773 | 136.09 | 0.96109605 | 1361.86 |
ということで速度はそれなり、メモリ使用量はずっと少ない、そして見た目が圧倒的に簡単という結果になりました。
どうしても速度をひたすら追求しなければならないんだ、なんて時以外はgmp_nextprime()を使っておけば十分でしょう。
というか速度が必要なら他の言語を使え。
TYPE-MOON学園ちびちゅき! 1 華々 つぼみ
☆☆☆
タイプムーン作品の公式パロディクロスオーバー作品。
作者が華々つぼみ氏ということで無条件購入したのですが、よく考えたら私タイプムーン作品は一つたりとも見たりプレイしたりしていないので、登場人物がさっぱりわからなかった。
中身はまあきのこ以外は普通に読めたので、知ってる人が見たらより面白いのではないかなあと。
表紙が登場人物大量投入ですごいがんばってる。
宮河家が満腹! ? 美水かがみオールスター 超簡単☆節約レシピ 華々 つぼみ
☆☆☆☆
同じく、らきすた+宮川家の空腹の公式スピンオフ作品。
こちらはわかる。
内容は2作品のキャラを使いつつ100~200円程度の貧乏食を紹介してくれます。
本家とは作風が違うんですが、わりと似ているのであまり気になりません。
ただ私、家族が居るのに生活費を使い込む人って好きじゃないんですよね。
なので私はひなたが好きではない。
一人暮らしならいくらでも自由にしろって感じですが。
しかし華々つぼみ氏には今すぐ放課後アトリエといろを連載再開してもらうべき。
打ち切り決めやがった奴を吊るせ。
あるゾンビ少女の災難I:1 池端 亮
☆☆
いや、ゾンビ少女に巻き込まれた周囲の災難だろこれ。
最近のラノベには珍しく、容赦なく人が死んでいきます。
容赦なくというか脈絡がなさすぎてどうなのよこれという気持ちになります。
殺されサイドも対応が緩いというか緊迫感が全く無いのがなんとももにょる。
何故直接火を付けなかった。
続きはいらないかな。
史上最強の弟子 ケンイチ 55 松江名 俊
史上最強の弟子 ケンイチ 56
☆☆☆
今後の展開のための準備回、のような話。
ただなんか今回話の展開が唐突というかえらい急に感じたのだがなんだろう。
やはり八煌断罪刃に伏線がなさすぎたせいだろうか。
RFC6570というRFCがあります。
http://tools.ietf.org/html/rfc6570
簡単に言うと、
『http://example.com/{controller}/{action}』を『http://example.com/hoge/fuga』に展開できたら楽じゃね、という最近のフレームワークでよく見かけるルーティングをRFCに仕上げたものです。
フレームワークならだいたい最初から付属しているし、自力で作るにしても簡単なのならSmartyなりZend\Uri\Uriなりで十分ですが、RFC6570に沿ったエクステンションがあったので試してみます。
使用したバージョンは1.0です。
RFC6570には4段階のレベルがありますが、uri_templateは全レベル対応しています。
完全にRFC6570に従ったURIを出力しました。
これでURIを組み立てるのが便利に…なるのか?
普通にrawurlencodeとか使った方が早い気がしないでもない。
http://tools.ietf.org/html/rfc6570
簡単に言うと、
『http://example.com/{controller}/{action}』を『http://example.com/hoge/fuga』に展開できたら楽じゃね、という最近のフレームワークでよく見かけるルーティングをRFCに仕上げたものです。
フレームワークならだいたい最初から付属しているし、自力で作るにしても簡単なのならSmartyなりZend\Uri\Uriなりで十分ですが、RFC6570に沿ったエクステンションがあったので試してみます。
使用したバージョンは1.0です。
<?php // 変換テーブル $table = [ 'var' => 'value', 'hello' => 'Hello World!', 'path' => '/foo/bar', 'empty' => '', 'x' => '1024', 'y' => '768', 'list' => ['red', 'green', 'blue'], 'keys' => ['semi'=>';','dot'=>'.','comma'=>','], ]; // レベル1 $level1 = [ '{var}' => 'value', '{hello}' => 'Hello%20World%21', ]; // レベル2 $level2 = [ '{+var}' => 'value', '{+hello}' => 'Hello%20World!', '{+path}/here' => '/foo/bar/here', 'here?ref={+path}'=>'here?ref=/foo/bar', 'X{#var}'=>'X#value', 'X{#hello}'=>'X#Hello%20World!', ]; // レベル3 $level3 = [ 'map?{x,y}' => 'map?1024,768', '{x,hello,y}' => '1024,Hello%20World%21,768', '{+x,hello,y}' => '1024,Hello%20World!,768', '{+path,x}/here' => '/foo/bar,1024/here', '{#x,hello,y}' => '#1024,Hello%20World!,768', '{#path,x}/here' => '#/foo/bar,1024/here', 'X{.var}' => 'X.value', 'X{.x,y}' => 'X.1024.768', '{/var}' => '/value', '{/var,x}/here' => '/value/1024/here', '{;x,y}' => ';x=1024;y=768', '{;x,y,empty}' => ';x=1024;y=768;empty', '{?x,y}' => '?x=1024&y=768', '{?x,y,empty}' => '?x=1024&y=768&empty=', '?fixed=yes{&x}' => '?fixed=yes&x=1024', '{&x,y,empty}' => '&x=1024&y=768&empty=', ]; // レベル4 $level4 = [ '{var:3}' => 'val', '{var:30}' => 'value', '{list}' => 'red,green,blue', '{list*}' => 'red,green,blue', '{keys}' => 'semi,%3B,dot,.,comma,%2C', '{keys*}' => 'semi=%3B,dot=.,comma=%2C', '{+path:6}/here' => '/foo/b/here', '{+list}' => 'red,green,blue', '{+list*}' => 'red,green,blue', '{+keys}' => 'semi,;,dot,.,comma,,', '{+keys*}' => 'semi=;,dot=.,comma=,', '{#path:6}/here' => '#/foo/b/here', '{#list}' => '#red,green,blue', '{#list*}' => '#red,green,blue', '{#keys}' => '#semi,;,dot,.,comma,,', '{#keys*}' => '#semi=;,dot=.,comma=,', 'X{.var:3}' => 'X.val', 'X{.list}' => 'X.red,green,blue', 'X{.list*}' => 'X.red.green.blue', 'X{.keys}' => 'X.semi,%3B,dot,.,comma,%2C', 'X{.keys*}' => 'X.semi=%3B.dot=..comma=%2C', '{/var:1,var}' => '/v/value', '{/list}' => '/red,green,blue', '{/list*}' => '/red/green/blue', '{/list*,path:4}' => '/red/green/blue/%2Ffoo', '{/keys}' => '/semi,%3B,dot,.,comma,%2C', '{/keys*}' => '/semi=%3B/dot=./comma=%2C', '{;hello:5}' => ';hello=Hello', '{;list}' => ';list=red,green,blue', '{;list*}' => ';list=red;list=green;list=blue', '{;keys}' => ';keys=semi,%3B,dot,.,comma,%2C', '{;keys*}' => ';semi=%3B;dot=.;comma=%2C', '{?var:3}' => '?var=val', '{?list}' => '?list=red,green,blue', '{?list*}' => '?list=red&list=green&list=blue', '{?keys}' => '?keys=semi,%3B,dot,.,comma,%2C', '{?keys*}' => '?semi=%3B&dot=.&comma=%2C', '{&var:3}' => '&var=val', '{&list}' => '&list=red,green,blue', '{&list*}' => '&list=red&list=green&list=blue', '{&keys}' => '&keys=semi,%3B,dot,.,comma,%2C', '{&keys*}' => '&semi=%3B&dot=.&comma=%2C', ]; // 確認 $level = array_merge($level1, $level2, $level3, $level4); foreach($level as $key=>$val){ // 変換 $template = uri_template($key, $table); if($template !== $val){ print('えらー'); } }エラーは出ません。
RFC6570には4段階のレベルがありますが、uri_templateは全レベル対応しています。
完全にRFC6570に従ったURIを出力しました。
これでURIを組み立てるのが便利に…なるのか?
普通にrawurlencodeとか使った方が早い気がしないでもない。
その1 / その2 / その3
日本語化
$ vi /etc/sysconfig/i18n
#LANG="en_US.utf8"
LANG="ja_JP.utf8"
en_USをja_JPに変更。
再起動。
「標準フォルダの名前を現在の言語に合わせて更新しますか?」には「古い名前のままにする」を選択。
X Windowが日本語になっていることを確認。
WinSCPでログイン
プロトコルSFTP、ホスト名192.168.33.10、ポート番号20、IDとパスワードはvagrant。
普通に入れる。
デフォルトではDocumentRootの編集権限がないので、
root/vagrantでも入れる。
公開サーバならPermitRootLogin noのするところだが、ローカルなので特に制限しない。
PHPを更新
CentOSデフォルトのPHPは5.3なので、最新版に更新する。
remiに早くもPHP5.6ができてたので、そちらを見るようにする。
# yum remove php*
# wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
# wget http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm
# rpm -Uvh remi-release-6.rpm
# rpm -Uvh epel-release-6-8.noarch.rpm
インストールを実行
# yum install --enablerepo=remi --enablerepo=remi-php56 php
# service httpd restart
これでPHP5.6がインストールされる。
PHP5.6.0RC1だった。はええよ。
ただ必要最低限しか入れていないため、mbstringすらない。
$ yum list --enablerepo=remi > hoge
とかやってリストから必要なパッケージを選択する。
remiにはPHPだけではなくPEARとかPECLとかSmartyとかSymfonyとかphpMyAdminまで入ってる。いみわからん。
とりあえずこんなかんじで選択。
# yum install --enablerepo=remi --enablerepo=remi-php56 php php-common php-cli php-pdo php-mysql php-devel php-gd php-bcmath php-pecl-apc php-pecl-imagick php-pecl-hrtime php-pecl-spl-types php-tidy php-mbstring php-mcrypt
gitをインストール
# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
# yum install git
$ git config --global user.name NurseAngel
$ git config --global user.email hoge@example.com
現状を保存
いつでもこの時点に戻せるように、現在のサーバ状態を保存する。
> vagrant package
> vagrant box add centos_65_32_php56 package.box
> vagrant init centos_65_32_php56
> * Vagrantfile編集
> vagrant up
vagrant packageで現在の状態がpackage.boxに保存される。
> vagrant destroy
> vagrant up
でpackage時点に戻る。
==> default: Configuring and enabling network interfaces...
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!
ARPCHECK=no /sbin/ifup eth1 2> /dev/null
Stdout from the command:
Stderr from the command:
戻らなかった。
なんかエラーにが出る。
192.168.33.10のIPアドレスが割り振られない。
http://www.absolute-keitarou.net/blog/?p=583
vagrant package前に対応しないといけないらしい。
$ sudo ln -s -f /dev/null /etc/udev/rules.d/70-persistent-net.rules
> vagrant halt
> * package.boxを削除
> vagrant package
> vagrant box remove centos_65_32_php56
> vagrant box add centos_65_32_php56 package.box
> vagrant init centos_65_32_php56
> * Vagrantfile編集
> vagrant up
これで正常にIPアドレスが割り振られるようになった。
完成
とりあえずPHPが自由に使えるサーバができた。
これで無事、やりたいことがやれるようになる。
が、特にやりたいことがなかった。
日本語化
$ vi /etc/sysconfig/i18n
#LANG="en_US.utf8"
LANG="ja_JP.utf8"
en_USをja_JPに変更。
再起動。
「標準フォルダの名前を現在の言語に合わせて更新しますか?」には「古い名前のままにする」を選択。
X Windowが日本語になっていることを確認。
WinSCPでログイン
プロトコルSFTP、ホスト名192.168.33.10、ポート番号20、IDとパスワードはvagrant。
普通に入れる。
デフォルトではDocumentRootの編集権限がないので、
root/vagrantでも入れる。
公開サーバならPermitRootLogin noのするところだが、ローカルなので特に制限しない。
PHPを更新
CentOSデフォルトのPHPは5.3なので、最新版に更新する。
remiに早くもPHP5.6ができてたので、そちらを見るようにする。
# yum remove php*
# wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
# wget http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm
# rpm -Uvh remi-release-6.rpm
# rpm -Uvh epel-release-6-8.noarch.rpm
インストールを実行
# yum install --enablerepo=remi --enablerepo=remi-php56 php
# service httpd restart
これでPHP5.6がインストールされる。
PHP5.6.0RC1だった。はええよ。
ただ必要最低限しか入れていないため、mbstringすらない。
$ yum list --enablerepo=remi > hoge
とかやってリストから必要なパッケージを選択する。
remiにはPHPだけではなくPEARとかPECLとかSmartyとかSymfonyとかphpMyAdminまで入ってる。いみわからん。
とりあえずこんなかんじで選択。
# yum install --enablerepo=remi --enablerepo=remi-php56 php php-common php-cli php-pdo php-mysql php-devel php-gd php-bcmath php-pecl-apc php-pecl-imagick php-pecl-hrtime php-pecl-spl-types php-tidy php-mbstring php-mcrypt
gitをインストール
# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
# yum install git
$ git config --global user.name NurseAngel
$ git config --global user.email hoge@example.com
現状を保存
いつでもこの時点に戻せるように、現在のサーバ状態を保存する。
> vagrant package
> vagrant box add centos_65_32_php56 package.box
> vagrant init centos_65_32_php56
> * Vagrantfile編集
> vagrant up
vagrant packageで現在の状態がpackage.boxに保存される。
> vagrant destroy
> vagrant up
でpackage時点に戻る。
==> default: Configuring and enabling network interfaces...
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!
ARPCHECK=no /sbin/ifup eth1 2> /dev/null
Stdout from the command:
Stderr from the command:
戻らなかった。
なんかエラーにが出る。
192.168.33.10のIPアドレスが割り振られない。
http://www.absolute-keitarou.net/blog/?p=583
vagrant package前に対応しないといけないらしい。
$ sudo ln -s -f /dev/null /etc/udev/rules.d/70-persistent-net.rules
> vagrant halt
> * package.boxを削除
> vagrant package
> vagrant box remove centos_65_32_php56
> vagrant box add centos_65_32_php56 package.box
> vagrant init centos_65_32_php56
> * Vagrantfile編集
> vagrant up
これで正常にIPアドレスが割り振られるようになった。
完成
とりあえずPHPが自由に使えるサーバができた。
これで無事、やりたいことがやれるようになる。
が、特にやりたいことがなかった。
セカイ魔王1 双見酔
セカイ魔王2
セカイ魔王3
☆☆☆☆☆
4コマは掲載誌に合わせているだけで、ほぼ完全なストーリーものです。
ほんわかした雰囲気のわりに登場人物の大半が変態、さらに世界の根底に絶望的なシステムが組み込まれているシリアス要素も併せ持っています。
なんでもかんでも突っ込みながらそれでいて設定が全く破綻していないという構成の妙。
徐々に明かされていく世界、登場人物たちは一体何を思い、何処に向かっていくのか。
今後がとても楽しみな話です。
打ち切りだけは止めて。
ストーリー上難しくなってきた気はしますが、またアルシャとマオの二人旅も見たいものです。
崖っぷち天使マジカルハンナちゃん1 佐藤 両々
崖っぷち天使マジカルハンナちゃん2
☆☆☆
魔法少女(29)
この文字列だけで買わざるを得ない。
魔女っ子ラムちゃん(26)も大概だったけどあちらは見た目が完全に小学生だったのに対し、こちらは外見が年相応なので色々きっつい。
魔法アイテムも少女向けにランドセルだったり、大人に変身して各職業の能力を得るアイテムだったり(大人に変身=肉体年齢+15)
しかしそれよりもきついのは、普通のOLとしての生活が普通に入り込んでくること。
極一部のファンタジー以外は完全にリアルな世界設定なので、職場バレしそうになったり隣人から壁ドンされたりと、見た目以外にも精神的にきつい戦いが見物。
あと杖で目を突いたりと物理魔法も素敵。
世の中がこんな作品ばかりになるのは超ごめんですが、ひとつくらいこういうのがあるべきでもある。
http://qiita.com/sakana_kirai/items/6e512f7aea2898a6e8f2
http://qiita.com/mpyw/items/939964377766a54d4682
アップロードされたファイルについて、getimagesize()やfinfo::file()でMIMEタイプを判定しています。
まあMIMEタイプがimage/gifだとわかったので、ファイルは見えないところに隠しておいて、出力時にきちんとContent-Typeヘッダを出してあげれば問題ありません。

お、おう。
これはIEでのみ発生する可能性のあるXSSです。
IEは設定されたContent-Typeをあまり気にせず、ファイルの中身を見て適切な形式で出力してくれるという素敵極まりない機能が付いています。
で、IEは「GIF8」をgifとはみなさず、後続のHTMLを見てHTMLと判断してくれやがるようです。
「GIF87」にすると画像と判断されます。
X-Content-Type-OptionsというHTTPヘッダによって、この余計で傍迷惑な機能を止めることができます。
http://d.hatena.ne.jp/hasegawayosuke/20110106/p1
http://blog.everqueue.com/chiba/2011/01/06/484/
結果としては、とりあえずあらゆる出力にX-Content-Type-Optionsを書いとけ、というところでしょうか。
ちなみに
http://d.hatena.ne.jp/hasegawayosuke/20110106/p1
> あらゆるコンテンツのレスポンスヘッダに X-Content-Type-Options: nosniff を付与するようにしましょう
とか書いてるこのページにはX-Content-Type-Optionsが設定されていません。
http://qiita.com/mpyw/items/939964377766a54d4682
アップロードされたファイルについて、getimagesize()やfinfo::file()でMIMEタイプを判定しています。
<?php // hoge.pngを判定 $imagesize = getimagesize('path/to/hoge.png'); $finfo = new finfo(FILEINFO_MIME_TYPE); $finfofile = $finfo->file('path/to/hoge.png'); var_dump($imagesize, $finfofile);ここでhoge.pngの中身を以下のように書き換えてみます。
GIF8<script>alert("xss");</script>結果。
array(6) { [0]=> int(29283) [1]=> int(28777) [2]=> int(1) [3]=> string(28) "width="29283" height="28777"" ["channels"]=> int(3) ["mime"]=> string(9) "image/gif" } string(9) "image/gif"なんと頭に「GIF8」と書いておくだけでMIMEタイプの判定をすり抜けてしまいました。
まあMIMEタイプがimage/gifだとわかったので、ファイルは見えないところに隠しておいて、出力時にきちんとContent-Typeヘッダを出してあげれば問題ありません。
<?php header('Content-type: image/gif'); readfile('path/to/hoge.png');これで完璧!
お、おう。
これはIEでのみ発生する可能性のあるXSSです。
IEは設定されたContent-Typeをあまり気にせず、ファイルの中身を見て適切な形式で出力してくれるという素敵極まりない機能が付いています。
で、IEは「GIF8」をgifとはみなさず、後続のHTMLを見てHTMLと判断してくれやがるようです。
「GIF87」にすると画像と判断されます。
X-Content-Type-OptionsというHTTPヘッダによって、この余計で傍迷惑な機能を止めることができます。
http://d.hatena.ne.jp/hasegawayosuke/20110106/p1
http://blog.everqueue.com/chiba/2011/01/06/484/
<?php header('Content-type: image/gif'); header('X-Content-Type-Options: nosniff'); readfile('hoge.png');これでIEでもXSSが発生しないようになります。
結果としては、とりあえずあらゆる出力にX-Content-Type-Optionsを書いとけ、というところでしょうか。
ちなみに
http://d.hatena.ne.jp/hasegawayosuke/20110106/p1
> あらゆるコンテンツのレスポンスヘッダに X-Content-Type-Options: nosniff を付与するようにしましょう
とか書いてるこのページにはX-Content-Type-Optionsが設定されていません。
その1 / その2 / その3
X Windowをインストール
ウィンドウが1枚しかないと不便なのでX Windowをインストールする。
http://qiita.com/snaka/items/4fc6f83022e01daea58a
$ sudo yum groupinstall -y "Desktop" "Desktop Platform" "X Window System" "Fonts" "Japanese Support"
$ sudo yum install vnc-server
"が『:』のキーに割り振られてて、:が『Shift+;』になってて超使いにくい。
keyconfigでは何故か直せなかった。
> vagrant reload
$ startx
無事GUIが起動した。
この後System→Preferences→Keyboardでキーボードを直すことができた。
ApacheとPHPをインストール
$ sudo yum -y install httpd
$ sudo yum -y groupinstall "PHP support"
$ sudo service httpd start
何の問題もなくインストール完了。
iptables
80番ポートが塞がれているので許可する。
$ sudo vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
2行を追加。
iptablesとApacheを再起動。Apacheはいらないかも。
$ sudo service iptables restart
$ sudo service httpd restart
ブラウザに
http://192.168.33.10/
でApacheにアクセス成功。
何故デフォルトが33.10かは不明。
自動起動設定
X WindowやApacheを自動起動するようにしておく。
$ sudo chkconfig httpd on
$ sudo vi /etc/inittab
id:3となってるところをid:5に変更。
再起動。
自動的にX Windowが起動し、192.168.33.10にアクセスできることを確認。
OSの更新
X Windowの右上あたりにある星みたいなマークをクリックするとアップデート情報が表示される。
30件出てきたが、よくわからないのでとりあえず全てInstall Updateしておいた。
まあ古いよりは新しい方がいいだろう。
VirtureBox Guest Additionsをインストール
現時点ではクリップボードやドラッグドロップを双方向にしてもコピペができない。
不便なのでどうにかする。
ホストOS(Windows側)のVirtualBoxの「デバイス」→「Guest AdditionsのCDイメージ挿入」
ゲストOSでCDが自動起動するのでインストール。
『4.3.12』だった。
何もせずともインストール完了。
なんか
Removing installed version 4.2.16 of VirtualBox Guest Additions
とか出てきたので実は要らなかったかもしれない。
で、インストールは完了したけどコピペできなかった。何故?
X Windowをインストール
ウィンドウが1枚しかないと不便なのでX Windowをインストールする。
http://qiita.com/snaka/items/4fc6f83022e01daea58a
$ sudo yum groupinstall -y "Desktop" "Desktop Platform" "X Window System" "Fonts" "Japanese Support"
$ sudo yum install vnc-server
"が『:』のキーに割り振られてて、:が『Shift+;』になってて超使いにくい。
keyconfigでは何故か直せなかった。
> vagrant reload
$ startx
無事GUIが起動した。
この後System→Preferences→Keyboardでキーボードを直すことができた。
ApacheとPHPをインストール
$ sudo yum -y install httpd
$ sudo yum -y groupinstall "PHP support"
$ sudo service httpd start
何の問題もなくインストール完了。
iptables
80番ポートが塞がれているので許可する。
$ sudo vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
2行を追加。
iptablesとApacheを再起動。Apacheはいらないかも。
$ sudo service iptables restart
$ sudo service httpd restart
ブラウザに
http://192.168.33.10/
でApacheにアクセス成功。
何故デフォルトが33.10かは不明。
自動起動設定
X WindowやApacheを自動起動するようにしておく。
$ sudo chkconfig httpd on
$ sudo vi /etc/inittab
id:3となってるところをid:5に変更。
再起動。
自動的にX Windowが起動し、192.168.33.10にアクセスできることを確認。
OSの更新
X Windowの右上あたりにある星みたいなマークをクリックするとアップデート情報が表示される。
30件出てきたが、よくわからないのでとりあえず全てInstall Updateしておいた。
まあ古いよりは新しい方がいいだろう。
VirtureBox Guest Additionsをインストール
現時点ではクリップボードやドラッグドロップを双方向にしてもコピペができない。
不便なのでどうにかする。
ホストOS(Windows側)のVirtualBoxの「デバイス」→「Guest AdditionsのCDイメージ挿入」
ゲストOSでCDが自動起動するのでインストール。
『4.3.12』だった。
何もせずともインストール完了。
なんか
Removing installed version 4.2.16 of VirtualBox Guest Additions
とか出てきたので実は要らなかったかもしれない。
で、インストールは完了したけどコピペできなかった。何故?
魔術士オーフェンはぐれ旅 鋏の託宣 秋田 禎信
魔術士オーフェンはぐれ旅 女神未来 上
魔術士オーフェンはぐれ旅 女神未来 下
☆☆☆
オーフェン落ち着きすぎだろう。
昔の彼であれば、政治がどうとかそういうことはあんまり気にせず、敵も味方もよくわからない者もとりあえず吹っ飛ばして、それから話を始めたと思うんだ。
余計なしがらみが増えたというか、余計なしがらみとオーフェンが感じていることが増えたな。
しかたなく他のキャラがオーフェンの代わりを務めるのですが、どうにも主人公キャラが主人公然としてないせいか盛り上がりにいまいち欠ける。
すずめの唄 志名坂 高次
☆☆☆
角刈りすずめといい、雀の名前がついてる麻雀漫画はアレなかんじ。
しかし角刈りすずめやぶんぶんレジデンスなどに比べるとはっちゃけっぷりが足りない。
脇握りやBJは大丈夫なのかと思うが麻雀で勝負しようぜ。
絶望の犯島―100人のブリーフ男vs1人の改造ギャル1 櫻井 稔文
☆☆☆
女性に性転換させて性犯罪者でいっぱいの島に送り込んで襲わせる。
駄目だ、発想がわからん。
あと絵柄が微妙。
正直2巻はもういいや。
しかし性犯罪者100人のうち20人くらい早々に死んでたけど人足りるのかこれ。
その1 / その2 / その3
自分用の備忘録。
http://www1205uf.sakura.ne.jp/wp/world/?p=398
http://d.hatena.ne.jp/naoya/20130205/1360062070
このあたりを真似ただけです。
Rubyをインストール
http://rubyinstaller.org/
DownloadからRuby1.9とDEVELOPMENT KITをダウンロード。
『Ruby 1.9.3-p545』『DevKit-tdm-32-4.5.2-20111229-1559-sfx.exe』だった。
2.0でもいいかもしれませんがRubyはよくわからんので前述のサイトに従った。
Rubyをインストール。
「rubyのパスを通す」にチェックを入れた。
DevKit-tdm-32-4.5.2-20111229-1559-sfx.exeを適当な場所に解凍。
コマンドプロンプトから
> cd 解凍したディレクトリ
> ruby dk.rb init
> ruby dk.rb install
なお、なにをしたかの意味はわかっていない。
VirtualBoxをインストール
https://www.virtualbox.org/
DownloadからVirtualBoxをダウンロード。
『VirtualBox 4.3.12 for Windows hosts x86/amd64』だった。
インストール時に、インストールしたディレクトリを記録しておく。
ユーザー環境変数PathにさきほどのVirtualBoxのパスを追加。
変更していない場合『C:\Program Files\Oracle\VirtualBox』だった。
Vagrantをインストール
http://www.vagrantup.com/
DOWNLOADからWindows版のLatestをダウンロード。
『vagrant_1.6.3.msi』だった。
そのままインストール。
ここでWindowsの再起動があった。
VirtualBoxのvmをインストール。
VirtualBoxはただの空HDDなので、中にOSを入れないと動かない。
http://www.vagrantbox.es/
から好きなOSを選択。
今回はCentOSの最新版、『CentOS 6.5 x86_64 (x86_64-20140116.box)』を選択。
種類がありすぎて何が何だかわからぬ。
コマンドプロンプトから
> cd C:\path\to\vagranfiledir\centos65
> vagrant box add centos_65 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
> vagrant init centos_65
vagrant box addで対象のvmをダウンロードしてくる。
ユーザディレクトリ配下の.vagrant.d\boxes以下に保存されるようだ。
vagrant initで設定ファイルVagrantfileが作成されるのだが、何故かカレントディレクトリにできる。
複数の環境で設定を分けたい場合など、Vagrantfileをディレクトリ別に分けとないといけないらしい。
もしかしたら違う設定とかあるかもしれないが、よくわからない上にこれで動いたのでよしとする。
Vagrantfileを編集
config.vm.network "private_network", ip: "192.168.33.10"
config.vm.network "forwarded_port", guest: 5901, host: 15901
config.vm.provider "virtualbox" do |vb|
vb.gui = true
vb.customize ["modifyvm", :id, "--memory", "1024"]
end
のコメントを外す。
forwarded_portは値も変更する。
値に何らかの意図があるのかは不明。たぶん適当。
http://qiita.com/snaka/items/4fc6f83022e01daea58a
192.168.33.10はデフォルトのまま。どうしてこのアドレスかは不明。
なお
config.vm.network "public_network"
を有効にすると外部から見える状態になるので注意。
Vagrantを起動
> vagrant up
This kernel requires an x86-64 CPU, but only detected an i686 CPU.
Unable to boot - please use a kernel appropriate for your CPU.
あふん。
32ビットCPUなので、x86-64のOSは動かねーよという。
VirtualBoxのvmを再度インストール
『CentOS 6.5 i386 Minimal (VirtualBox Guest Additions 4.2.16, Chef 11.6.0, Puppet 3.2.3)』を選択。
> cd C:\path\to\vagranfiledir\centos65
> vagrant box add centos_65 https://dl.dropbox.com/s/3fgr7lbvcpn51py/centos_6-5_i386.box
> vagrant init centos_65
> * Vagrantfile編集
> vagrant up
This kernel requires an x86-64 CPU, but only detected an i686 CPU.
Unable to boot - please use a kernel appropriate for your CPU.
あれー???
どうもcentos_65というvmがvagrant box addでは上書きされず、古いのが起動したっぽい。
仕方ないので名前を変える。
> vagrant destroy
> cd C:\programfiles\vagranfiledir\centos65_32
> vagrant box add centos_65_32 https://dl.dropbox.com/s/3fgr7lbvcpn51py/centos_6-5_i386.box
> vagrant init centos_65_32
> * Vagrantfile編集
> vagrant up
何度もダウンロードしてて無駄っぽいが、対処方法わからず。
Vagrantを起動
> vagrant up
> CentOS release 6.5 (Final)
> Kernel 2.6.32-431.11.2.e16.i686 on an i686
> localhost login:
ついにVirtualBoxが起動した。
やれやれ。
で、このID/パスワードは何だ?
http://weblabo.oscasierra.net/windows-vagrant-1/
ID/パスワード共にvagrantで入れた。
Vagrantにログイン
> vagrant ssh
> `ssh` executable not found in any directories in the %PATH% variable.
SSHなんてねえよ、Cygwinか何かSSH使えるものを入れろ、って言われた。
さすがにcmdでは駄目だったか。
自分用の備忘録。
http://www1205uf.sakura.ne.jp/wp/world/?p=398
http://d.hatena.ne.jp/naoya/20130205/1360062070
このあたりを真似ただけです。
Rubyをインストール
http://rubyinstaller.org/
DownloadからRuby1.9とDEVELOPMENT KITをダウンロード。
『Ruby 1.9.3-p545』『DevKit-tdm-32-4.5.2-20111229-1559-sfx.exe』だった。
2.0でもいいかもしれませんがRubyはよくわからんので前述のサイトに従った。
Rubyをインストール。
「rubyのパスを通す」にチェックを入れた。
DevKit-tdm-32-4.5.2-20111229-1559-sfx.exeを適当な場所に解凍。
コマンドプロンプトから
> cd 解凍したディレクトリ
> ruby dk.rb init
> ruby dk.rb install
なお、なにをしたかの意味はわかっていない。
VirtualBoxをインストール
https://www.virtualbox.org/
DownloadからVirtualBoxをダウンロード。
『VirtualBox 4.3.12 for Windows hosts x86/amd64』だった。
インストール時に、インストールしたディレクトリを記録しておく。
ユーザー環境変数PathにさきほどのVirtualBoxのパスを追加。
変更していない場合『C:\Program Files\Oracle\VirtualBox』だった。
Vagrantをインストール
http://www.vagrantup.com/
DOWNLOADからWindows版のLatestをダウンロード。
『vagrant_1.6.3.msi』だった。
そのままインストール。
ここでWindowsの再起動があった。
VirtualBoxのvmをインストール。
VirtualBoxはただの空HDDなので、中にOSを入れないと動かない。
http://www.vagrantbox.es/
から好きなOSを選択。
今回はCentOSの最新版、『CentOS 6.5 x86_64 (x86_64-20140116.box)』を選択。
種類がありすぎて何が何だかわからぬ。
コマンドプロンプトから
> cd C:\path\to\vagranfiledir\centos65
> vagrant box add centos_65 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
> vagrant init centos_65
vagrant box addで対象のvmをダウンロードしてくる。
ユーザディレクトリ配下の.vagrant.d\boxes以下に保存されるようだ。
vagrant initで設定ファイルVagrantfileが作成されるのだが、何故かカレントディレクトリにできる。
複数の環境で設定を分けたい場合など、Vagrantfileをディレクトリ別に分けとないといけないらしい。
もしかしたら違う設定とかあるかもしれないが、よくわからない上にこれで動いたのでよしとする。
Vagrantfileを編集
config.vm.network "private_network", ip: "192.168.33.10"
config.vm.network "forwarded_port", guest: 5901, host: 15901
config.vm.provider "virtualbox" do |vb|
vb.gui = true
vb.customize ["modifyvm", :id, "--memory", "1024"]
end
のコメントを外す。
forwarded_portは値も変更する。
値に何らかの意図があるのかは不明。たぶん適当。
http://qiita.com/snaka/items/4fc6f83022e01daea58a
192.168.33.10はデフォルトのまま。どうしてこのアドレスかは不明。
なお
config.vm.network "public_network"
を有効にすると外部から見える状態になるので注意。
Vagrantを起動
> vagrant up
This kernel requires an x86-64 CPU, but only detected an i686 CPU.
Unable to boot - please use a kernel appropriate for your CPU.
あふん。
32ビットCPUなので、x86-64のOSは動かねーよという。
VirtualBoxのvmを再度インストール
『CentOS 6.5 i386 Minimal (VirtualBox Guest Additions 4.2.16, Chef 11.6.0, Puppet 3.2.3)』を選択。
> cd C:\path\to\vagranfiledir\centos65
> vagrant box add centos_65 https://dl.dropbox.com/s/3fgr7lbvcpn51py/centos_6-5_i386.box
> vagrant init centos_65
> * Vagrantfile編集
> vagrant up
This kernel requires an x86-64 CPU, but only detected an i686 CPU.
Unable to boot - please use a kernel appropriate for your CPU.
あれー???
どうもcentos_65というvmがvagrant box addでは上書きされず、古いのが起動したっぽい。
仕方ないので名前を変える。
> vagrant destroy
> cd C:\programfiles\vagranfiledir\centos65_32
> vagrant box add centos_65_32 https://dl.dropbox.com/s/3fgr7lbvcpn51py/centos_6-5_i386.box
> vagrant init centos_65_32
> * Vagrantfile編集
> vagrant up
何度もダウンロードしてて無駄っぽいが、対処方法わからず。
Vagrantを起動
> vagrant up
> CentOS release 6.5 (Final)
> Kernel 2.6.32-431.11.2.e16.i686 on an i686
> localhost login:
ついにVirtualBoxが起動した。
やれやれ。
で、このID/パスワードは何だ?
http://weblabo.oscasierra.net/windows-vagrant-1/
ID/パスワード共にvagrantで入れた。
Vagrantにログイン
> vagrant ssh
> `ssh` executable not found in any directories in the %PATH% variable.
SSHなんてねえよ、Cygwinか何かSSH使えるものを入れろ、って言われた。
さすがにcmdでは駄目だったか。