新人PGの学び

プログラマーの卵のlog

アカウント漏れ確認用サイト

■アカウント漏れ確認用サイト
Microsoft地方支配人のセキュリティ開発者としてMVPも受賞したことがあるトロイ・ハントさん作成の信頼性が高いサイトで有名とのこと
自分の保有するアカウントの危険性を無料かつ簡単にチェックできるようにするウェブサービス


PHPでHTMLブラウザに受け渡す場合に改行が空白になる

■事象

PHPでSmarty変数に受け渡す場合に改行が空白になる


■原因

PHPスクリプト中で改行「"\n"」を入れてもブラウザでの表示結果には反映されない。
ブラウザはHTML文書を解釈して表示するアプリケーションのためブラウザ上で改行する場合は、HTMLの改行タグ「
」を入れないといけない。


■対応

※Smartyでの書き方

・正規表現で置換

({"/\n/"|preg_replace:"
":$body})


・Smartyの関数で置換

({$body|nl2br})



■参考になるサイト


logrotateとSIGHUPによるApacheの異常終了

logrotateとは

ログ肥大化を防ぐために不要な過去のログを圧縮しディスクのサイズを確保する


再起動後Apacheダウン不具合

あるサーバーで、ログローテーション後に再起動がかかるはずが、正常に再起動せず
Apacheがダウンしたままだった


原因の一因はバグ?!

正常に起動しない一因として、ログローテーション後に「reload」で再起動設定。
reloadはSIGHUPというをシグナルを発行するが、SIGHUPを受けてApacheが異常終了するのは、CentOS 5でapache 2.2+PHP 5.1.6の環境においてたまに生じるバグだった。


対応・対策

logrotate自体を変更するのは、影響範囲が怖い・・・。
異常終了した場合に自動復旧スクリプトを組み込む事にした。
Zabbix(監視ツール)である通知をtriggerとしてアクション設定が必要。

routing追加対応

■概要

XXXサーバーからAPI側のgatewayサーバーへ接続可能にする対応
※今回の構成上、gatewayサーバーは中継サーバーを経由しているため
中継サーバーにも設定が必要

■routing追加IP

#gateway用

XXX.XX.XXX.0/20


#中継サーバー用

YYY.YY.YYY.0/24


■検証

・gateway(XXX.XX.XXX.XX)のping疎通


routing追加対応

■現在のrouting設定表示

[root@ ~](VM-GUEST)# /sbin/route -n

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

111.11.11.111 0.0.0.0 255.255.255.224 U 0 0 0 eth0


222.22.222.0 333.33.333.3 255.255.255.0 UG 0 0 0 eth1

444.44.444.0 555.55.555.5 255.255.255.0 UG 0 0 0 eth1


■routing追加コマンド

route add -net XXX.XX.XXX.0/20 gw XXX.XX.111

route add -net YYY.YY.YYY.0/24 gw XXX.XX.111


static routeの設定

※再起動時に設定が消えないための対応
●確認

less /etc/sysconfig/static-routes


●追加項目

any net XXX.XX.XXX.0 netmask 255.255.240.0 gw 172.16.111.254

any net YYY.YY.YYY.0 netmask 255.255.255.0 gw 172.16.111.254

URLのパラメータに"+"文字がある場合空白になる

■事象
URLのパラメータに"+"文字がある場合空白になってエラーになっていた

作業的にはログインIDとPASSを暗号化したURL等を確認していた


可逆暗号化のための準備

<暗号化方法>

base64でエンコード→mcrypt_genericで暗号化→base64でエンコード


 <復号化方法>

 base64でデコード→mdecrypt_genericで復号化→base64でデコード


■空だよの下記エラー

Warning: mdecrypt_generic() [function.mdecrypt-generic]: An empty string was passed in /www/XXX.php on line 87


Warning: mdecrypt_generic() [function.mdecrypt-generic]: An empty string was passed in /www/XXX.php on line 88


■該当箇所のソース

//パラメータ取得

if(isset($_GET["login_id"]) && $_GET["login_id"]){

$loginId = $_GET["login_id"];

}

if(isset($_GET["login_pass"]) && $_GET["login_pass"]){

$loginPass = $_GET["login_pass"];

}



~省く~

/*

* 復号化

*/


//ID・PASSの復号化

//エラー該当箇所の87行目

$dec_str_id = mdecrypt_generic($td, base64_decode($loginId));

$dec_str_pass = mdecrypt_generic($td, base64_decode($loginPass));




■原因
php側のグローバル関数の$_GETがURLを自動でurldecodeしていた。
urldecodeでは、"+"を空白スペースに自動変換する処理がある(半角空白、%20も同様)ため、$_GET["login_id"]取得していた時点でおかしくなっていた。
そのため、mdecrypt_genericで複合化する際、二個の文字列と判断されエラーになっていた。

■対策
各サイトを確認したが、結果的にはURL自体をエンコードすることにした。

■考え方
$_GETは、urldecode()関数を介して値が渡される


■超絶わかりやすかったサイト

→$_GET は urldecode()関数を介した値が渡されるのか!


■似た現象のサイト

→rewriteRuleで解決してる



→POSTで解決している


→URLをエンコードしないといけないのね。


■PHPで自動変換事例

→PHP は“.”(ドット)を“_”(アンダースコア)に自動的に変換する事例




→上記の旨を記載している本家PHP説明サイト
PHP: 外部から来る変数 - Manual


■URLエンコードサイト