忍者ブログ

カウンター

プロモーション

カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

AntinomyMy の実験室

   私のWEBアプリ実験室です!

ブログ内検索

楽天でお買い物

twitter

最新トラックバック

最新コメント

忍者アナライズ

ウェザーニュース

バーコード

本を買う

アクセス解析

Google+

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


  • 2024/04/19 20:00

POST とPHP だけでリロード対策!JavaScript Cookie session GET データベース一切無し!

PHP の調べ物

PHP だけの言語を用いて、JavaScript Cookie session データベース使用無しのリロード対策作りました。
GET でアドレス後から付け加える方法も無しで、POST情報だけで実現しています。


やり方は、自分のページのAは描画をPHPで行う最に、自分のページA内に
任意のPOSTデータを含む情報を持つページAの形をした別物A’を読む、
そのA'はPOSTデータだけが違うという物。

つまり自分自身の分身A’を読み込んでPOSTデータ処理させる。


以下で説明するスクリプトの場合、初回と同様になる様に
空のデータを0扱いする様にしてあり、処理される。

私のブログにしては妙に短いのはお酒を・・・いるからですw(朝じゃん・・・・)

さてもう眠いですが、うれしさも何も無く酔い・・・いや、軽く頭が軽い状態で、
プログラムを組んでいた訳なんですが、そのソースを惜しげもなく(無様な汚いコードですw)
ここにメモ書きとして掲載しようじゃないか>w<;(早く寝たいですw)


さて、もとい。
ブラウザの違いとか検証は、いい加減にやってみました。(何度も言いますが眠いですw)
Internet Explorer 8 と、 Mozilla Firefox 3.6.17 そして、Safari 5.0.5(7533.21.1 ) ですが、
なぜか私の場合以下のファイル名がフルパスで
http://localhost/flipflop_reload_protect.php
なのですが、Safari だけは最後に / を追加した
http://localhost/flipflop_reload_protect.php/
とアドレス入力に入力しなければ初回の画面が見られませんでした。
Safari の意味不明な仕様に驚き、良いブラウザハックの拾い物をした!と思いつつ?
時間も時間なので次に進みたいと思いますw


では本ソースです。



 

 

<?php
header('Content-type: text/html; charset=UTF-8');
echo '前のPOSTだよ!';
var_dump($_POST);
if(!$_POST['flipflopProtect'])
{
 echo '0の時だけ<br/><br/>';
 //POSTデータ
 $originalPOST = array(
  'flipflopProtect' =>  !(boolean)$_POST['flipflopProtect'],
  'count_submit' => 1 + (integer)$_POST['count_submit']
 );
 $mergePOST = array_merge($_POST,$originalPOST);
 
 
 $contentData = http_build_query($mergePOST, "", "&");
 
 //header
 $header = array(
     "Content-Type: application/x-www-form-urlencoded",
     "Content-Length: ".strlen($contentData)
 );
 
 $context = array(
     "http" => array(
         "method"  => "POST",
         "header"  => implode("\r\n", $header),
         "content" => $contentData
     )
 );
 
 $url = "http://localhost/flipflop_reload_protect.php";
 echo file_get_contents($url, false, stream_context_create($context));
 die();
}
?>

/* 本文(ホームページなど) */
うんたらうんたら・・・
<?php echo "<br/>\$_POST['flipflopProtect']がずっとブラウザ内では1なんですよ! 実際の値:" . $_POST['flipflopProtect'] ?>
<form id="reloadBlock" method="POST" action="<?php echo $_SERVER['REQUEST_URI'] ?>">
 <input type="hidden" name="flipflopProtect" value="0" />
 <input type="hidden" name="count_submit" value="<?php echo $_POST['count_submit']?>" />
 <input id="submitBottun" type="submit" value="<?php echo $_POST['flipflopProtect']==1?'プロテクト中':'何処かにバグ' ?>" />
</form>


 こんな感じでした。

簡単に説明すると
POSTデータの$_POST['flipflopProtect'] は、開始直後はstringでは''で、
これは数値式のinteger で表せば0です。
その0か''の時だけ、自分自身を参照しに行き、
その処理の時に$_POST['flipflopProtect'] を1にしてプロテクトをかけ、
リロード出来ない状態にして、リロードしても処理しない部分を作り上げています、
つまり自分自身にPOSTする処理を無くしています。

そんな感じで見栄えは一緒、でもPOSTデータの内容が違うと言うとてもとても危なげで
奇想天外な事をしています。

これは本当に苦肉の策みたいな物なので、
Webページとしての描画内容はPHPのそのリロードプロテクトの後に
書いている状態なので、その辺を一まとめにするかとか、
色々他のPHPスクリプトを付け加えて実践的にすると
どんな感じになるかとかまでは書いていません
(お酒飲んでいるから早くブログを書き終えたいですw朝ですしw)。

そんな感じです<_ _>


一応ですが書くとすると自身が表示させたい下部の
/* 本文(ホームページなど) */
と書いている部分以降に
if(!$_POST['flipflopProtect']){  ~~~~~  }
この ~~~~~ にリロード時に処理させたくない内容を入れればいいんです。

別に1ページのソース内に細切れに<?php そのソース  ?>でいいと思うんです。

そんな感じで今回のメモは終わりにしたいと思います。
お酒入っているので、見直しは後ほどにします。


お休みっ! ^v^ノシ


追伸:(結構ウェイト大きいです)
なんかやはり、自身を参照している部分が不可思議な表示です。
推測ではキャッシュしている部分とPHP内部で計算してしまう部分と両方を用いて
描画しているのではないかと思います。
以下の修正変更したソースのカウントが動いてしまうのがその良い例です。

A=自身 A’=自身を呼び出した物とします。

また実はAとA'の両方にPOSTメッセージは存在し、別々に処理されています。
この当りもややこしいです。
そしてA'内部からAのグローバル変数やAのPOSTデータは操作できません。

書籍などには無い、不思議なブラウザとサーバ処理(ApacheやPHPの挙動)が見え隠れします、
環境に依存する可能性もあるので気をつけてください。

とりあえず初回もカウントしない様にして、内部の時間も数値化してみました。
A'の描画が不思議であるのがわかると思います。




 <?php
header('Content-type: text/html; charset=UTF-8');
echo '前のPOSTだよ!'.time().'<br/>';
var_dump($_POST);
if($_POST['flipflopProtect'])
{
 echo '0の時だけ'.time().'<br/>' . $_POST['flipflopProtect'] . '<br/>';
 var_dump($_POST);
 //POSTデータ
 $originalPOST = array(
  'flipflopProtect' =>  !$_POST['flipflopProtect'],
  'count_submit' => 1 + (integer)$_POST['count_submit']
 );
 $mergePOST = array_merge($_POST,$originalPOST);
 
 
 $contentData = http_build_query($mergePOST, "", "&");
 
 //header
 $header = array(
     "Content-Type: application/x-www-form-urlencoded",
     "Content-Length: ".strlen($contentData)
 );
 
 $context = array(
     "http" => array(
         "method"  => "POST",
         "header"  => implode("\r\n", $header),
         "content" => $contentData
     )
 );
 
 $url = "http://localhost/flipflop_reload_protect.php";
 echo 'ここから自分を呼んだ後<br/>';
 echo file_get_contents($url, false, stream_context_create($context));
 die();
}else{
 echo '<br/>リロードブロックと初回だけのはずなのに!<br/><br/>';
}
?>

 

/* 本文(ホームページなど) */
うんたらうんたら・・・
<?php echo "<br/>\$_POST['flipflopProtect']がずっとブラウザA内では0か''なんですよ! 実際の値:[" . $_POST['flipflopProtect'] . "]" ?>
<form id="reloadBlock" method="POST" action="<?php echo $_SERVER['REQUEST_URI'] ?>">
 <input type="hidden" name="flipflopProtect" value="1" />
 <input type="hidden" name="count_submit" value="<?php echo $_POST['count_submit']?>" />
 <input id="submitBottun" type="submit" value="<?php echo $_POST['flipflopProtect']==1?'何処かにバグ':'プロテクト中' ?>" />
</form>
<?php echo var_dump($_POST) ?> 


 

'<br/>リロードブロックと初回だけのはずなのに!<br/><br/>' って所が、カウントした場合でも表示されています。
このIF文はどちらかしか動かないからIFなのですが・・・
IFでそうであった場合と、そうでなかった場合、両方の結論が出てしまう様に見える!


キャッシュやインスタンスなどの絡みと読み込みの絡み、AとA'の関係から、
結果的にブラウザの持つAの変数操作はされている様な挙動を
かろうじて実現出来ている様ですが、実際の絡みが不明な為、
よーく考えて使うべきです。

私はフォームメールに実装しようと思います。

A'内で処理する部分にブラウザへの描画関数は用いない方が無難だと思います。

それはキャッシュやインスタンス内の何かをAで妙な反映をさせない対策になると思います。
Aはブラウザで表示できる物全ての処理をし、
A'は間違っても表示処理を入れない方が良いと言うことです。


多分・・・・それが無難で一番良い方法になると思います^^;


以上長ーーーーーいメモでした<_ _>

拍手[2回]

PR


  • 2011/05/12 06:23

コメント一覧

  • お名前
  • Email

  • コメント

  • Vodafone絵文字 i-mode絵文字 Ezweb絵文字
  • パスワード
[PR]