MW211 EXIT

devlog
PHP/mkdirのパーミッション指定の注意点
2017年01月30日
Linux上のPHPにおいての話。

mkdir()の第二引数にパーミッション(0777など)を指定できるが
「umask」設定の影響を受けるので、その直後にchmod()で設定し直す方が安全である。

「umask」設定値は、「umask」コマンドで確認できる

umask()で、「umask」設定自体を変更することもできるが
元に戻す必要があったり、他への影響も大きいのでこちらは避けた方がよい。
→chmod()の方を推奨
分類:PHP
PHP/未定義変数のNULL化
2017年01月12日
未定義の変数をエラーを伴わずに「NULL」に置き換える方法
┌──────────────┬───────────────────────┐
│isset($変数) ? $変数 : NULL │基本だが、「$変数」を二回記述で冗長的         │
├──────────────┼───────────────────────┤
│$変数 ?? NULL               │PHP7.0以降で使用可能(*1)                      │
├──────────────┼───────────────────────┤
│!empty($変数) ? $変数 : NULL│NULL・0・空文字などもNULLになる               │
├──────────────┼───────────────────────┤
│!$変数 ? $変数 : NULL       │empty()と同じでNULL・0・空文字などもNULLになる│
├──────────────┼───────────────────────┤
│@$変数                      │簡潔だが、エラー制御演算子(@)は避けた方がよい │
└──────────────┴───────────────────────┘
  *1:「isset($変数) ?? $変数」と誤認しがちなので注意
      もし誤用すると「isset()」の結果(「TRUE」か「FALSE」)がそのまま返却される

$_GET['xxx']、$_POST['xxx']などでも使える。
分類:PHP
PHP/mb_convert_encoding()とNULL
2017年01月11日
「mb_convert_encoding()」に「NULL」を渡すと、空文字「''」に変換されるので注意。
┌──────────────────────────────────────┐
│mb_convert_encoding(NULL, 'SJIS-win', 'UTF-8'   );                      →''│
├──────────────────────────────────────┤
│mb_convert_encoding(NULL, 'UTF-8'   , 'SJIS-win');                      →''│
└──────────────────────────────────────┘
「NULL」のままにしたい場合には事前に迂回する必要がある。
分類:PHP
PHP/crypt()
2016年12月03日
【暗号化】
┌──────────────────────────────────────┐
│$暗号文 = crypt($平文);                                                     │
└──────────────────────────────────────┘

【照合】
┌──────────────────────────────────────┐
│if (crypt($平文, $暗号文) === $暗号文) {                                    │
│    echo '一致する';                                                        │
│} else {                                                                    │
│    echo '一致しない';                                                      │
│}                                                                           │
└──────────────────────────────────────┘
分類:PHP
Apache/PHPの設定
2016年12月02日
「httpd.conf」における以下の記述が肝。
┌──────────────────────────────────────┐
│LoadModule php5_module "C:\PHP\php5apache2_4.dll"                           │
│AddHandler application/x-httpd-php .php                                     │
│PHPIniDir "C:\PHP\"                                                         │
└──────────────────────────────────────┘
「C:\PHP\php5apache2_4.dll」と「C:\PHP\」は適宜変更のこと。

分類:PHP、Apache
PHP/password_hash()など
2016年11月30日
PHP5.5から導入された「password_hash()」等の暗号化関係の関数について。

【暗号化】
  「password_hash()」は暗号化するための関数である。
┌──────────────────────────────────────┐
│$暗号文 = password_hash($平文, PASSWORD_DEFAULT);                           │
└──────────────────────────────────────┘
  暗号化結果($暗号文)は、現状は60文字のハッシュ値となるが、
  格納する領域は将来的な拡張に備え255文字あたりにした方が無難。

【照合】
  「password_verify()」は照合するための関数である。
┌──────────────────────────────────────┐
│if (password_verify($平文, $暗号文)) {                                      │
│    echo '一致する';                                                        │
│} else {                                                                    │
│    echo '一致しない';                                                      │
│}                                                                           │
└──────────────────────────────────────┘

【暗号文のレベルを上げる】
  暗号文の難易度レベルは、コストに比例するので、
  使用するハードに適したコストのレベルにしなければならない。
  (難しすぎると処理が重くなり使いものにならない)
  但し、ハードを交換して性能が上がった場合には、レベルをあげたくなる。
  この場合は、以下の方法をとる。
┌──────────────────────────────────────┐
│// まず暗号文と照合し、平文を確認                                           │
│if (password_verify($平文, $暗号文)) {                                      │
│    $options = array('cost' => 11);  // 既定より一つ上のレベルのアルゴリズム│
│    // その暗号文が一つ上のレベルのアルゴリズムを満たさないか?             │
│    if (password_needs_rehash($暗号文, PASSWORD_DEFAULT, $options)) {       │
│        // 満たしていなければそのレベルで暗号文を再生成                     │
│        $暗号文 = password_hash($平文, PASSWORD_DEFAULT, $options);         │
│    }                                                                       │
│}                                                                           │
└──────────────────────────────────────┘
  「password_needs_rehash()」は暗号のレベルを判断するための関数である。


【暗号内容確認】(暗号化前の平文は確認できないが)
  「password_get_info()」は暗号のレベル等の情報を確認するための関数である。
┌──────────────────────────────────────┐
│$暗号内容に関する連想配列 = password_get_info($暗号文);                     │
└──────────────────────────────────────┘
分類:PHP
PHP/HTTP500内部サーバエラー調査
2015年09月01日
再現できるなら、まずエラーを見てみよう。
┌──────────────────────────────────────┐
│ini_set('display_errors', On);                                              │
│error_reporting(E_ALL);                                                     │
└──────────────────────────────────────┘
PHPソースコードの冒頭に以下の処理を埋め込めばよい。

画面にエラーメッセージが表示されるはず。
分類:PHP
PHP/file_get_contents()の限界
2015年08月18日
「file_get_contents()」はホームページの値をまるごと取得できたりするが
JavaScriptで表示されているもの、JavaScriptで表示された値は取得できない。

つまり、起動時にJavaScriptで何らかの値を表示しているホームページに
アクセスした場合、JavaScriptが動作する前の状態を取得してしまうということだ。

なぜできないのかというと、JavaScriptは各ブラウザが処理を行うもので
PHPはそこまでは範疇ではない(JavaScriptを動作させるまでの機能を持たない)からだ。

ということで、こういったことを実現したい場合には、他をあたるしかない。

一例としては、VBScriptでIEオブジェクトを起動し
IEとしてアクセスを行い、JavaScript動作後の値を取得するとかだ。

…といって、IE以外ではVBScriptは動かないし、
IE自体もIE11以降はサポートを打ち切っているので、この案は無理に等しい。
分類:PHP
PHP/MSSQL連携
2015年08月08日
PHPからMSSQL(SQL Server)にアクセスできるようにするには
別途「Microsoft Drivers for PHP for SQL Server」dllを入手しアサインする

(1) Microsoft公式サイトから「SQLSRVxx.EXE」をダウンロードする
    https://www.microsoft.com/en-us/download/details.aspx?id=20098
    →以下のバージョンが取得可能(PHPやWindowsバージョンに合わせて選択)
      ・4.0(SQLSRV40.EXE)
      ・3.2(SQLSRV32.EXE)
      ・3.1(SQLSRV31.EXE)
      ・3.0(SQLSRV30.EXE)

(2) 上記EXEを実行すると、ファイルが取得(解凍)される
    途中で、解凍先を聞いてくるので任意のフォルダを選択

(3) 解凍された一式から「php_sqlsrv_xx.dll」と「php_pdo_sqlsrv_xx.dll」を
    条件に応じて一組だけ選び、
    extフォルダ(「C:\Program Files\PHP\ext」など)へ置く(コピーする)
    ┌────┬────────────┬──────────────┐
    │SQLSRV30│php_sqlsrv_53_ts.dll    │php_pdo_sqlsrv_53_ts.dll    │
    │        │php_sqlsrv_53_nts.dll   │php_pdo_sqlsrv_53_nts.dll   │
    │        ├────────────┼──────────────┤
    │        │php_sqlsrv_54_ts.dll    │php_pdo_sqlsrv_54_ts.dll    │
    │        │php_sqlsrv_54_nts.dll   │php_pdo_sqlsrv_54_nts.dll   │
    ├────┼────────────┼──────────────┤
    │SQLSRV31│php_sqlsrv_54_ts.dll    │php_pdo_sqlsrv_54_ts.dll    │
    │        │php_sqlsrv_54_nts.dll   │php_pdo_sqlsrv_54_nts.dll   │
    │        ├────────────┼──────────────┤
    │        │php_sqlsrv_55_ts.dll    │php_pdo_sqlsrv_55_ts.dll    │
    │        │php_sqlsrv_55_nts.dll   │php_pdo_sqlsrv_55_nts.dll   │
    ├────┼────────────┼──────────────┤
    │SQLSRV32│php_sqlsrv_54_ts.dll    │php_pdo_sqlsrv_54_ts.dll    │
    │        │php_sqlsrv_54_nts.dll   │php_pdo_sqlsrv_54_nts.dll   │
    │        ├────────────┼──────────────┤
    │        │php_sqlsrv_55_ts.dll    │php_pdo_sqlsrv_55_ts.dll    │
    │        │php_sqlsrv_55_nts.dll   │php_pdo_sqlsrv_55_nts.dll   │
    │        ├────────────┼──────────────┤
    │        │php_sqlsrv_56_ts.dll    │php_pdo_sqlsrv_56_ts.dll    │
    │        │php_sqlsrv_56_nts.dll   │php_pdo_sqlsrv_56_nts.dll   │
    ├────┼────────────┼──────────────┤
    │SQLSRV40│php_sqlsrv_7_ts_x64.dll │php_pdo_sqlsrv_7_ts_x64.dll │
    │        │php_sqlsrv_7_nts_x64.dll│php_pdo_sqlsrv_7_nts_x64.dll│
    │        ├────────────┼──────────────┤
    │        │php_sqlsrv_7_ts_x86.dll │php_pdo_sqlsrv_7_ts_x86.dll │
    │        │php_sqlsrv_7_nts_x86.dll│php_pdo_sqlsrv_7_nts_x86.dll│
    └────┴────────────┴──────────────┘

(4) 「php.ini」(「C:\Program Files\PHP\php.ini」など)に
    上記二つのDLLアサインを追記する
    ┌─────────────────┐
    │[PHP_SQLSRV_xx]                   │
    │extension=php_sqlsrv_xx.dll       │
    │[PHP_PDO_SQLSRV_xx]               │
    │extension=php_pdo_sqlsrv_xx.dll   │
    └─────────────────┘
    なお、角括弧の行(セクションマーカ)は単なる目印で影響を及ぼさないので
    記述しなくともよい(もしくは適当に周囲に合わせて記述する)

(5) 「phpinfo()」にて、以下が確認できればOK
    ・「PDO」の「PDO drivers」に「enabled」として「sqlsrv」が追加されていること
    ・「pdo_sqlsrv」(セクション)が追加されていること
分類:PHP、PDO
PHP/パスワード暗号化関数
2015年02月19日
以下の関数がある(強度の弱い順)。
┌────────┬──────┬────────────┬─────────┐
│   暗号化関数   │ 暗号化結果 │          環境          │     照合手段     │
├────────┼──┬───┼────────────┼─────────┤
│md5()           │固定│32文字│PHP5.3~                │md5()             │
├────────┼──┼───┼────────────┼─────────┤
│crypt()         │可変│34文字│PHP5.3~                │crypt()           │
├────────┼──┼───┼────────────┼─────────┤
│password_hash() │可変│60文字│PHP5.5~(PHP5.3.7~(*1))│password_verify() │
└────────┴──┴───┴────────────┴─────────┘
  *1:標準関数となったのはPHP5.5以降だが、その前に別途ライブラリとしてあった

  ・「md5()」は結果が固定なので解読されるリスクが高い
  ・「crypt()」は「salt」の指定等を自前でチューニングする必要あり
  ・「password_hash()」が簡潔にして強固(現状最適)

使用例は以下のような感じ。
┌────────────────┬─────────────────────┐
│             暗号化             │                   照合                   │
├────────────────┼─────────────────────┤
│$暗号文 = md5($平文);           │if (md5($平文) === $暗号文) {             │
│                                │    echo '○';                            │
│                                │} else {                                  │
│                                │    echo '×';                            │
│                                │}                                         │
├────────────────┼─────────────────────┤
│$暗号文 = crypt($平文);         │if (crypt($平文, $暗号文) === $暗号文) {  │
│                                │    echo '○';                            │
│                                │} else {                                  │
│                                │    echo '×';                            │
│                                │}                                         │
├────────────────┼─────────────────────┤
│$暗号文 = password_hash(        │if (password_verify($平文, $暗号文)) {    │
│              $平文,            │    echo '○';│                          │
│              PASSWORD_BCRYPT   │} else {                                  │
│          );                    │    echo '×';│                          │
│                                │}                                         │
└────────────────┴─────────────────────┘
  ・「crypt()」照合で比較する左辺と右辺の「$暗号文」は同じ値である必要あり
    「$暗号文」を「crypt($平文)」に置換すると値に相違が発生し照合できない
  ・「password_hash()」には「PASSWORD_DEFAULT」も指定でき
    その時の最善策が選択されるが、現状は「PASSWORD_BCRYPT」が採用
分類:PHP
前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 … 18 次へ