Zope とプロダクト
Zopeやプロダクトに関する話しはここに書きましょう。
なお当ボードは Zope.org とは一切関係ありません。
このまま記事を入力し[投稿する]ボタンを押せば当サイトに送信されます。
以下の文章は注意書きです。
名前はかならず記入してください。ハンドルネームでも構いません。
またパスワードを入力することをお勧めします。
その場合他人による *なりすまし* と区別出来るかもしれません。
さらにブラウザでクッキーを有効に設定してある場合あなたの記事は後で修正可能になります。
コメントスパム防止のため記事の内容を機械的にモデレート
(スパムである確率を計算)
する処理を通します。
どのような投稿であれ、たまたま計算誤差によりスパムとみなされ
秘密の場所
に収納される可能性があります。
その場合、管理人が手作業で正規の場所に移動しますのでお待ちください。
-
74
owa
2004/11/03 21:19
id: mJs8kxp1Zus
prob: 0.0%
-
-
>>73
幾つか宿題が溜ってました、まず最初にごめんなさい;;
1. ignore_ip メソッドの例外処理パッチが 1.4.0 版では落ちていました。ガーン...ごめん
m(.".)m
2. HTTP_X_FORWARDED_FOR の処理
1.4.0 では組み込まれていて、increment メソッドの方は問題無いと思います。で問題の
ignore_ip メソッドの方の ip を数値変換する箇所ですが、クライアント側が proxy
の場合 (家鯖では) 下記のようなタイプを捕獲してます。
AAA.BBB.CCC.DDD, aaa.bbb.ccc.ddd
unknown, aaa.bbb.ccc.ddd
sample.com, ****.com, aaa.bbb.ccc.ddd
なので URL を取り出すには string.find(s, ',') メソッドでは無く、少なくとも rfind
の方が良いと思います。ただ、ignore_ip メソッドは既知の ip を排除するためにあります。ip を抽出することにとらわれず、既存コード中で split('.') 処理をしてるので、split 結果の数を 4 以下に限定する方が良いか
もしれません。その上で例外が起きたら対処するというのが私の今の思い付きです。
3. ignore_ip メソッドの中の例外処理の件ですが
rAdrInt=(int(rAdrSplit[0])<<24)
もし rAdrSplit[0] が数字と思えない文字列なら例外を発生します。これは try,
except で囲わないといけません (シフト演算の前に int() で起きます)。 ただこれは
python インタプリタが検出しますので python 内で解決してると思います。例えば
C/C++ などの場合は、より低次元で例外が発生するのでその後は保証されるか不確実
(コンパイラによる) かもしれません。python の場合は一応信用して良い気がします。
4. ファイルロック処理
一般的にマルチスレッドプログラムでは共有ファイルへの書き込みはロックすべきだと思います。ただ FSCounter の場合にあてはまるかどうかは定かではありません。云われてみれば、少しこだわり過ぎたかと思ってます。次のようなプログラム "mi
o.py" を作ってみました。close 関数はわざと外してます。
#!/usr/bin/env python
f = open('tmp', 'wb')
f.write('abc')
これをトレース付きで実行してみます (出力の最後だけ載せます)
$ strace ./mio.py
...
...
open("tmp", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
fstat64(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40020000
rt_sigaction(SIGINT, NULL, {0x4002ddf0, [], SA_RESTORER, 0x400c3908}, 8) = 0
rt_sigaction(SIGINT, {SIG_DFL}, NULL, 8) = 0
write(3, "abc", 3) = 3
close(3) = 0
munmap(0x40020000, 4096) = 0
exit_group(0) = ?
問題は write(3, "abc", 3) のシステムコールだけなので、例えマルチスレッド環境で実行しても書き込みがおかしくなることは無い気がします。(mmap2 とか rt_sigaction が何をやってるのか知りませんので、間違って
るかもしれません)
5. Vine 3.1
たかがカウンタと思っていたのが *あだ* になりました。一時ツリーから削除してもらおうと思ってたのも事実です。(kiyo さんに言われて再認識しました) 救いは Vine 3.0 からは Vine-Plus もメンテナンス対象になったので不
具合があれば堂々と修正できるようになったことです (でも、まだ半メンテナンス制が発足したわけではありません)。 今回の件は、なるべく早く修正しますので、その上でまたしばらくは様子を見ようと思います。
# 今もってゼロクリア問題が解決したと言い切れて無いので、どこかで嘘を云ってる可能性ありですが・・・
-
73
kiyo
2004/11/03 15:14
id: SqALsodDuX2
prob: 0.1%
-
-
>>72 本当はロックすべきなのかも?
私の妄想的意見(あくまで意見なのです)
そもそもロックしなければいけないのでしょうか?
FSCounter.py 内の__version__ = '1.3.2' を使っていて約20万アクセスあってもエラーは出なかった。
じゃ、1.3.2 以降どう変更されたかと言うと
self.REQUEST.get('HTTP_X_FORWARDED_FOR', '') をよみだした時からエラーがでているような気がします。
この HTTP_X_FORWARDED_FORに unknown 文字列を含む時がある事も解っているので、これをシフト演算すると間違いなくエラーがでると思う。
このエラーが起こった時に別の新規アクセスがあると。。。(ほんとは解りません/アチャー)
# 前に投稿したのは Vine 3.1がそろそろ発売になりそうなので、Vine3.0に置いてあるZope-FSCounter-1.3.4-0vl6を修正又は削除したらって思ったのです。舌足らずで申し訳ないです。
-
72
owa
2004/11/02 00:36
id: mJs8kxp1Zus
prob: 0.0%
-
-
>>70
FSCounter-1.4.0 でもゼロクリアされる現象が起きました。なんで?
write はロックかけてるので一応信用するとして、read にいちいちロックかけるのは気が向かない。(本当はロックすべきなのかも?)
ip アドレスで重複チェックかけてる場合、一日単位で ip テーブルをクリアするので、そのタイミングでカウンタ値をインスタンス (self.last_count) に持たせることにしました。昨日より小さい値の場合はカウンタを更新しないという
つもり。副作用で、毎日の増加分が得られます。
ftp://owa.as.wakwak.ne.jp/pub/Vine/VineSeed/patch/FScounter....
既存のサーバにインストールした場合不具合がでそうな気がするので、まだ正式ではありません。
# そう云えば少し前に mutex で対応すれば良いと云うような記事がありました。
# http://bbs.zhost.sytes.net/47
追記:
11/03 00:51 - やはりバグありますね。トップページの today カウントがクリアされません;;
-
71
owa
2004/10/30 21:26
id: mJs8kxp1Zus
prob: 0.0%
-
-
>>70 Zope-FSCounter-1.3.4-0vl6がちょっと変
だいぶ変ですね。手を入れたコードが汚い;;
最初の二件はおっしゃる通りで、良くないのでソース直してみましたが、途中で
FSCounter-1.4.0 見たら良さそうだったので乗り換えました。(申し訳ない)
ロックファイルは元々無かったものなので捨てました。しかし write 文で排他制御は必要だと思うのでパッチを追加しました。
ftp://owa.as.wakwak.ne.jp/pub/Vine/VineSeed/patch/FScounter....
#「unknown」の方は、後で考えます。
# FSCounter 止めようかと思ってたけど、まだ使えそうですね。ありがとうございます。
-
70
kiyo
2004/10/30 16:51
id: SqALsodDuX2
prob: 0.0%
-
-
久しぶりに投稿^^;;
Vine 3.0 にある Zope-FSCounter-1.3.4-0vl6がちょっと変なのですが。。。
カウンター値に新しい値を入れてをPOSTしても変化がないようです。
FSCounter.py の150行目付近
----
def __write_(self, newvalue=''):
''' write newvalue to file or increment '''
value = 0
try:
- value = self.__read_()
+ value = self.read()
lock = open(self.lockfile, 'w')
---
とすると良いようです。FSCounterを作成直後に 存在しないファイル($ZOPE_INSTANSE/var/xxx.counter)を読みに行ってエラー。で結局ファイルの作成に失敗するようです。
それと 古いZopeからimport/Exportで持って来た場合、独自に拡張された self.datafile,
self.lockfileが存在しない為うまく動作しないようです。110行目付近
manage_edit付近に以下のようにしたらどうでしょう?
----
def manage_edit(self, title, cookie_yn=0, cookie_name='', padded_value='5', images_folder='misc_/FSCounter',
image_type='', ignore_addrs=(), newvalue='', ip_tracking=0, REQUEST=None):
"""edits the object"""
self.title = title
+ if not self.lockfile:
+ self.datafile = str(Globals.data_dir) + os.sep + str(self.filename)
+ self.lockfile = self.datafile + '.lock'
---
あと HTTP_X_FORWARDED_FORですが、UserCounter等をみていると IPアドレスが
「unknown,123.456.789.012」 のようにありますので、「unknown」を削除する為 330行付近を以下のようにしてみました。
----
def ignore_ip(self, REQUEST):
''' check if the ip should be ignored '''
ignore = 0
if self.ignore_addrs:
rAdr=self.REQUEST.get('HTTP_X_FORWARDED_FOR', '') or self.REQUEST.get('REMOTE_ADDR', '')
+ radr_p = string.find(rAdr,',') + 1
+ rAdr = rAdr[radr_p:]
----
-
69
owa
2004/10/28 19:26
id: mJs8kxp1Zus
prob: 27.1%
-
-
apache のリリースについて、正確な情報は cvs の status にあるそうです。
http://cvs.apache.org/viewcvs.cgi/apache-1.3/STATUS
http://cvs.apache.org/viewcvs.cgi/apache-1.3/STATUS?view=mar...
hayashi さんの記事で知りました。
1.3.34-dev: In development.
1.3.33: Tagged October 27, 2004
1.3.32: Tagged October 18, 2004. Not formally released.
1.3.31: Tagged May 7, 2004. Announced May 11, 2004.
1.3.30: Tagged April 9, 2004. Not released.
-
68
owa
2004/10/27 23:52
id: mJs8kxp1Zus
prob: 0.0%
-
-
>>67 そういうリリースアナウンス有るべきでしょう
色々考えさせられます。リリースアナウンスのページはまだ見ることができますし。
セキュリティ問題が絡むとややこしくなる上に、公開してしまったら対処はどうするのか?
*.jp の立場ではどうするの、巷で乱立 (失礼) してる *.jp 各々の実体は信頼できるの?
「エ〜〜〜ッ」ってのは僕も実感です。なんか変だとも思います。
鯖の管理者としてはもっと慎重な態度が必要でしょうけど、それはまた違う話で。
-
67
hoihoi-p
2004/10/27 21:59
id: f4EbtcS9oVc
prob: 24.0%
-
-
>>[Apache-Users 4724]:そもそも、1.3.32 は正式にはリリースされていません。
>>tar ball まで作成されながらリリースされなかったのには理由があるのです。
エ〜〜〜ッ。
>> http://www.apache.jp/
>> Apache 1.3.32 がリリースされました (2004/10/21)
って、かいてありますよ〜〜。 あれは嘘?
それなら、そういうリリースアナウンス有るべきでしょう。絶対。
それとも、apache.jp が、確認もしないでリリースアナウンス出したの?
「apache.jp と apache.or.jp は別です。」とでもいうのかな?
なんか、変じゃない。
もっとも、フリーソフトだから、自己責任なんだけど。 ・・・・・。!!
-
66
owa
2004/10/27 20:19
id: mJs8kxp1Zus
prob: 0.3%
-
-
>>65
apache-1.3.32 は正式リリースでは無いらしい。
http://mm.apache.or.jp/pipermail/apache-users/2004-October/0...
http://d.hatena.ne.jp/kinneko/20041027#p6
準備万端だったけど、最後になんかあった?
おまけに、最新 (26 日付) 見れば mod_rewrite の障害報告が載っていた。
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=14518
ml 投稿前に再度チェックして置けば良かった。(恥
でも既にセキュリティ脆弱性は明らかにされてるし、
IT 関連のニュースにも 1.3.32 リリースが大きく報じられています。
http://www.itmedia.co.jp/enterprise/articles/0410/23/news005...
インストールした人多いんじゃなかろうか?
-
65
owa
2004/10/26 22:03
id: mJs8kxp1Zus
prob: 0.0%
-
-
>>64 やっぱりバグでしょう
tcpwatch を間に入れて確認してみました。
● apache-1.3.32-0vl1
==>GET /VirtualHostBase/http/localhost:80/VirtualHostRoot/test/query%3Fwho=hoge?who=hoge HTTP/1.1
○ apache1.3-1.3.32-uvl1
==>GET /VirtualHostBase/http/localhost:80/VirtualHostRoot/test/query?who=hoge HTTP/1.1
apache が直接吐いてるものと思って構わないでしょう。mod_rewrite は多機能でしかもソースは 4493 行もあるので、すぐに理解するのはちと無理です;; ml に投げるしかないかなー
# また恥じをかきに行くようなものだけど...疑ヲ見テセザルハ勇ナキナリ
追記: と云うことで apache-users (jp) に投稿してみました。
http://mm.apache.or.jp/pipermail/apache-users/2004-October/0...
|