Last Edit Date: 09/11/2009
Akuakuの基本動作
akuakuで使われているプログラムで次の箇所を変更修正してください。
aragoiuが7.5以前のunices版の時には
SET MAXID が ONに初期化されています。 最新版にアップデートするか、変数名を10バイト以下にしてください。
*******************************
FUNCTION GETLMENU
*******************************
PARAMETERS VAL1 && pagename
SELECT 5
USE lmenu
SKEY = VAL1
IF .NOT. EMPTY(SKEY)
SET EXACT ON <---追加
GO TOP
DO WHILE .NOT. EOF()
LOCATE FOR TOPMENU = SKEY REST &&SEEK(SKEY)
IF .NOT. EOF() .AND. DELETE = .F.
OUTPUT('<tr align="left"><td><a href="http://' + WEBURL + '/' + RTRIM(pagenameii) +'.html" >' + RTRIM(menu) + '</a></tr></td>')
SKIP
ENDIF
ENDDO
SET EXACT OFF <---追加
ENDIF
RETURN .T.
*******************************
のように修正してください。 この修正は最初の部分が一致するメニュー名が使われたときに、二重にメニューが表示されるのを避けるためです。、
USE content INDEX pagename, laccess
**master index is PAGENAME
THISPAGE = LOWER(THISPAGE) <---を追加
**Locate right record
IF .NOT. SEEK(THISPAGE)
この修正を行うときには、content.dbfの該当するフィールドの内容をLOWER()してください。 これは呼ばれたABC.HTMLとabc.htmlを識別してしまうからです。 それを防ぐために小文字に統一しています。
プログラムの中でLEN()を使っている部分ですが、現在のUTF-8版では
SET LANGUAGE TO UTF-8
では文字数を返します。
次のような使い方のところでは
RDATA = FWRITE(FHANDLE, source, LEN(source))
SET LANGUAGE TO ANSI
RDATA = FWRITE(FHANDLE, source, LEN(source))
SET LANGUAGE TO UTF-8
としてください。
基本となるwww.aaa.comへのアクセスの時で説明します。 Apache内部ではURLにページ名が明示されていないときにrewrite.prgを呼ぶように指定してありますが? それと同時に
Apacheではmod_rewriteが有効になっています。 mod_rewriteでファイル名の指定が無いときには/akuakuディレクトリのrewrite.prgを実行するように設定されています。
rewrite.prgの解説
mod_rewriteでrewrite.prgが起動されます。 rewrite.prgには実行権が設定されています。 その結果Apacheのcgi処理部分でEXEC()でrewrite.prgを呼び
出し、EXEC()は、rewrite.prgの先頭の行の指定によりrewrite.prgをaragoi.exeで実行します。
あたかもwindowsでファイルの拡張子で実行するexeを指定しているのと同じですが、windowsの拡張子での関連付けは、関連付けされた、全ての同じ拡張子を持つファイルは自動的に関連付
けられたEXEを実行します。 しかしwindowsの関連付けでは、アタックを意図するものが、同じ拡張子のファイルをアップロードすることで、そのファイルを外部から実行することができます。
実行されるファイルの先頭での#!で実行するEXEファイルを指定する方法では、外部からどのように何を呼んでいるのかは見えません。 #!で指定するディレクトリはaragoiuが置かれたディレクトリです
。 ご自由にお決めください。
rewrite.prgで起動されるページのプログラムにerrorがあるとApacheはrewrite.prgのerrorとしてlogに返します。 ご注意ください。
#!/usr/local/aragoi/aragoi.exe rewrite.prg <-aragoiを起動
SET COMPATIBLE OFF
prgname = getarg(3) <-引数であるページ名(ファイル名)を取得
IF EMPTY(prgname)
prgname = "index" もし引数が無い時はindex.htmlとして返すために
ENDIF
USE content INDEX pagename, laccess データベースのオープン
IF SEEK(prgname ) 検索する
source = pagesource <- memoフィールド pagesourceからコピーする
FHANDLE = FCREATE(prgname + ".prg") <-実行するプログラムファイルをcreateする
RDATA = FWRITE(FHANDLE, source, LEN(source)) <-作成したファイルにsourceを書き込み
RET = FCLOSE(FHANDLE) <-クローズする
USE
programname = prgname + ".prg" <-実行ファイル名として.prgを加える
do &programname <-プログラムの実行
DELETE FILE prgname + ".prg" <-プログラムが実行されたあとprgファイルの削除
DELETE FILE prgname + ".pro" <-proファイルを削除
ELSE
HTML pagenotfound.html <-検索して見つからなかったときはエラーページ表示
ENDIF
rewrite.prgが実行されると、rewrite.prgで生成した、この例の場合では、index.prg、は実行されると、prg、proファイルをすぐに削除します。 cgiディレクトリは外部からアクセ
スすることはできませんが、不要ファイルはセキュリティを考えて削除しています。
同じような考えでaragoiのプログラム内部からから別のprgを実行する為に使うrewrite2.rgもあります。
#!/usr/local/aragoi/aragoi.exe rewrite2.prg
PARAMETERS prgname, superuser
SET COMPATIBLE OFF
IF EMPTY(prgname)
prgname = "index"
ENDIF
USE content INDEX pagename, laccess
IF SEEK(prgname )
source = pagesource
FHANDLE = FCREATE(prgname + ".prg")
RDATA = FWRITE(FHANDLE, source, LEN(source))
RET = FCLOSE(FHANDLE)
USE
programname = prgname + ".prg"
do &programname
DELETE FILE prgname + ".prg"
DELETE FILE prgname + ".pro"
ELSE
HTML pagenotfound.html
ENDIF
| Advertisement |
|
|