以前、Xにて
クソコードがどんなものか知らない人は、知ろうとしてはいけない。コードだけではなくミドルウェアの設定からクソは始まっているのだから…
と発言して、ふと思ったのですが、技術系ブログにて、クソコードについての投稿は多いようですがでミドルウェアの設定で苦労したという話があまりないので丁度最近行った闇の作業を感じたままに書く。
それは、どこにある?から始まる
dig +short example.com | xargs -I % dig -x %
xxx.xxx.xxx.xxx.in-addr.arpa. 600 IN PTR On-prem.hogefuga.
とりあえず、ドキュメント漁ってsshする。
sshしたら負け?知るか
ログイン後のメッセージでOSがFreeBSDであることが分かった。
Webサーバー何使ってるか見る
ps ax | grep -e nginx -e httpd
28836 - Is 0:00.01 nginx: master process /usr/local/sbin/nginx
2656 - IJ 4:25.32 /usr/local/sbin/httpd
...
どっちも使ってる。
ポートを見てみる
sockstat | grep -E '(nginx|httpd)'
Nginx: 80, 443
Apache: 80
ポート80番が重複していて問題が発生していないことから、このサーバーはjail(FreeBSDなので)を持っていて、ホストのNginxで受けて各jailのApacheにリバースプロキシしてるっぽいと予想しつつNginxの設定を確認する。
example.comの設定を見る
...
location / {
proxy_pass http://192.168.yyy.yyy;
}
...
jailも確認
jls -v
JID Hostname Path
Name State
CPUSetID
IP Address(es)
1 sv001 /jails/sv001
sv001 ACTIVE
...
35 sv_example /jails/sv_example
sv_example ACTIVE
36
zzz.zzz.zzz.zzz
192.168.yyy.yyy
...
あってた。
さっそく見にいく。
jexec 35 /bin/csh
jexec: execvp: /bin/csh: No such file or directory
くっころ
jexec 35
入れた。
Apacheが動いてるかを確認する
ps ax | grep httpd
3316 ?? SJ 0:38.76 /usr/local/apache2/bin/httpd
I DO !
I DO !
I DO !
いる。apache2
、いる。
設定を見にいく
cd /usr/local/etc/ && ls
いない。
cd ../apache2/conf && ls
いた。
httpd.confを確認すると以下の記述が目に留まる。
<Directory /web/>
Options FollowSymLinks
AllowOverride All
Order deny,allow
Allow from all
</Directory>
/web以下にコンテンツ置いてそうだということが分かった。
ここには他にめぼしい設定がないので、httpd-vhosts.confを見に行く。
cat extra/httpd-vhosts.conf
include conf/vhosts/example/*.conf
#include conf/vhosts/example1/*.conf
include conf/vhosts/example2/*.conf
...
Shit !
ls -l ../vhosts/example/
-rw-r--r-- 1 root wheel 4096 May 23 2010 ._www.conf
-rw-r--r-- 1 root wheel 1044 May 28 2010 www.conf
いた。
Macユーザーの悪行を発見したが、華麗にスルー。
てか、このディレクトリはローカルから転送したのか...
rm
せず、www.confを読み進める。
cat ../vhosts/example/www.conf
<VirtualHost *:80>
ServerName www.example.com
DocumentRoot /web/example.com/www/public_html
<Directory /web/example.com/www/public_html>
php_value include_path ".:/web/example.com/www/etc:/web/example.com/etc:/web/example.com/www/lib/:/web/example.com/lib:/usr/local/hoge:/usr/local/lib/php"
php_value auto_prepend_file prepend.php
php_flag mbstring.encoding_translation on
php_value mbstring.language Japanese
php_value mbstring.internal_encoding EUCJP-WIN
php_value mbstring.script_encoding SJIS-WIN
php_value mbstring.http_output SJIS-WIN
php_value mbstring.http_input SJIS-WIN
php_flag display_errors off
</Directory>
</VirtualHost>
気になるinternal_encoding
。
でも、それで動いているのだから気にしない。
それよりも、include_path
が魔境。
それでずっと動いてきたものは基本的に何もしてはいけないと思っている(敬意)
では、さっそく/web/example.com/www/public_html
に移動して該当と思われるコードを確認する。
<?php
if(!CHKRLS($SYEAR,$SMONTH,$SDATE,$SHOUR,$SMIN,$SSCND,$EYEAR,$EMONTH,$EDATE,$EHOUR,$EMIN,$ESCND) AND !eregi("test",$URLBASE)){
print $_NAME_E;
}else{
if($PC){
$CONTENT=$CRNTDIR."/content.php";
}else{
$CONTENT=$CRNTDIR."/content_1.php";
}
include($BASE);
}
?>
\(^o^)/くっころ\(^o^)/
まだ、読むには早かったようだ。
しかし、やることは決まった。
auto_prepend_file
を見ることだ。
探す
cd /web/example.com/www
find . -name prepend.php
./etc/prepend.php
いた。
if(isset($_REQUEST['c'])){$c=$_REQUEST['c'];}else{$c=NULL;}
require_once("config.php");
require_once("common_lib.php");
require_once("dbconnect.php");
require_once("util.php");
require_once("func.php");
そのうち分かってくるだろうから、今はcが何かを気にしてはいけないし、コードの記述について何も感じてはいけない。
本来の目的を見失い、気になるところを直しているだけで日が暮れるからだ。
最初に確認しておきたいファイルNo.1であるconfig.phpを探す
まぁ、同階層に...
ls -l
-rw-r--r-- 1 root wheel 595 May 26 2010 prepend.php
ないよね。
ls -l ../lib
-rw-r--r-- 1 root wheel 870 May 30 2010 bn.php
ない。
bnって何だ(でも見ない)
ということは/usr/local以下の謎ディレクトリにあるということだな。
ls -l /usr/local/hoge
-rw-r--r-- 1 root wheel 7 Apr 21 2008 check.php
-rw-r--r-- 1 root wheel 11238 Jan 25 2008 common_lib.php
-rw-r--r-- 1 root wheel 8239 Jun 10 2007 dbconnect.php
-rw-r--r-- 1 root wheel 4824 Jan 22 2007 func.php
-rw-r--r-- 1 root wheel 24 Apr 11 2008 load.php
-rw-r--r-- 1 root wheel 1212 Apr 22 2008 util.php
\prependファイルで読んでたfunc.phpなどは秘伝のタレであることがわかった/
てか、config.phpいないんですけど!!
(ここで、30分くらいハマる)
include_pathの中で見ていないディレクトリがあることに気が付き舌を頬に向かって出しながら中身を確認する。
ls -l /web/example.com/etc
-rw-r--r-- 1 root wheel 7504 Apr 16 2021 config.php
あった。
ちょっとだけ、テンション上がるも未だ何も作業は進んでいない。
cat /web/example.com/etc/config.php
<?php
$DIRBASE=$_SERVER["DOCUMENT_ROOT"]."";//?L???????g???[?g
...変数初期化が永遠と続く
俺たちの戦いはこれからだ . ""
多くの寄り道をすることになったが、様々なコードを開きながら、問題にたどり着き修正することが出来た。
コードだけ見ていたとするとgrep -r
を永遠にすることになり、
/usr/local/hoge
にあるコードは/からfind
して見つけるしかなかっただろう…。
コードも設定も良い設計と可読性が本当に大切だなと思いながら今日も強く生きています。
お目汚し失礼しました。