ScriptBasic講座
[入力データの検査をしよう]



1.書込み文字数制限を作ろう
一回の書込みで10000文字も書くなんていうのは通常考えられないことです。
こういう書込みは大半が悪戯目的です。また、悪戯でなくても操作ミスがほとんどでしょう。
意味のない文章がダラダラと続くのは掲示板を読む人にとって大変、不愉快です。
ここでは文字数制限で悪戯や間違い投稿を防ぎましょう。





2.各文字数の目安
お名前:全角15文字もあれば十分でしょう(半角だと30文字)
Email:半角64文字以下としましょう
URL:半角128文字以下としましょう。
コメント:全角1000文字以下としましょう(半角だと2000文字)

上記はあくまで目安です。掲示板の利用目的によって大きく異なるでしょう。
例えば掲示板で詩や小説を投稿させる場合は1000字では少ないと思います。その場合は増やしてください。
ただ、長すぎる場合はInternal Server Errorになる場合があります





3.どうやって文字数検査をするか?
LEN()関数を使うことで文字数を調べられます。あとはIF LEN() >1000 THEN などとすることで1000字を超えた場合、
つまり1000字以下でない場合、THEN以降を実行させることが出来ます。

▼変数commentが1000字以下でない場合、abcdを表示する
 IF LEN(comment) >1000 THEN print "abcd"





4.まずはコメント文字数を1000文字以下に・・・

-bbs8.bas-
#!/usr/bin/scriba

import cgi.bas

'commentが送信されているか?
IF cgi::POSTParam("comment") <> undef Then
        
        '変数に代入
        comment=cgi::POSTParam("comment")
        onamae=cgi::POSTParam("onamae")
        email=cgi::POSTParam("email")
        url=cgi::POSTParam("url")

        'HTMLタグの置換
        comment=REPLACE(comment,"<","&lt;")
        comment=REPLACE(comment,">","&gt;")

        onamae=REPLACE(onamae,"<","&lt;")
        onamae=REPLACE(onamae,">","&gt;")
        email=REPLACE(email,"<","&lt;")
        email=REPLACE(email,">","&gt;")
        url=REPLACE(url,"<","&lt;")
        url=REPLACE(url,">","&gt;")

        '入力検査部分
        IF len(comment)>1000 then CALL errormes()

        '改行を<br>に
        comment=REPLACE(comment,"\r\n","<br>")
        comment=REPLACE(comment,"\r","<br>")
        comment=REPLACE(comment,"\n","<br>")
        
        '書き込み
        open "bbslog3.txt" for append as 1

        'ロック
        LOCK #1,write

        print #1,onamae,"<>",comment,"<>",email,"<>",url,"\n"
        
        'ロック解除
        LOCK #1,release
        close 1
END IF

print "Content-Type: text/html; charset=euc-jp\n\n"

print """
<html><body>
<form action="bbs8.bas" method="POST">
お名前:<input type="text" name="onamae" size=20><br>
Email:<input type="text" name="email" size=20><br>
▼コメント<br>
<textarea name="comment" rows=4 cols=40></textarea><br>
URL:<input type="text" name="url" value="http://" size=50><br>
<input type="submit" value="送信">
</form>
"""

'読み込み部分(ファイルが存在する場合)
IF FILEEXISTS("bbslog3.txt") Then
        open "bbslog3.txt" for input as 1

        '最後までループ
        while NOT(EOF(1))
                'dataに代入
                line input #1,data

                'dataが存在するか?
                IF len(data)>0 Then
                        '分割:<>で分割
                        split data by "<>" to onamae,comdata,email,url
                        
                        
                        
                        'emailが書き込まれているか?
                        IF email <> "" Then 
                                print "お名前:<a href=\"mailto:",email,"\">",onamae,"</a>"
                        ELSE
                                print "お名前:",onamae
                        END IF


                        print "<br>",comdata,"<br>"
                        
                        'urlがhttp://以外なら
                        IF url<>"http://\n" Then print "<a href=\"",url,"\">",url,"</a>"
                        
                        print "<hr>"

                END IF
        wend
        close 1
ELSE
        print "ファイルがありません"
END IF

print "</html></body>"


'errormesサブルーチン
SUB errormes
        'メッセージを出力
        print "Content-Type: text/html; charset=euc-jp\n\n"
        print "<html><body>入力データにエラーが存在します</body></html>"
        'ここでプログラム終了
        END
END SUB


エラー時の処理を書くため、サブルーチンを利用しました。
追加した部分は書き込み部分のIF len(comment) >1000 then CALL errormes()errormesサブルーチンだけです。
また、例によってCGIの名前をbbs8.basに変更しています。掲示板のログファイルはbbslog3.txtのままです。

このCGIは掲示板書き込み時、コメントを変数commentに代入し、<を&lt;に>を&gt;に置換します。
そしてIF len(comment) >1000 then CALL errormes()を実行します。
len()関数は半角文字数を返す関数です。ここではcommentの文字数を半角で返します。
len(comment)が1000より大きな数字を返してきた場合、このIFの条件式は真(TRUE)となりthen以降のCALL errormes()
を実行します。CALLはサブルーチンを呼び出す命令です。こうすることによりコメントが1000より大きい場合、
errormes()サブルーチン内の命令を実行させることができます

▼サブルーチンの記述
SUB サブルーチン名
 サブルーチンの中身
ENDSUB


▼サブルーチンの呼び出し
CALL サブルーチン名


エラーの場合、CALL errormes()でerrormesサブルーチンが呼び出されました。
print "Content-Type: text/html; charset=euc-jp\n\n"を書き、ブラウザなどに「HTML形式のデータですよ」と伝えます。
print "<html><body>入力データにエラーが存在します</body></html>"でエラーメッセージを出力します。

通常はEND SUBにたどりつくと再び呼び出した部分に戻るのですが、それでは書込みが続行されてしまいますので、
今回はENDを書き、プログラムの実行をここで終了しています。ENDはプログラムを終了させる命令です。





5.チェック項目を増やそう
-bbs9.bas-
#!/usr/bin/scriba

import cgi.bas

'commentが送信されているか?
IF cgi::POSTParam("comment") <> undef Then
        
        '変数に代入
        comment=cgi::POSTParam("comment")
        onamae=cgi::POSTParam("onamae")
        email=cgi::POSTParam("email")
        url=cgi::POSTParam("url")

        'HTMLタグの置換
        comment=REPLACE(comment,"<","&lt;")
        comment=REPLACE(comment,">","&gt;")

        onamae=REPLACE(onamae,"<","&lt;")
        onamae=REPLACE(onamae,">","&gt;")
        email=REPLACE(email,"<","&lt;")
        email=REPLACE(email,">","&gt;")
        url=REPLACE(url,"<","&lt;")
        url=REPLACE(url,">","&gt;")

        '入力検査部分
        IF onamae="" then CALL errormes()
        IF comment="" then CALL errormes()

        '文字数検査
        IF len(comment)>1000 then CALL errormes()
        IF len(onamae)>30 then CALL errormes()
        IF len(email)>64 then CALL errormes()
        IF len(url)>128 then CALL errormes()

        '改行を<br>に
        comment=REPLACE(comment,"\r\n","<br>")
        comment=REPLACE(comment,"\r","<br>")
        comment=REPLACE(comment,"\n","<br>")
        
        '書き込み
        open "bbslog3.txt" for append as 1

        'ロック
        LOCK #1,write

        print #1,onamae,"<>",comment,"<>",email,"<>",url,"\n"
        
        'ロック解除
        LOCK #1,release
        close 1
END IF

print "Content-Type: text/html; charset=euc-jp\n\n"

print """
<html><body>
<form action="bbs9.bas" method="POST">
お名前:<input type="text" name="onamae" size=20><br>
Email:<input type="text" name="email" size=20><br>
▼コメント<br>
<textarea name="comment" rows=4 cols=40></textarea><br>
URL:<input type="text" name="url" value="http://" size=50><br>
<input type="submit" value="送信">
</form>
"""

'読み込み部分(ファイルが存在する場合)
IF FILEEXISTS("bbslog3.txt") Then
        open "bbslog3.txt" for input as 1

        '最後までループ
        while NOT(EOF(1))
                'dataに代入
                line input #1,data

                'dataが存在するか?
                IF len(data)>0 Then
                        
                        '分割:<>で分割
                        split data by "<>" to onamae,comdata,email,url
                        
                        'emailが書き込まれているか?
                        IF email <> "" Then 
                                print "お名前:<a href=\"mailto:",email,"\">",onamae,"</a>"
                        ELSE
                                print "お名前:",onamae
                        END IF


                        print "<br>",comdata,"<br>"
                        
                        'urlがhttp://以外なら
                        IF url <>"http://\n" Then print "<a href=\"",url,"\">",url,"</a>"
                        
                        print "<hr>"

                END IF
        wend
        close 1
ELSE
        print "ファイルがありません"
END IF

print "</html></body>"


'errormesサブルーチン
SUB errormes
        'メッセージを出力
        print "Content-Type: text/html; charset=euc-jp\n\n"
        print "<html><body>入力データにエラーが存在します</body></html>"
        'ここでプログラム終了
        END
END SUB

以下の検査を新たに追加しました。
・お名前が書かれているか?
・コメントが書かれているか?
・お名前が30文字以下か?
・emailが64文字以下か?
・urlが128文字以下か?


戻る

ウメ研究所