[英]Perl CGI gets parameters from a different request to the current URL
這很奇怪。 :)
我有一個在Apache 1.3下運行的腳本,其中包含mod_perl的Apache :: PerlRun選項。 它使用標准的CGI.pm模塊。 它是繁忙服務器上的定期訪問腳本,可通過https訪問。
URL通常類似於......
/script.pl?action=edit&id=47049
然后以通常的方式將其帶入Perl ......
my $action = $cgi->param("action");
my $id = $cgi->param("id");
這已成功運作了幾年。 但是,我們本周開始從訪問此腳本並獲取空白頁面的客戶那里獲得支持請求。 我們已經有了如下所示的行,將當前的URL放入我們用於客戶報告頁面問題的表單中...
$cgi->url(-query => 1);
當我們查看頁面的源時,該命令的結果是相同的URL,但具有完全不同的查詢字符串。
/script.pl?action=login&user=foo&password=bar
我們認為是來自我們系統其他地方完全不同的腳本的查詢字符串。
聽起來很瘋狂,似乎當用戶使用查詢字符串訪問URL時,腳本看到的查詢字符串是來自另一個腳本上的先前請求的字符串。 當然,腳本無法處理該操作並且不輸出任何內容。
我們運行了一些自動化測試腳本,以查看這種情況發生的頻率,而且並非每次都如此。 為了給混合增加一些額外的困惑,在Apache重新啟動之后,問題似乎最初完全消失,但后來又回來了。 因此無論如何導致它都會因重啟而以某種方式解除,但我們無法看到Apache如何從一個用戶那里獲取請求並將其與另一個用戶混合。
看起來,它是Apache 1.3,mod_perl 1.31,CGI.pm和Apache :: GTopLimit的有趣組合。
去年5月針對CGI.pm
記錄了一個錯誤: RT#57184
哪個也引用CGI.pm params沒被清除?
CGI.pm
注冊一個清理處理程序,以清理它的所有緩存....(第360行)
$r->register_cleanup(\&CGI::_reset_globals);
Apache::GTopLimit
(如bug報告中提到的Apache::SizeLimit
)也有一個這樣的處理程序:
$r->post_connection(\&exit_if_too_big) if $r->is_main;
在pre mod_perl 1.31中,post_connection和register_cleanup似乎會推入堆棧,而在1.31中,似乎GTopLimit
破壞CGI.pm
條目。 因此,如果您的GTopLimit
函數因為Apache進程變大而觸發,那么CGI.pm
將不會被清除,而是在下次使用時返回相同的參數。
解決方案似乎是將CGI.pm的第360行更改為;
$r->push_handlers( 'PerlCleanupHandler', \&CGI::_reset_globals);
其中明確地將處理程序推送到列表中。
我們重新啟動Apache暫時解決了這個問題,因為它減少了所有進程的大小,並且沒有理由讓GTopLimit解雇。
我們假設它在過去幾周出現了,因為我們通過新的開發增加了Apache進程的大小,其中包括以前沒有的東西。
到目前為止,所有的測試都指出這是問題,所以手指越過它!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.