ARAGO for Internet Wiki Project AkuAku

This web site is powered by Arago for Internet v7.0 UTF-8 edition on FreeBSD
SPC main menu Expand/Fold
Products 取扱商品 Expand/Fold
SouthWind  Expand/Fold
Q&A Technical support Expand/Fold
BBS 掲示板 Expand/Fold
Easy PC life Expand/Fold

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 Expand/Fold