タグ : PHP

SSL通信でFlashから別ドメインのPHPにPOSTする時のIE6/7/8のエラー

■環境
①https://hoge.com/index.html
・トップページにはFlashのフォームがあり、②のサーバにデータを送信する。

②https://example.com/index.php
・Flashからデータを受け取りDBに登録する。
・XMLを出力しFlashに返す。

■現象
・SafariやChrome・FireFox・IE9では正常に登録できる状態で、
IE6/7/8ではPHPへデータを送信できていない。

■その他
・https://example.com/crossdomain.xmlは設置済み

<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*" secure="false" />
</cross-domain-policy>

■解決策
いろいろ調査した結果、example.comに置いてあるPHPのCache設定がよくないらしい、、、
IEのバグらしくSSLでアクセスしたときにsession_cache_limiterがnocacheだとFlashから読み込めないんです。

SSL 経由でファイルのダウンロードを Internet Explorer キャッシュ コントロール ヘッダーが機能しません

PHPのsession_start();を行う前に

session_cache_limiter('private');

を追記。

session_cache_limiter

そして、ページを描画する前にheaderでLast-Modifiedを送信することで、
キャッシュに残っているPHPを読み込みなおしてくれます。

header("Cache-Control","public");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT");

今回はFacebookのJavascript SDKが使い物にならず、
PHPのSDKを使うことから始まりました。
そもそもFlashから直接SDKを使用すると、OAuth以外まともに動いてくれませんでした。

PHP用のFacebook SDKは優秀で、コードを殆ど書かなくても使用できるのが便利です。
TwitterのOAuthよりかなり簡単です。
しばらくは、自前のFlash用SDKを使用して、Facebookとのやりとりを行うとします。

【PHP】桁数を統一できるカウンタ。注文番号などに使う!

PHPでDBを使わずに、注文番号の管理をしたいと先方に言われたので、
カウンターを作って、ゼロ埋めして返すFunctionを作成しました。

引数には、カウンタのファイル名と桁数を入力すると、
返り値に注文番号を返します。

■実行

$order_no = $this->counter(dirname($_SERVER['DOCUMENT_ROOT']).'/approot/count.txt',6);

■関数

/*
 * @access  public
 * @param     String    $filename    カウンタファイル保存先
 * @param     Int    $sprintf    桁数を統一
*/

public function counter($filename,$sprintf = 1){
  //ファイルがなかったら作成する
  if (!file_exists($filename)) {
    touch( $filename );
    chmod( $filename, 0777 );
  }
  $fp = @fopen($filename,"r+") or die("ファイルが開けません");
  flock($fp, LOCK_EX);
  $count = fgets($fp, 64);
 
  if( (int)$count === 0 ){
    //ファイルがない場合のデフォルトは1
    $count = 1;
  }else{
    //数値が取得できたら連番をつける
    $count++;
  }
  rewind($fp);
  fputs($fp, $count);
  fclose($fp);
  return sprintf('%0'.$sprintf.'d', $count);
}

【PHP】クレジットカードチェックサンプル

CrackingCreditCode11

CrackingCreditCode11

クレジットカード情報の番号が正しいか確認できるアルゴリズムを見つけたので、
PHPで実装してみました。

外部への通信は行なわないので、ブラックリストなどチェックはクレジットカード会社に任せるとして、入力された数字がクレジットカード番号で正しいかチェックします。

サンプルソースは公開しておりますが、
実際のクレジットカード番号は決して入力しないでください。
試す場合は、ローカルにて実装してからご確認下さい。
正規表現でチェックする方法もありますが、
今回行なっているのは数値チェックと、クレジットカードのアルゴリズムのチェックだけです。
あとは桁数チェックとかあれば尚よいかも。

【PHP】クレジットカードチェックサンプルソースコード

APIなどでクレジットカード会社に与信チェックするときにお金がかかる場合がありますが、
これを実装しておけばある程度はAPIを叩く回数が減るので節約になるかも知れませんね。

また、全てのクレジットカードで確認してないので、
だめだった場合は、コメントに内容を書いていただけると修正します!

【PHP】リファラ(どこから遷移か)確認する。

JavaScriptでhistory.back();でやっていた戻るボタンですが、
システムが入ると再送信しますか?など聞かれてしまうので、
PHP側でREFERERを取得し直接リンクを貼ることにしました。

PHPのFunctionです。

$_SERVER['HTTP_REFERER']

aタグにこれ入れとくだけで前回いたページに戻れるので便利ですね。
でもこれだけ入れておくと、セキュリティ的にあまりよくないかもしれないので、
一度検索してからそれに対応するページを固定で入れた方がよさそうです。

if( stripos($_SERVER['HTTP_REFERER'],’aaaa’) ){
$page = ‘/test.html’;
}else{
$page = ‘/’;
}

【PHP】配列から重複を削除する

array_unique関数を使用することで、簡単に配列から重複を削除できます。

$array = array(2,2,3,3,1,2);
$array2 = array_unique($array);

$array2の結果は
array(2,3,1)
になります。