したがって、開発に使用するテスト環境と、最終的にコードをデプロイする本番環境があります。私が現在持っているコードは、テスト環境では機能しますが、実稼働環境では機能しません。環境の問題のようですが、そうであればどの設定を変更すればよいかわかりません。
現在、短いフォームとキャプチャ画像を持つ単純な連絡先ページをテストしようとしています。連絡先ページでは、captcha イメージに表示されている security_code を含むセッション変数を設定します。これにより、contactSanitize と呼ばれる次のページで、セッションからその変数を読み取り、ユーザーが正しいコードを入力したことを確認できます。
繰り返しますが、これはテスト環境で正常に機能します。ただし、実稼働環境では、フォームに入力して送信できますが、その時点でセッション データが失われ、入力したコードが表示されないため、contactSanitize ページから連絡先ページに戻されます。
私はこれらのページのどこにも session_destroy 呼び出しを持っておらず、誤って $_SESSION 変数を空の配列やその他のものに設定していません (私はダブルとトリプルをチェックしました - テスト環境でも動作するので、そうじゃない)
以下は私のログの抜粋です。各行には、コメントに加えて、タイムスタンプと、利用可能な場合はセッション ID が含まれています。実際、contactSanitize のセッション ID は同じであることがわかります。これは、セッション自体が何らかの理由で空になっているだけです。
これは contact.php ページです。
DEBUG 2013-04-04 18:23:07 (varsAndSecurityCheck.php:74) Page requires security, checking to see if authenticated user.
DEBUG c744b62f483d1eb02fafbbd11f9e9bdb 2013-04-04 18:23:07 (varsAndSecurityCheck.php:82) authenticated = false
DEBUG c744b62f483d1eb02fafbbd11f9e9bdb 2013-04-04 18:23:09 (contact.php:130) just before security image
DEBUG c744b62f483d1eb02fafbbd11f9e9bdb 2013-04-04 18:23:09 (contact.php:134) invoking security image functions
DEBUG c744b62f483d1eb02fafbbd11f9e9bdb 2013-04-04 18:23:09 (CaptchaSecurityImages.php:42) code: hwjdtvw7
DEBUG c744b62f483d1eb02fafbbd11f9e9bdb 2013-04-04 18:23:09 (contact.php:137) after security image functions, SESSION: Array
(
[security_code] => hwjdtvw7
)
DEBUG c744b62f483d1eb02fafbbd11f9e9bdb 2013-04-04 18:23:09 (contact.php:152) Just after security image
フォームを送信し、contactSanitize.php に移動してユーザー入力を検証します。
DEBUG 2013-04-04 18:23:24 (varsAndSecurityCheck.php:74) Page requires security, checking to see if authenticated user.
DEBUG c744b62f483d1eb02fafbbd11f9e9bdb 2013-04-04 18:23:24 (varsAndSecurityCheck.php:82) authenticated = false
DEBUG c744b62f483d1eb02fafbbd11f9e9bdb 2013-04-04 18:23:26 (contactSanitize.php:8) SESSION: Array
(
)
上記のように、セッションが空であるため、検証は失敗します。
DEBUG c744b62f483d1eb02fafbbd11f9e9bdb 2013-04-04 18:23:26 (contactSanitize.php:26) No security code and not authenticated, sending to contact page.
DEBUG 2013-04-04 18:23:26 (varsAndSecurityCheck.php:74) Page requires security, checking to see if authenticated user.
DEBUG c744b62f483d1eb02fafbbd11f9e9bdb 2013-04-04 18:23:26 (varsAndSecurityCheck.php:82) authenticated = false
新しいセキュリティ コードが生成される contact.php ページに戻ります。
DEBUG c744b62f483d1eb02fafbbd11f9e9bdb 2013-04-04 18:23:29 (contact.php:130) just before security image
DEBUG c744b62f483d1eb02fafbbd11f9e9bdb 2013-04-04 18:23:29 (contact.php:134) invoking security image functions
DEBUG c744b62f483d1eb02fafbbd11f9e9bdb 2013-04-04 18:23:29 (CaptchaSecurityImages.php:42) code: xb66q6jy
DEBUG c744b62f483d1eb02fafbbd11f9e9bdb 2013-04-04 18:23:29 (contact.php:137) after security image functions, SESSION: Array
(
[security_code] => xb66q6jy
)
DEBUG c744b62f483d1eb02fafbbd11f9e9bdb 2013-04-04 18:23:29 (contact.php:152) Just after security image
編集
session_start 呼び出しが両方のページの先頭で発生することを示すために、ログを追加しました。次の行が contact および contactSanitize ページの先頭に表示されるようになりました。
DEBUG 2013-04-04 19:26:15 (varsAndSecurityCheck.php:74) Page requires security, checking to see if authenticated user.
DEBUG 2013-04-04 19:26:15 (varsAndSecurityCheck.php:78) page is secure, starting session now.
これは、varsAndSecurityCheck.php ページからの小さなスニペットで、「セッションの開始」というログがどこから来たかを示しています。
$log->debug("page is secure, starting session now.");
session_start();
以下は、contact.php のコードの関連部分です。
<?php
...
//session is started by this first include when secure connection is verified
include_once "../includes/varsAndSecurityCheck.php";
//this just connects to my database, no session manipulation here
include_once "../includes/dbConnect.php";
//this includes some functions for generating a captcha image
include_once "../captcha/CaptchaSecurityImages.php";
//this is just including some basic styling and navigation
include '../includes/header.php';
?>
...
<form method="post" action="contactSanitize.php">
...
$log->debug("just before security image");
?>
<div class="centerText">
<?php
$log->debug("invoking security image functions");
$_SESSION['security_code'] = generateCode(8);
$log->debug("after security image functions, SESSION: ".print_r($_SESSION,true));
?>
<?=captchaSecurityImages($_SESSION['security_code'],320,70)?>
</div>
...
<div class="centerText">
<input id="security_code" name="security_code" type="text" maxlength="8" />
<br><br>
<input type="submit" name="submit" value="Send Message" class='generalFormButton' />
</div>
<?
$log->debug("Just after security image");
}
?>
これは私の contactSanitize ページの最初の部分です。最初の条件で失敗することがわかります。
<?php
//this starts the session when secure connection is made
include_once "../includes/varsAndSecurityCheck.php";
//This connects to database, no session manipulation here
include_once "../includes/dbConnect.php";
//This includes some e-mail functions, no session manipulation
include_once '../includes/mail.php';
$log->debug("SESSION: ".print_r($_SESSION,true));
$_SESSION['formData'] = array('visitor_name' => $_POST['visitor_name'],
'visitor_email' => $_POST['visitor_email'],
'ReasonForContacting' => $_POST['ReasonForContacting'],
'message_body' => $_POST['message_body']
);
if(!isset($_SESSION['security_code']) && !$authenticated)
{
$log->debug("No security code and not authenticated, sending to contact page.");
$_SESSION['contactError'] = "You must type the security code before sending a message.";
header("Location: contact.php");
exit();
}
...