| hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。 |
小ワザ
by araran
ゲームの結果などをサーバー上のCGIにPOSTするモジュールを作ってみる。
サーバーを利用した各種アイディアに転用できるよう解説して行く事にしました。
POSTメソッドを使って、それなりにセキュアにやる。
URLエンコードする。日本語にも対応する?
サーバー側のサンプルCGIも作ってみる。
通信について解説すると長くなるのでOSI参照モデルの第4層(トランスポート層)までのTCP、UDPなどの解説は省きます。
第5層(セッション層)からの解説を行ないます。
OSI参照モデルの全体は出典: フリー百科事典『ウィキペディア(Wikipedia)』を参考にしてください。
具体的にはHTTPプロトコルについて解説します。
HTTPプロトコルとは、TCP/IP上での通信プロトコルであり、RFC 2616により定義されています。
HTTPの説明はそのうち書きます。
まぁ、telnetすると以下の感じなわけです。
% telnet www.xxxx.co.jp 80 Trying xxx.xxx.xxx.xxx ... Connected to xxx.xxx.xxx.xxx. Escape character is '^]'. >POST /cgi-bin/hoge.cgi HTTP/1.0\n\n >Content-type: application/x-www-form-urlencoded >Content-length: xx > >name1=value1&name2=value2
>が入力部分。
#include "hspsock.as" sdim a,64000 sockopen 0, "www.xxxx.co.jp", 80 sockput "POST /cgi-bin/hoge.cgi HTTP/1.0\n\n", 0 sockput "Content-type: application/x-www-form-urlencoded", 0 sockput "Content-length: 25", 0 sockput "", 0 sockput "name1=value1&name2=value2", 0 sockget a,64000,0 toCRLF a mes a sockclose 0 stop
;URLのエンコード
strlen i_size,s_URL_RDIR
s_URL_RDIR_ENC = "" ;エンコード済みリクエスト情報をクリア
s_add_char = "@" ;1文字追加用文字列
repeat i_size,0
peek c_data,s_URL_RDIR,cnt
;16進表現にパックしなくてもいい文字を抽出
if ((c_data>=$30)&(c_data<=$39))|((c_data>=$41)&(c_data<=$5a))|((c_data>=$61)&(c_data<=$7a))|((c_data>=$2d)&(c_data<=$2f))|(c_data=$3f)|(c_data=$3d) {
poke s_add_char,0,c_data
s_URL_RDIR_ENC+=s_add_char
} else {
if (c_data=$20) {
s_URL_RDIR_ENC+="+" ;空白は+(プラス)に
} else {
int x_add_char
x_add_char=c_data
str x_add_char,17
s_URL_RDIR_ENC+="%"+x_add_char ;16進にエンコード
}
}
loop
#!/usr/bin/perl
require 'getformdata.pl';
print "Content-type: text/html\n";
print "\n";
%formdata = plab::getformdata();
print "input1 : $formdata{'input1'}<br>";
print "input2 : $formdata{'input2'}<br>";
getformdata.pl
package plab;
sub getformdata
{
local $rawdata;
local %formdata;
local @inputs;
local($input, $name, $val);
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $rawdata, $ENV{'CONTENT_LENGTH'});
}
elsif ($ENV{'REQUEST_METHOD'} eq "GET") {
$rawdata = $ENV{'QUERY_STRING'};
}
@inputs = split('&', $rawdata);
foreach $input (@inputs) {
($name, $val) = split('=', $input);
$val =~ tr/+/ /;
$val =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg;
$formdata{$name} = $val;
}
return %formdata;
}
1 ;