PHP Perl 2021年08月18日 19:52 編集
PerlからPHPへ書き換えからの続きです。
qq()を""へ置換して内部の"をエスケープするのがエディタの正規表現置換ではうまくいかないということで、PHPを使ってその書き換えをすることにしましたが、どうせならついでにほかの置換部分、ダブった変数の書き換えもやれるようにしたのが、perl2php.phpです。
xamppなどを入れてローカルでPHPを動かせる環境を持ち、自分でperlやPHPを書いている人対象ということになります。使用する場合はあくまでも自己責任でお願いします。
qq()を""へ置換して内部の"をエスケープするのがエディタの正規表現置換ではうまくいかないということで、PHPを使ってその書き換えをすることにしましたが、どうせならついでにほかの置換部分、ダブった変数の書き換えもやれるようにしたのが、perl2php.phpです。
ver.1.0 2014/11/28 機能制限モード追加久しぶりに更新しました。PHPの仕様変更への対策だけですが。Xampp8.0.3参照
ver.1.1 2021/08/18 PHP8でうまく動かないのを修正
- ダウンロード perl2php_ver1.2.zip (30Download)
xamppなどを入れてローカルでPHPを動かせる環境を持ち、自分でperlやPHPを書いている人対象ということになります。使用する場合はあくまでも自己責任でお願いします。
counter:10,144
PHP 2022年10月03日 20:20 編集
姉妹ページ?で紹介しているサブネット計算PHPのアクセスが結構多いらしいのですが、「ページがモバイル フレンドリーではありません。」などと表示されていたので、レスポンシブ対応に書き換えてみました。せっかくなので公開します。
- サンプル
- ダウンロード  subnet.zip (16Download)
counter:5,152
PHP 2022年03月22日 19:42 編集
PHP/用語集作成 PHP/掲示板PHPにブルートフォース攻撃対策処理を追加しましたが、他にも使えるかもしれないと思ったので、対策処理部分をモジュールにしました。
login_ver1.05.zip (38Download)
ver.1.01 2021.07.27 メール送信機能を追加。function send_mail追加総当たり攻撃はユーザーIDを固定して複数のパスワードでの認証を試みるブルートフォースアタックと、逆にパスワードを固定して複数のユーザーIDでの認証を試みるリバースブルートフォースアタックというのがあるということなので、このモジュールでは同じIDあるいは同じパスワードで10分間にに3回ログインに失敗したら60分間ログインをロックします。
ver.1.02 2021.07.28 メール送信のルールを整理。ロックディレクトリの大文字小文字を識別するように修正。
ver.1.03 2021.08.06 関数外で指定した変数が反映されない場合があるのを修正。
ver.1.04 2021.08.10 utf-8以外の文字コードのPHPファイルから呼び出す場合、IDやパスワードが日本語だとうまく動作しないのを修正。
ver.1.05 2022.03.22 若干修正。
counter:7,516
PHP 2022年10月06日 02:05 編集
掲示板PHPスクリプトです。
- サンプル スパム投稿テスト用サンプル
- ダウンロード
bbs_ver1.06.zip (22Download)
bbs_ver1.059.zip (32Download)
counter:6,915
PHP 2022年10月13日 23:44 編集
用語集を作成するためのPHPプログラムです。
- サンプル
- ダウンロード
term_ver1.184.zip (19Download)
term_ver1.182.zip (36Download)
- インデックスを新着順、索引、カテゴリー別に切り替えられます。
- 記事内に他の記事のタイトルがあれば自動的にリンクを張り、記事の内容を一部ポップアップ表示します。
- 記事にカテゴリーを設定することができます。カテゴリーによる絞り込み、分類表示が可能です。一つの記事に複数のカテゴリーを指定することができます。
- 同じタイトルで内容が違う記事を複数作成することができます。
- 管理者設定で「管理者のみ投稿可」、「誰でも投稿可」を指定できます。
- pluginディレクトリにphpファイルを入れると、プラグインとして機能させることができます。
counter:10,880
PHP 2018年05月25日 16:37 編集
ローカルPCにインストールしているXamppをアップデートしてPHPのバージョンがPHP7.2.5になったらあちこちで警告が出るようになりました。
create_functionを使わず、ネイティブの無名関数を使ったほうがいいということです。具体的には
$attr['ID']がsetされてなかったら、''を代入するという処理です。$attrが未定義の場合も問題ないはずでなぜエラーになるかわかりませんでしたが、調べてみると$attrの型がstringになっている場合もあって、その状態で実行するとエラーになっているようです。エラーを回避するためにとりあえず上記の式の前に
'0.84479900 1527156353'
のような文字列を返しています。PHP7.1ではこの文字列のまま計算しても適当にfloatに変換してくれていましたが、7.2では警告が出るようになりました。microtime(True)を指定するとfloatを返しますが、小数点以下の桁数が減るので、文字列のままにした方がより精度の高いマイクロ秒が得られます。文字列は小数部分と整数部分をスペースで区切っているので、小数部分だけを抽出するために
バージョン7.2では、型について厳格になったようです。別の型ということになっているのにその型ではできない処理をしようとしたら、前のバージョンではその処理が行える型に変更したりする部分もあったが7.2以降ではエラーや警告を出すということになっているようです。
create_function()は非推奨
まず、create_function関数が非推奨になったためにその警告が出ます。create_functionを使わず、ネイティブの無名関数を使ったほうがいいということです。具体的には
create_function( '$a,$b', 'return strlen( $b ) - strlen( $a );' )は
function($a,$b) { return strlen( $b ) - strlen( $a ); }に変えます。
each()も非推奨
このほかeach()関数も非推奨になっています。mpdfモジュールでwhile(list($file,$info)=each($this->images)) {という部分で警告が出ているので、
foreach ($this->images as $file=>$info) {と変更すると警告は出なくなりました。
非配列に要素を追加すると警告
mpdfモジュール関係ではcssmgr.pdfでif (!isset($attr['ID'])) { $attr['ID']=''; }のような行でも警告が出るようになりました。
$attr['ID']がsetされてなかったら、''を代入するという処理です。$attrが未定義の場合も問題ないはずでなぜエラーになるかわかりませんでしたが、調べてみると$attrの型がstringになっている場合もあって、その状態で実行するとエラーになっているようです。エラーを回避するためにとりあえず上記の式の前に
if (isset($attr) && !is_array($attr)) { $attr = array(); }を追加するとなんとかエラーが出なくなりました。
文字列の計算をすると警告
$tm1 = microtime();を実行すると警告が出るようになりました。microtime()は、現在の Unix タイムスタンプをマイクロ秒単位で返す関数ですが、デフォルトではfloatではなく、
$tm2 = microtime();
echo $tm1 - $tm2;
'0.84479900 1527156353'
のような文字列を返しています。PHP7.1ではこの文字列のまま計算しても適当にfloatに変換してくれていましたが、7.2では警告が出るようになりました。microtime(True)を指定するとfloatを返しますが、小数点以下の桁数が減るので、文字列のままにした方がより精度の高いマイクロ秒が得られます。文字列は小数部分と整数部分をスペースで区切っているので、小数部分だけを抽出するために
list($tm1) = explode(' ',microtime());のように変更すると警告は出なくなりました。
list($tm2) = explode(' ',microtime());
echo $tm1 - $tm2;
配列の追加
キーが数値の配列に追加する場合はarray_push('abc')とするより
$array[] = 'abc';の方が速いらしいということで、もっぱら下を使っていますが、追加する変数の型が配列になっていないとエラーが出るようになりました。たとえば
$array = '';はエラーになるので、$arrayの型がarray以外になっている可能性がある場合は、
$array[] = 'abc';
unset($array)あるいは
$array = array();と初期化しておく必要があります。これは[]を使って配列を追加する場合だけでなく、配列型になっていない変数を配列として扱おうとすると、同じようなことが起こると思われます。
バージョン7.2では、型について厳格になったようです。別の型ということになっているのにその型ではできない処理をしようとしたら、前のバージョンではその処理が行える型に変更したりする部分もあったが7.2以降ではエラーや警告を出すということになっているようです。
counter:5,396
PHP 2022年03月18日 19:34 編集
XamppをアップデートしたらPHPも8.1.2になった。
いくつか推奨されなくなる機能がある。ウチのPHP関係では
いくつか推奨されなくなる機能がある。ウチのPHP関係では
暗黙の float から int への変換
intを使わなくてはいけない時にfloatを使っていた場合、アラートが出るようになった。$width = 92.5;これまでは黙ってintに変換して適用していたが、元のfloatの値と変わってしまうのでアラートを出すことにしたらしい。単にintで指定すべきところをfloatで指定したからというわけではなく、
$height = 50.1;
$canvas = imagecreatetruecolor($width, $height);
$width = 92.0;のように小数点以下が0の場合はintに変換しても値が変わらないのでアラートは出ない。
counter:5,425
PHP 2023年04月15日 17:19 編集
XamppをアップデートしたらPHPが8.2.4になった。
結構あちこちで${var}と書いているので、サクラエディタの置換機能を使って一気に置換することにする。
正規表現を有効にして置換前は
文字列中の変数展開
文字列中で変数展開するとき、ほかの文字列と干渉するのを避けるため変数名を{}で囲う場合があるが、囲い方が悪いとUsing ${var} in strings is deprecated, use {$var} instead inと警告が出るようになった。$も含んで囲わないとだめということだ。
結構あちこちで${var}と書いているので、サクラエディタの置換機能を使って一気に置換することにする。
正規表現を有効にして置換前は
\${(.+?)}置換後は
{\$$1}とすれば効率的に置換できる。
counter:2,726
PHP 暗号 2016年08月22日 12:20 編集
パスワードをハッシュ化する場合、perlでは、crypt関数を使うと有効な文字列が8文字までという制限が有るため、MD5モジュールを使ってハッシュ化していたが、PHPの場合は逆にcryptを使った方が強度は高いようだ。
ハッシュ化の目的は、サーバー上に保存したパスワードが万一漏洩しても、元のパスワードが知られないようにするためで、この場合復号する必要は無い。ハッシュ化されたパスワードと元のパスワードを照合して、ハッシュ化されたものが元のパスワードから生成されたものであることがわかりさえすればいい。
PHPでmd5()関数を使うと、ハッシュ値と呼ばれる32桁の16進数に変換される。
「abcd」とハッシュ化された文字列は1対1の対応で、「abcd」を何度md5でハッシュ化しても「e2fc714c4727ee9395f324cd2e7f331f」になる。
このハッシュ値から元の文字列を得る方法はない。つまり「e2fc714c4727ee9395f324cd2e7f331f」から元の「abcd」を得ることはできないということが、秘匿性を守る根拠になっている。
ところが、ハッシュ値のデータベースから元の値を得るモジュールなるものが存在するらしい。
ハッシュ化の目的は、サーバー上に保存したパスワードが万一漏洩しても、元のパスワードが知られないようにするためで、この場合復号する必要は無い。ハッシュ化されたパスワードと元のパスワードを照合して、ハッシュ化されたものが元のパスワードから生成されたものであることがわかりさえすればいい。
PHPでmd5()関数を使うと、ハッシュ値と呼ばれる32桁の16進数に変換される。
$str = 'abcd';実行結果
$md5 = md5($str);
echo $md5;
e2fc714c4727ee9395f324cd2e7f331fたとえば上記のように「abcd」という文字列をmd5でハッシュ化すると、「e2fc714c4727ee9395f324cd2e7f331f」という文字列が得られる。
「abcd」とハッシュ化された文字列は1対1の対応で、「abcd」を何度md5でハッシュ化しても「e2fc714c4727ee9395f324cd2e7f331f」になる。
このハッシュ値から元の文字列を得る方法はない。つまり「e2fc714c4727ee9395f324cd2e7f331f」から元の「abcd」を得ることはできないということが、秘匿性を守る根拠になっている。
ところが、ハッシュ値のデータベースから元の値を得るモジュールなるものが存在するらしい。
counter:7,180
PHP 2016年08月22日 12:20 編集
日付のログを残す必要がある場合、あまり考えずにtime()関数で得られるエポック秒をそのまま保存していたが、エポック秒は2038年問題を起こすらしい。
2038年にならなくてもエポック秒同士の計算をしてその結果が最大値2147483647を超えるとエラーを起こすことになる。最大値を超えるとマイナスになってしまうというケースもあるようだが、Xamppを使用したローカル環境でテストしてみると、最大値を超えるとintegerではなくfloat値と判断され、エポック秒を使う関数では、float値を想定していないのでエラーになる。
とりあえず、time()を使っている部分はdate_createやDateTimeを使って書き換えたが、setcookie関数にもエポック秒を渡すことになっているのが面倒。
指定しなければ、ブラウザを閉じるまで有効なクッキーということになるらしいが、それではクッキーの意味が無い。
このようにエポック秒でしか得られないもの、指定できないものもあるようなので、完全にエポック秒を使わないというのは難しそうだ。エポック秒を64bit整数値で扱うようになれば、最大値が桁違いに増えるため実質的に問題はなくなりそうだ。32bitのままでも符号付きから符号なし整数値で処理できれば、扱える年数が数十年延びる。おとなしくPHPの仕様の変更を待つ方がいいかも知れない。
今のところ注意すべきは日付の足し算をする場合、エポック秒のままで計算すると上限を超えてしまうおそれがあるということだ。たとえば2016年の25年後を計算したら超えてしまう。引き算も結果が1970年以前になるとエラーになる。このため、こうした計算をする場合はdate_createやDateTimeを使ってtimeオブジェクトを生成した方がいい。
2038年問題
エポック秒とは1970年1月1日午前0時0分0秒からの経過秒のことで、1秒ごとに1増えている。そしてこのエポック秒は符号付き整数値という形式になっているが、この符号付き整数値の最大値が2147483647で、2038年1月19日午前3時14分8秒にこれを超えてしまう。2038年にならなくてもエポック秒同士の計算をしてその結果が最大値2147483647を超えるとエラーを起こすことになる。最大値を超えるとマイナスになってしまうというケースもあるようだが、Xamppを使用したローカル環境でテストしてみると、最大値を超えるとintegerではなくfloat値と判断され、エポック秒を使う関数では、float値を想定していないのでエラーになる。
日付フォーマット
エポック秒のままログに保存するのはやめた方が良さそうだが、すでに保存されているログをすべて修正するのも面倒だ。時間ログとして保存されている数値が符号付き整数値になっている場合は、エポック値として処理し、そうでない場合は新しいフォーマットとして処理することにする。とりあえず、time()を使っている部分はdate_createやDateTimeを使って書き換えたが、setcookie関数にもエポック秒を渡すことになっているのが面倒。
指定しなければ、ブラウザを閉じるまで有効なクッキーということになるらしいが、それではクッキーの意味が無い。
このようにエポック秒でしか得られないもの、指定できないものもあるようなので、完全にエポック秒を使わないというのは難しそうだ。エポック秒を64bit整数値で扱うようになれば、最大値が桁違いに増えるため実質的に問題はなくなりそうだ。32bitのままでも符号付きから符号なし整数値で処理できれば、扱える年数が数十年延びる。おとなしくPHPの仕様の変更を待つ方がいいかも知れない。
今のところ注意すべきは日付の足し算をする場合、エポック秒のままで計算すると上限を超えてしまうおそれがあるということだ。たとえば2016年の25年後を計算したら超えてしまう。引き算も結果が1970年以前になるとエラーになる。このため、こうした計算をする場合はdate_createやDateTimeを使ってtimeオブジェクトを生成した方がいい。
counter:5,874