LoginSignup
2
1

17年前から塩漬けされているWebシステム修正についての役に立たない手記

Posted at

以前、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して見つけるしかなかっただろう…。


コードも設定も良い設計と可読性が本当に大切だなと思いながら今日も強く生きています。

お目汚し失礼しました。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1