2017-04-05 73 views
0

這是我init.php是什麼樣子是在整個網站加載:如何有效地處理PHP會話?

$suid = 0; 
session_set_cookie_params(60, '/', '.' . $_SERVER['HTTP_HOST'], true); 
session_save_path(getcwd() . '/a/'); 
if (!isset($_SESSION['id'])) { 
    session_start(['cookie_lifetime' => 60]); 
    $_SESSION['id'] = session_id(); 
    $_SESSION['start'] = date('d_m_Y_H_i'); 
    $_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; 
} elseif (isset($_SESSION['uid'])) { 
    $suid = $_SESSION['uid']; 
} 

我目前正在測試PHP會議,所以我只是把60秒的壽命。

我想知道爲什麼有會議創建,因爲沒有人知道該域名,所以我加了ip。我看着它,發現了這一點:

enter image description here

所以這是谷歌爬蟲機器人。由於那裏有更多的搜索引擎和機器人,我不想將這些抓取保存在會話文件中,並用它填充我的網站空間。

所以我的問題是:

1)即使在測試生命週期價值(60秒)結束後,會議文件保留在自定義目錄。我讀這是因爲我設置了一個自定義目錄。這是真的?

2)刪除所有未使用/過期的會話文件的有效方法是什麼?我應該添加一個時間戳$_SESSION['last_activity']並讓cronjob查看我的自定義目錄,獲取會話文件數據並計算過期會話以刪除它?

3)我是否應該避免由那些漫遊器抓取工具保存那些不需要的會話,只在$_SERVER['HTTP_HOST']內尋找字符串「bot」,還是有更好的方法來識別「非人類訪問者」/抓取工具?

我也很欣賞任何改進/建議,我的代碼在頂部。我之前剛剛造成了一些Internal Server Error,因爲我從php-fpm-slow -logs中可以看出session_start()經常被調用。

回答

1

1)即使當測試壽命值(60秒)結束後,會話文件仍保留在自定義目錄。我讀這是因爲我設置了一個自定義目錄。這是真的?

不,自定義目錄被會話GC拾取並且文件將被清除。它不會立即發生。

2)什麼是一種有效的方法來刪除所有未使用/過期的會話文件?我應該添加一個時間戳$_SESSION['last_activity']並讓cronjob查看我的自定義目錄,獲取會話文件數據並計算過期會話以刪除它?

PHP 7.1有session_gc(),你可以從cronjob調用它,它會做所有必要的事情。

在較早的PHP版本中,默認情況下依賴於probability-based GC,其中清理是隨機執行的。
這可能不是特別有效,但它已經超過十年的唯一通用的解決方案,所以...

然而,如果你的服務器運行Debian的,很可能有session.gc_probability合設爲0使用Debian特定的crontab腳本定期做清理工作 - 你將不得不在這種情況下,自定義目錄問題,有幾個選項:

  • 手動重新啓用session.gc_probability合
  • 配置session.save_path直接在你的php.ini中,所以默認的cron腳本可以撿起它。
  • 請勿使用自定義目錄。鑑於您目前有getcwd().'/a/',我想說Debian上的默認會話目錄幾乎肯定是一個更安全的位置,所以它客觀上會更好。
  • 寫你自己的cronjob來做到這一點,但你必須真正知道你在做什麼。 $_SESSION['last_activity']甚至不能用於此;文件訪問/修改時間由文件系統本身提供。

3)我應該避免那些機器人爬蟲節省不必要的那些會議只是爲了尋找字符串「殭屍」裏面$_SERVER['HTTP_HOST']或是否有更好的方法來識別「非人類的遊客」 /爬蟲?

你在考慮$_SERVER['HTTP_USER_AGENT'],但沒有 - 這不是一個解決方案。

鮮爲人知(爲方便起見,很大程度上被忽略),但唯一正確的做法是在登錄前從不啓動會話

觸發無用會話文件的抓取程序的煩惱是一個可以忽略的問題;真正關心的是確定的攻擊者填充會話存儲的能力,用盡所有可能的會話ID,避免這些攻擊很容易脫離,但可能導致DoS或會話固定,因此他們不應該很容易被解僱爲可能性。

附:獎勵提示:請勿使用$_SERVER['HTTP_HOST'] - 這是用戶輸入,來自HTTP Host標題;由於Cookie的工作原理,在這種情況下可能是安全的,但應該避免一般情況。

+0

哇。感謝您的詳細解答!我不知道它不會立即發生。我沒有跟蹤我的自定義目錄,但它似乎永遠不會被刪除。所以你建議使用'filemtime()'來檢測上次修改文件的時間?關於設置沒有登錄用戶的會話並使用自定義目錄:我通過同一服務器上的兩個不同域發送Ajax請求,並使用會話獲取保存在會話變量中的正確語言代碼。也在註冊表格內(3個步驟)。是否應該用常規cookie取代以避免在沒有登錄用戶的情況下使用會話? – AlexioVay

+0

對此第二條評論抱歉,只是想澄清一下:ajax和自定義目錄問題是關於檢測正確的會話來引用該域。沒有設置保存目錄,我找不到另一種方法。 – AlexioVay

+0

是的,一個簡單的cookie對於簡單的語言標識符來說並不算什麼。會話用於私人數據和身份驗證 - 您不需要選擇顯示語言。 :) – Narf

1
  1. cleanup php session files

  2. 此的cronjob已經存在(見1) - 最有效的方法是會話數據存儲在memcached的,而不是因爲內存使用和TTL的純文本文件。

  3. 你應該避免比較字符串用戶代理或主機,因爲它是不可靠的,HTTP_HOST是你的本地主機名,而不是遠程主機名和最顯著理由你不應該對谷歌機器人有什麼不同:您僞造的網站行爲對您的Google排名非常不利。歡迎谷歌喜歡網站的任何其他訪問者。

+0

感謝您的有用信息。不幸的是,我在共享主機上,無法啓用內存緩存。沒有訪問服務器配置會有另一種方式嗎? – AlexioVay

+0

@Vay不,不是真的。但另一方面,文件可以在那裏。他們不是問題。如果應該立即刪除它們,光盤上的I/O會不斷變壞。 – DanFromGermany