MW211 EXIT

devlog
PHP/private宣言忘れ
2012年05月23日
┌──────────────────────────────────────┐
│class クラス {                                                              │
│  private $変数;                                                            │
│  public function メソッド() {                                              │
│    $this->変数 = '値';                                                     │
│  }                                                                         │
│}                                                                           │
└──────────────────────────────────────┘
「$this->変数」の場合、「public」や「private」が宣言されていないと
エラー(Notice)になる…、と思っていたのだが、参照(echoとか)は確かにエラーとなる。
しかし、代入する分にはエラーとならない。
┌──────────────────────────────────────┐
│class クラス {                                                              │
│//private $変数;                                                            │
│  public function メソッド() {                                              │
│    $this->変数 = '値';                                                     │
│  }                                                                         │
│}                                                                           │
└──────────────────────────────────────┘
しかも、代入して以降は参照もできてしまう。
なんと、外部からも参照できてしまうのだ。
つまり、下記のようにpublic宣言したのと同じような動きとなるわけだ。
┌──────────────────────────────────────┐
│class クラス {                                                              │
│  public $変数;                                                             │
│  public function メソッド() {                                              │
│    $this->変数 = '値';                                                     │
│  }                                                                         │
│}                                                                           │
└──────────────────────────────────────┘
てっきり、エラー(Notice)で警告してくれるものだとばかり思っていたから
かなり意外だった(気をつけなければ)。
分類:PHP
PHP/Shift_JISとUTF-8
2012年05月12日
「UTF-8」にあるのに「Shift_JIS」にはない文字というのがある。

(マルチバイト文字)「1文字」に対して「Shift_JIS」は「2バイト」使うのに対して
「UTF-8」は「3バイト」とか使うのだから、当然そういう文字があっても不思議はない。

で、そういう文字を「UTF-8→Shift_JIS」変換したらどうなるのか?
大抵は「?」とか特定の文字に変換される。
┌──────────────────────────────────────┐
│mb_convert_encoding('■', 'SJIS-win', 'UTF-8');                             │
└──────────────────────────────────────┘
この結果は「?」となる。(「■」が「UTF-8」固有文字だったとする)

┌──────────────────────────────────────┐
│mb_convert_encoding('あいう■えお', 'SJIS-win', 'UTF-8');                   │
└──────────────────────────────────────┘
ちなみにこういう混在している場合は「あいう?えお」となる。
→他の文字に悪影響は与えない

では、「UTF-8→Shift_JIS→UTF-8」と行って来い変換した場合は?
┌──────────────────────────────────────┐
│mb_convert_encoding(mb_convert_encoding('■', 'SJIS-win', 'UTF-8'),         │
│                    'UTF-8',                                                │
│                    'SJIS-win');                                            │
└──────────────────────────────────────┘
結果は「?」。

一旦「?」になってしまったら、もう「?」なのだ。
分類:PHP、文字コード
PHP/ホスト名を取得する方法
2012年05月11日
┌──────────────────────────────────────┐
│$ip = getenv("REMOTE_ADDR");                                                │
│$host = getenv("REMOTE_HOST");                                              │
│if (($host == NULL) || ($host == $ip)) {                                    │
│  $host = gethostbyaddr($ip);                                               │
│}                                                                           │
└──────────────────────────────────────┘
分類:PHP
PHP/IPアドレスを取得する方法
2012年05月10日
┌──────────────────────────────────────┐
│$ip = getenv("REMOTE_ADDR")                                                 │
└──────────────────────────────────────┘
分類:PHP
PHP/文字コード変換
2012年05月09日
「①」←→「e291a0」(UTF-8)
上記のように文字とそのコードを変換する方法。
┌──────────┬───────────────────────────┐
│「①」─→「e291a0」│bin2hex('①')                                         │
├──────────┼───────────────────────────┤
│「①」←─「e291a0」│hex2bin('e291a0')                                     │
└──────────┴───────────────────────────┘
二文字以上の文字列でもOK。

但し、「hex2bin()」はPHP5.4以降から実装されるので、
使えない場合は自作関数を代替か。
分類:PHP
PHP/TRUEとFALSEの出力
2012年05月01日
TRUEとFALSEを出力した結果は以下のとおり。
┌─────┬──────┬──────┐
│          │    TRUE    │   FALSE    │
├─────┼──────┼──────┤
│echo      │     1      │            │
├─────┼──────┼──────┤
│print_r() │     1      │            │
├─────┼──────┼──────┤
│var_dump()│ bool(true) │bool(false) │
└─────┴──────┴──────┘
分類:PHP
PHP/セッションのまとめ
2012年04月28日
┌─────────┬────────────────────────────┐
│クッキー          │ブラウザ側(クライアント側)に記録される情報              │
│                  │有効期限を設定できるが、たいていはブラウザを閉じたら消滅│
│                  │セッション情報についてはIDのみを記録する                │
│                  │※ブラウザ側にあるものなので、詳細な情報を記録すると    │
│                  │  容易に改竄されてしまうおそれがある                    │
├─────────┼────────────────────────────┤
│セッションファイル│サーバ側に記録される情報                                │
│                  │セッション情報の中身を記録している                      │
│                  │※ファイルを開くと「;」区切形式で容易に内容を確認できる │
│                  │正規の手続きとしては「session_destory()」で削除するが、 │
│                  │その処理が漏れた場合(ブラウザの直接終了など)を考慮し    │
│                  │「php.ini」の設定により、一定の間隔で削除する           │
├─────────┼────────────────────────────┤
│セッションID      │クッキーとセッションファイルを結びつけるID              │
│                  │「session_start()」で生成もしくは使用される             │
└─────────┴────────────────────────────┘
・「session_start()」した場合
  クッキー中からセッションIDを探す
  ・セッションIDがある場合
    そのセッションIDと対応するセッションファイル(セッション情報)を使用する
  ・セッションIDがない場合
    セッションIDを生成し、それに対応するセッションファイルを生成するとともに
    クッキーにセッションIDを記録する
・「session_destory()」した場合
  ・セッションファイルを削除する
────────────────────────────────────────
Q.セッションIDおよびセッションファイル生成後、
    セッションファイルを直接削除したらどうなる?
    #「php.ini」の設定による一定の間隔での削除もこれと同等のはず
A.セッションファイルがない場合、
    別のセッションIDおよびセッションファイルを生成します
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
Q.ブラウザを一旦閉じて、「session_start()」し直した場合はどうなる?
A.「session_destory()」を行わないと、セッションファイルは残ったままだが
    クッキー側にそれに対応するセッションIDが記録されていないので、
    別のセッションファイルが生成される
    ただし一部のブラウザ(IE)では、見た目上ブラウザが終了したように見えても
    プロセスとして残り続けている場合があり、
    引き続き同一セッションファイルを継続使用するケースがあるので注意
    →ブラウザを終了させず、タブだけを終了させた場合と同様
────────────────────────────────────────
分類:PHP
PHP/サニタイズ漏れ検出方法
2012年04月22日
簡単にサニタイズ(XSS対策)漏れを検出する方法。

以下の文字列を手当たり次第、各項目に登録して表示させる。
┌──────────────────────────────────────┐
│<script>alert("@");</script>                                                │
└──────────────────────────────────────┘

アラートダイアログが表示されたら負け(サニタイズ漏れ)だ。
分類:PHP
PHP/特殊文字の変遷
2012年04月21日
今さらながら…、サニタイズして表示した特殊文字って、POSTした場合どうなるの?

「'」は「&#039;」にエスケープされる訳だが、以下のように設定してPOSTしてみた。
┌──────────────────────────────────────┐
│<input type="hidden" name="test" value="&#039;"/>                           │
└──────────────────────────────────────┘
結果は以下の通り、「'」に戻ってる。
┌──────────────────────────────────────┐
│echo $_POST['test'];  →「'」                                               │
└──────────────────────────────────────┘
だから、「'」とか表示させたものをそのまま再入力することができるんですね。

DBから読み出して、画面表示して、POSTして、またDBに戻した場合
例えば「'」は、以下のような変遷を経ることになる。
┌──────────────────────────────────────┐
│┌──┐                                                                    │
││┌───┐                                                                │
│││  '   │…DB上の元の値                            …(1)                 │
││└─┬─┘                                                                │
││    ↓                                                                    │
││┌───┐                                                                │
│││  '   │…PHP変数として取得される値               …(2)                 │
││└─┬─┘                                                                │
││    ↓                                                                    │
││┌───┐                                                                │
│││&#039;│…画面表示のためにサニタイズされた値      …(3)                 │
││└─┬─┘                                                                │
││    ↓                                                                    │
││┌───┐                                                                │
│││  '   │…POSTされた値(PHP変数として取得される値) …(4)                 │
││└─┬─┘                                                                │
││    ↓                                                                    │
││┌───┐                                                                │
│││  \'  │…SQLインジェクション対策で変換された値   …(5)                 │
││└─┬─┘                                                                │
││    ↓                                                                    │
││┌───┐                                                                │
│││  '   │…再度DB上に格納された値                  …(6)                 │
││└───┘                                                                │
│└──┘                                                                    │
└──────────────────────────────────────┘

【おまけ】
ちなみに、「TRUE」の場合、(1)(2)は「TRUE」、(3)(4)(5)で「1」、(6)で「TRUE」、
「FALSE」の場合、(1)(2)は「FALSE」、(3)(4)で「」、(5)(6)で「FALSE」
ってところか。

「if ($_POST['test'])」ってした場合、「1」で真、「」で偽になるしね。

でも大抵は、チェックボックスとか別の形式になるんだけど。
分類:PHP
PHP/php_curlの使用方法
2012年04月19日
「php.ini」の「extension=php_curl.dll」を有効(先頭の「;」を除去)にして再起動。

【追記】
  「libeay32.dll」と「ssleay32.dll」へのパス設定も必要。
  これらは「php.exe」や「php.ini」があるPHPフォルダにあるので
  Windowsの環境変数で設定してあげればよい。(例「Path=C:\Program Files\PHP」)
分類:PHP
前へ 1 … 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 次へ