2015-09-28 13 views
6

私はデータベースベースのセッションストレージソリューションを持っています。よく働く!私はしかし、それは特定の種類のデータを格納する問題があります。mysql dbエラーに格納されたPHPのシリアル化されたデータ

CSRFトークンを使用するアプリケーションがあります。フォームが作成されると、そのフォームのトークンが作成されます。トークンは、異なるタイプの値のハッシュ値(sha256)です。 1つのコピーがフォームに送られ、別のコピーがセッションに保管されます。フォームを送信すると、トークンが比較され、一致することが確認されます。

は以下

UPDATE session_manager SET variables= :variables WHERE 1=1 AND id = :id 
array(2) { 
    [":variables"]=> 
     string(152) "a:1:{s:4:"CSRF";a:1:{s:8:"register";a:2:{s:5:"token";s:64:"e749603241dec1911ef3a40d98b2f5185d389434060483297394b504cc904ede";s:4:"time";i:1443456816;}}}" 
    [":id"]=> 
     string(2) "49" 
} 

UPDATE文が細かいと正常に動作し、新しいデータでデシベルを更新破壊関数の例です。これは私が持っている問題ですが、データは更新されますが、上記のデータで見ることができる 'トークン'の値は以下のdbの値とは異なります(これはデータのバイナリダウンロードです):

a:1:{s:4:"CSRF";a:1:{s:8:"register";a:2:{s:5:"token";s:64:"b48fc79fc2f51eff765c05476895238a42d9d45b2c1aeb7c6e4582d0381b7f4f";s:4:"time";i:1443456817;}}} 

これは、mysqlが値を変更しているように見えますが、私の人生では問題を理解できません。私が試したソリューションが含まれます:

  • シリアル化
  • json_encode
  • base64で

変更デシベルの文字セットとものではありません。 TEXT、Longtext、BLOBなど、データベース内のさまざまなフィールドタイプを試してみました。デシベル

CREATE TABLE session_manager(
    id BIGINT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL, 
    session_id VARCHAR(200), 
    user_agent TINYTEXT NOT NULL, 
    variables BLOB NOT NULL, 
    initial_time DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, 
    regenerate_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL 
); 

気にポップいかなる理由でもSQLが私のために動作するようには思えない:(

ここにいるのですか?

+1

MySQLがあなたの価値を変えているとは思いません。あなたの更新プログラムにあなたのPHPコードの別の文字列を与える必要があります...あなたはあなたの更新のために準備されたステートメントを使っています...更新ステートメントの直前で 'echo $ tokenValue;'を試して、値を確認してください –

+0

update文の後にdbクエリを実行する前にバインドされたparamsをダンプします。 – Tim

+0

'Text 'を型として使うと、問題は解決しないかもしれませんが、それは問題解決の提案の1つです。私はそれに直面した。 –

答えて

1

あなたは、配列のtime指数で見たことがありますか?これセッションを保存する方法が2回以上実行されたと思うのですが、2回目にセッションが更新され、古い値が上書きされます。

このコードは、 、またはスタックトレース前夜の印刷/ログあなたの関数が呼び出される時間。これは、値が再び更新されたときには、かなり良いアイデアを与えるはずです。

PS:値を取得する前に、次のリクエストで更新クエリが再度呼び出されますか?

+0

ええ、私は解決策を探すのに気づいた。私は私の問題を解決しました。 いいえ、更新は破壊関数にあります。乾杯 – Tim

1

それで、さらに調査してみんなからのインプットを受け入れてください(途中で乾杯)。私は私の問題を解決した。

それは、mysqlとまったく関係がないことが分かります。実際には「favicon.ico」と関係がありました。私はあなたがしているように空想のURLを使用し、私は開発者にいるので、私はファビコンを悩ましたことはありません。デフォルトでは、ページのロード時にファビコン(http://localhost/favicon.ico)を検索しようとします。システムは、ユーザーがコントローラにアクセスしようとしていると想定しています(私はmvcを使用しています)。コントローラが存在しないため、ホームページにリダイレクトされます。ホームページにはフォームが存在するため、生成されたトークンが必要です。その結果、元のトークンを無効にするトークンを2回生成します。これは、開発者用コンソールを通じてすべてのネットワーク接続を調べた後に実現したものでした。

関連する問題