AN HTTPD ゲストブック/コメント集(2001年5月16日10:45)


中田昭雄 nakata@st.rim.or.jp 2001/05/18 21:13

加藤さん、
なるほど。ソケットの入出力はテキスト変換のないバイナリ入出力ですから、そうですね。
もっとも、CR LF でなく LF でも受け付けるようにしていたつもりでしたので、見直してみます。


加藤隆一 katoh.ryuichi@bsc.fujitsu.com 2001/05/17 21:52

わかりました。投稿してすぐわかりました。
\nがいけない。\r\nにしなくちゃだわ。
IIS4が動いていたのでいいもんだと思い込んでいました。お騒がせしました♪


加藤隆一 katoh.ryuichi@bsc.fujitsu.com 2001/05/17 21:34

基本ユーザ認証について、お返事ありがとうございました。
IIS4ではuid:pwdをエンコードしたものをつけると、200が来て、HTMLを取り出せました。しかし、AN HTTPDでは401が来て、認証エラーが出ます。誤動作防止のため引用形式です。
> HTTP/1.1 401 Unauthorized
> MIME-Version: 1.0
> Server: AnWeb/1.33g
> Date: Thu, 17 May 2001 12:29:00 GMT
> Content-Type: text/html
> Connection: close
> WWW-Authenticate: Basic realm="a1"
> Content-Length: 313
ですが、仕事で使わなくなったので(^_^;)、優先度は下げていただいて(保留で)いいです。すみませんです。IIS4では動作OKのソース抜粋をつけます。

void CADlg::OnStartsocket(){ 
char buf[512];
char buf2[256];
ZeroMemory(buf,sizeof buf);
ZeroMemory(buf2,sizeof buf2);
CSocket s;
BOOL bRet;
bRet=s.Create();
bRet=s.Connect("127.0.0.1",80);
//Base64エンコード
b64_ntop((u_char*)"uid:pwd",7,buf2,sizeof buf2);
sprintf(buf,"%s¥n%s¥n%s%s¥n¥n",//投稿用に全角化
"GET /a1/readme.html HTTP/1.1",
"Host: 127.0.0.1",
"Authorization: Basic ",buf2
);
bRet=s.Send(buf,strlen((char*)buf));
bRet=s.Receive(buf,sizeof buf);
s.Close();
}


中田昭雄 nakata@st.rim.or.jp 2001/05/16 21:24

加藤さん、
たとえば、ユーザ名 "nakata" で パスワード を "password" とした場合、
Authorization: Basic に続いて nakata:password を BASE64 でエンコードした文字列をつければいいということは加藤さんの言われる通りです。
それが「基本認証」のやり方ですから。
それは IIS でも Apache でも AN HTTPD でも同じ(はず)です。

しかし、AN HTTPD で、ユーザ名 nakata、パスワード password と設定した時には、オプション画面では
nakata:SgcOvkNQjkPA.
などと表示されます。 SgcOvkNQjkPA. の部分は "password" が crypt により暗号化されたものです。
これを BASE64 でデコードすることはできませんし、復号化することも(基本的には)できません。
もちろん、これをそのまま Authorization: につけても、BASE64でエンコードしてもエラーになります。

ここの表示を暗号化しているのは、他の人にパスワードを知られないようにするためです。設定した人にはわかっているはずですから。
設定したのに忘れた場合は、設定しなおしてください。

しかしIISでは設定したパスワードがそのまま表示されるのでしょうか?

なお、crypt による暗号化では同じパスワードでもその時によって違う文字列になります。
crypt については、UNIX では crypt(3)、 Perl では perlfunc の crypt 関数 あたりをご覧ください。


加藤隆一 katoh.ryuichi@bsc.fujitsu.com 2001/05/16 10:45

基本ユーザ認証について。(1.33)
現在、以下のようなHTTPリクエストを送るとANhttpdではエラー、IIS4では正常。
GET /a1/readme.html HTTP/1.1(CRLF)
Host: localhost
Authorization: Basic 「BASE64エンコードしたuid:pwd」(CRLF)(CRLF)
原因を考えてみました。エイリアス/a1にユーザuidパスワードpwdでセキュリティをかけています。画面に表示されているbase64エンコードしたかのようなデータをみるとパスワードの変更ボタンを押下する度に別のデータが表示されます。デコードしようとしたのですが、libresolv.aに付属のbase64.cではデコードできませんでした(変なバイナリが取り出せます)。
基本ユーザ認証についてIISと互換を持たせるように設定することはできますか?
よろしくお願いします。