Zope とプロダクト
Zopeやプロダクトに関する話しはここに書きましょう。
なお当ボードは Zope.org とは一切関係ありません。
-
79
owa
2005/03/27 23:51
id: mJs8kxp1Zus
prob: 0.8%
-
-
# しばらく見られなかった sukima.ddo.jp サイトが復活してました。
# http://sukima.ddo.jp/Plone/WhatsNew
# 覗くと ContinuationBasePack-0.3.tar.gz などと云うファイルが置いてあります。
(また見られなくなったので、コメントアウト;;)
-
78
owa
2004/12/29 23:48
id: mJs8kxp1Zus
prob: 3.5%
-
-
ZShogi-0.1.tgz を http://zope.org/Members/owa/ZShogi に投げてみましたが、一般ユーザでアクセスできません;; 一応 state は publish になってるようですが。プロダクトが認可されるまで時間がかかるのだろうか? 明日まで待ってみよう。
追記: ファイルが一個 private のままでした;; publish に変更してもらったらアクセス可能になったようです。(2004/12/30 15:00)
-
77
owa
2004/12/11 22:49
id: mJs8kxp1Zus
prob: 0.0%
-
-
Zope 関連で一個のセキュリティ問題に複数の投稿があります。
http://mail.zope.org/pipermail/zope-dev/2004-December/024087...
http://zope.org/Members/ajung/security_advisory
http://www.freeml.com/message/[email protected]/0000798
http://coreblog.org/ats/513
こう云うの好きです。とても心強い雰囲気ですね^^
(ちなみに明日は仕事で虫取り、でも嬉し。私は少し変人かも;;)
Debian や Vine でもセキュリティ情報を流してるけど、素人にも分かり易く解説してくれるとありがたいと思う。高度な知識が必要なので僕には無理だけど、解説が必要な人は多いと思う。要望が多ければ、誰か出てくるんじゃないかと期待したり。
-
76
owa
2004/11/03 23:34
id: mJs8kxp1Zus
prob: 0.0%
-
-
>>75 インタプリターってそういうものなの
実行時にデータ型や許容範囲のチェックするので、その時に例外を投げます。C/C++
のように、実行した結果たまたま起きる低レベルの例外が起きてるわけではないので、比較的安全かなと思ってるのですが。
>>ただ時々落ちたようになる問題が解決しているのかどうか解らないので
カウンタが 0 にリセットされた場合の ip 文字列とか保存して置けば、少なくとも切り分けにはなるような気がします。あまり手間をかけたくないけど、原因は見付けたい;;
-
75
kiyo
2004/11/03 22:56
id: SqALsodDuX2
prob: 0.0%
-
-
>>74 sample.com, ****.com, aaa.bbb.ccc.ddd
そうなんですねぇ。rfind 了解しました。
例文まで載せて頂いて時間使わせたです(忙しいのにすみません)
>>python インタプリタが検出しますので。。。
インタプリターってそういうものなのでしょうか?
例えば見えない所でエラーのダイアログ表示して止まってるとかないですよね。
あ、また変な事書いたですが無視して下さい。
# 家は FSCounter を古いバージョン(1.3.2?)に戻して実験中です。
# ただ時々落ちたようになる問題が解決しているのかどうか解らないので、あまり当てにならないかも知れない。
# Wikiのバージョンが0.99だったし、postgresqlの古いバージョンを別PCから読み書きしていたのはナイショです。
-
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:]
----
|