Securimage 如何使用自訂的 session 路徑

Securimage 是一個產生圖型英文字元及數字的 PHP 套件,用來避免網站的表單或登入頁面被惡意攻擊

先用官網上教學的方式來測試,在 securimage 目錄底下建立一個 test.php 頁面,裡面包含 php 和 html 語法

首先要先開啟 session 服務,然後設定一個 session 變數 test

<?php 
session_start(); 
$_SESSION['test'] = "Test";
?>

在中間為 html 語法,要注意的是使用套件的路徑是否有誤

<img id="captcha" src="securimage_show.php" alt="CAPTCHA Image" />

<form action="test.php" method="post">
<input type="text" name="captcha_code" size="10" maxlength="6" />
<a href="#" onclick="document.getElementById('captcha').src = 'securimage_show.php?' + Math.random(); return false">[ Different Image ]</a>
<input type="submit" />
</form>

最後,先列出目前 session 儲存的路徑,然後列印剛剛設定的 session 變數 test

print_r(session_save_path());
echo '<br /><br /><br />';
echo $_SESSION['test'];
echo '<br /><br /><br />';

include_once 'securimage.php';

$securimage = new Securimage();

if ($securimage->check($_POST['captcha_code']) == false) {
  // the code was incorrect
  // you should handle the error so that the form processor doesn't continue

  // or you can use the following code if there is no validation or you do not know how
  echo "The security code entered was incorrect.<br /><br />";
  echo "Please go <a href='javascript:history.go(-1)'>back</a> and try again.";
  exit;
}
else
{
    echo 'correct.';
}

在 PHP 預設的 session 位置

/var/lib/php/session

可以看到在預設的 session 位置產生了 session,裡面的值也符合

cat sess_2ucroqgd8sn5gukbu6gefplsk5
test|s:4:"Test";securimage_code_disp|a:1:{s:7:"default";s:6:"RFFLFL";}securimage_code_value|a:1:{s:7:"default";s:6:"rfflfl";}securimage_code_ctime|a:1:{s:7:"default";i:1459730980;}securimage_code_audio|a:1:{s:7:"default";N;}

不過,如果我們想要更改預設的 session 路徑將會導致出現問題
例如我們在 test.php 頁首部份改為

<?php 
session_save_path('/home/yamaou/public_html/study/mymvc-smarty/tmp/session_tmp');
session_start(); 
$_SESSION['test'] = "Test";
?>

這會建立 2 個 session 檔案
一個是我們自訂的路徑 /home/yamaou/public_html/study/mymvc-smarty/tmp/session_tmp
一個是系統預設的 session 路徑 /var/lib/php/session

我們自訂的 $_SESSION[‘test’] 會使用我們自訂的 session 路徑,而 securimage 的 session 會使用系統預設的 session 路徑
這將造成這頁 test.php 無法順利使用 Securimage 套件

解決方式
在 Securimage 套件裡有一個 securimage.php 檔案
在頁首部份加入相同的 session 路徑即可統一使用路徑

<?php
ini_set('session.save_path','/home/yamaou/public_html/study/mymvc-smarty/tmp/session_tmp');

這樣的話,Securimage 套件也會使用我們自訂的 session 路徑,我們自訂的 $_SESSION[‘test’] 跟 Securimage 所產生的 session 變數將會出現在同一個 session 檔案裡