ホーム » PHP
「PHP」カテゴリーアーカイブ
TryHackMe を使って…
先日「7日間でハッキングをはじめる本」を購入して,その内容をやった.
7日間とはいかず,2週間程度かかってしまった.
20年位前に作成した Web のシステムでは,これらの知識がなかったため幾つか問題があった.
何年か前に修正済みで,そのほとんどが「クロスサイトスクリプティング」だったと思う.
「OSコマンドインジェクション」などは知っていたが,ポートスキャンやパスワードの具体的な部分がわかった.
デフォルトポートの危険性や,パスワードで「数桁の数字」などは意味がないことがよくわかる.
外には公開していないので問題なかったとは思うが
LAN 内の幾つかの機器をポートスキャンしてみると,意図していないものが開いたままのものがあった.
10年位前に追加したもので,設定を間違えたのか,デフォルトで開いていたのか…
2024/10/02
この様な記事を書いたからというわけではないと思うが,昨日から次の様なアクセスが来ている.
//mish.work/?a='>"></script><svg/onload=confirm(1)>&b='>"></script><svg/onload=confirm(2)>&c=...
特に問題ないと思うが,ログが汚くなってしまう.
DSM 7 upload_max_filesize
DS220+ セットアップ-3
WordPress などは動作する様になったが,通常のページで PHP が動作していない?
html は表示できるが,php は「500 この要請を処理している間にエラーが発生しました。」のエラー.
以前 DS115j をセットアップ した時に,PHP のバージョンなどを指定できた.
検索してもあまりうまく引っかからない.
Web Station をいろいろ弄っているとあった.
「Web サービス ポータル」で表示されるリストから「デフォルト サーバー」を選択すると「編集」できる様になる.
これで,php も動作する様になった.
ASUSTOR NAS upload_max_filesize
ASUSTOR NAS でアップロードできるファイルの制限は 2M になっている.
今回,別の NAS の WordPress ファイルをインポートしようとすると,2MB の制限に引っ掛かって読み込めない.
以前は PHP 5.6 に切替て対応した が,今はこの方法が使えないので php.ini を変更することに.
SSH 接続 して php.ini の upload_max_filesize を 20M に.
反映させるために App Central で PHP 7 を一度停止して,すぐに実行.
Web Center の「Webサーバー」で「有効」にする必要がある.
今回のインポートしようとしたファイルは,11 MB 程度あった.
そのため post_max_size も 8M から 32M に変更.
1 時間程度かかってインポートできた.
WordPress のインポート
Iwao の新規ユーザを作成できませんでした。投稿は現在のユーザに関連付けられます。
amp_validation_error 48cc07251c8d5157b9e9a897d0ed4499 のインポートに失敗しました
amp_validation_error 502662b90c836da49548b5e05fa9600e のインポートに失敗しました
amp_validation_error 6ba58cff20693639d052998163af35c9 のインポートに失敗しました
amp_validation_error 74f0569466346207f7e684496a8f8abc のインポートに失敗しました
amp_validation_error 8c32527465654f1f049900723ae0e156 のインポートに失敗しました
amp_validation_error 95f0f68b6007fd64c4baaea2c4190c0d のインポートに失敗しました
amp_validation_error a23b7a8625ee5499036e0a944b77fb53 のインポートに失敗しました
amp_validation_error e9e8eb16d0b29ff8c18b17b472b7e774 のインポートに失敗しました
“https://mish.myds.me/wordpress/dev/2021/12/03/ws2022-iis-php/” をインポートできませんでした。投稿タイプ amp_validated_url が有効ではありません。
“https://mish.myds.me/wordpress/dev/about/” をインポートできませんでした。投稿タイプ amp_validated_url が有効ではありません。
“https://mish.myds.me/wordpress/dev/2021/12/03/ws2022-iis-php/ws2022_iis_add_php_8/” をインポートできませんでした。投稿タイプ amp_validated_url が有効ではありません。
“https://mish.myds.me/wordpress/dev/2021/12/22/asustor-nas-mail-server/” をインポートできませんでした。投稿タイプ amp_validated_url が有効ではありません。
“https://mish.myds.me/wordpress/dev/2021/12/22/asustor-nas-mail-server/as5202t_mail_server_receive/” をインポートできませんでした。投稿タイプ amp_validated_url が有効ではありません。
“https://mish.myds.me/wordpress/dev/2021/12/28/asustor-mail-server-fw/” をインポートできませんでした。投稿タイプ amp_validated_url が有効ではありません。
“https://mish.myds.me/wordpress/dev/2021/12/28/asustor-mail-server-fw/as5202t_mail_server_return/” をインポートできませんでした。投稿タイプ amp_validated_url が有効ではありません。
“https://mish.myds.me/wordpress/dev/2022/01/05/do-not-work-qnap-nas-page/” をインポートできませんでした。投稿タイプ amp_validated_url が有効ではありません。
“https://mish.myds.me/wordpress/dev/2022/01/05/do-not-work-qnap-nas-page/qnap_install_perl/” をインポートできませんでした。投稿タイプ amp_validated_url が有効ではありません。
すべて完了しました。 ではお楽しみください !
インポートしたユーザーのパスワードと権限を更新してください。
https://as.mish.work/wordpress/
試してはいませんが,WordPress でのサイズのみであれば .htaccess を直接編集した方が簡単です.
次の様な記述を最後に追加します.
php_value post_max_size 20M
php_value upload_max_filesize 20M
WS2022 IIS 環境に PHP インストール
先日作成した Windows Server 2022 の IIS 環境 に PHP をインストール.
先ず,CGI を追加.
Web PI のインストール.
Web Platform Installer で PHP 8 のインストール.
次の内容の php を開き,うまく動作していることを確認.
<?php phpinfo(); ?>
QR コード生成 – 3
今まで幾つかの所でサイトのアドレスの表示に使用してきた.
QRcode Perl CGI & PHP scripts ver. 0.50
これを他で使えないかと調べていると…
- 引数がうまく渡せない.2 つ目以降が無視されているような感じ.
- 100 文字位を超えると正しく表示できない.
どうも php の呼び出し方が悪かったみたいで,…/qr_img.php に与える引数を変更.
{
p_data = p_data.substr(0,106) ;
var last_p = p_data.lastIndexOf('&') ;
if (last_p > 0) {
p_data = p_data.substr(0,last_p) ;
}
s_data = p_data ;
p_data = escape (p_data) ;
p_data = "?d=" + p_data ;
// p_data = p_data + "&e=M" ;
}
使い方は以前と同様で .js のパスを変更.
<script src ="//itl.mydns.jp/_lib/js/i_lib/2022.01/c_qr_img.js"> </script>
<script> call_qr_img_href() ; </script>
日本語名ファイルのアップロード
次の所から日本語名のファイルをアップロードはできていたが,コードでの対応はうまくできていなかった.
https://itl.mish.work/…/upload.htm
そのため,アップロード時に 7 ビットのファイル名に変換することで対応していた.
これらのコードを書いたのは 3 年位前なので,その当時はまだよくわかっていなかった.
https://dev.mish.work/wordpress/2017/09/04/chttpfile-http-post/
またテクスチャファイル名などが日本語の場合はうまくいかないことも多かった.
最初,日本語名でそのままアップロードすると,いろいろ困った現象に…
PC から NAS 上のアップロード先のファイルが見えなくなってしまった.
一度スマートフォンの NAS 用のファイルマネージャから参照すると PC でも見えるようにはなった.
動作を見ると,サーバ側のコードは動作しているが,格納しているファイル名がうまく渡せていない.
ログなどを確認すると,デバッグ用 MBCS.exe でファイル名が「シフト JIS」のままになっていた.
送られるデータとしては次の所にあたる部分.
$_FILES[‘userfile’][‘name’]
これを UTF-8 にして渡す必要がある.
コードとしては次の所.
v_char Make_send_data (LPCTSTR upFile,LPCTSTR ___boundary) { v_char up_Data = v_c_Load(upFile) ; v_char sndData ; { tstring ct_boundary = ___boundary ; tstring file_img = ::QuotM_Add(_T("file_img")) ; tstring fileName = ::QuotM_Add(::Path_GetName(upFile)) ; tstring dataPre ; tstring dataPst ; dataPre+= CT_boundary__ + ct_boundary + C_CRLF ; dataPre+= CD_cd_f_d_n_ + file_img + CD_cd__fn_ ; dataPre+= fileName + C_CRLF ; dataPre+= CT_ct_a_o_s C_CRLF ; dataPre+= C_CRLF ; dataPst+= C_CRLF ; dataPst+= CT_boundary__ + ct_boundary + CT_boundary__ C_CRLF ; // v_char vc_pref = ::To_v_char(::To__string(dataPre.c_str())) ; v_char vc_pref = ::To_v_char(::To_UTF8 (dataPre.c_str())) ; v_char vc_post = ::To_v_char(::To__string(dataPst.c_str())) ; sndData.insert(sndData.end(),vc_pref.begin(),vc_pref.end()) ; sndData.insert(sndData.end(),up_Data.begin(),up_Data.end()) ; sndData.insert(sndData.end(),vc_post.begin(),vc_post.end()) ; } return sndData ; }
To__string でそのまま char の配列としていたものを UTF-8 にしてから char の配列に.
UpFile.hxx
quotm.hxx
2020/09/08
今度はサーバ側のコード.
本当はクライアントの CInternetSession のコンストラクタで与える User Agent .
UTF-8 でセットすれば良いのはわかるが,引数が LPCTSTR なのでどうすれば良いかわからず.
そのためサーバ側のログを出力する部分でうまく機能しないことがある.
Synology NAS では,一部文字化けするが特に問題なさそう.
ASUSTOR NAS や QNAP NAS では,20200908.txt の読み込み時に止まっている様子.
次の様に //IGNORE を付加して変換.
iconv API は iconv_open(_T("UTF-8//IGNORE")) iconv -f CP932 -t UTF-8//IGNORE 20200908.txt > 20200908.uf8 uconv -f CP932 -t UTF-8 -i 20200908.txt -o 20200908.uf8
アップロードがうまく機能しない?
個人的なメモです.
php と form でアップロードしていた所に,汎用のアップロードツール で行うとうまく機能しない.
http://ds116/Test/mics/mba_wgl/
原因は,php の post を受け取って $_FILES を処理している所.
$tempfile = $_FILES[‘fname’][‘tmp_name’] ;
<input type="file" name="fname" accept=".dat">
https://dev.mish.work/wordpress/2018/04/19/php-_files/
これとアップロードツールの C のコード ::Make_send_data で設定している名称が合っていない.
弦と矢と半径 – 8
Python を使用しないで PHP のみで.
<?php function r_cs ($c , $s) { return ( ( $c*$c ) / ( 8 *$s ) + $s/2 ) ; } function s_rc ($r , $c) { return ( $r-sqrt($r*$r - ($c/2)*($c/2) ) ) ; } function c_rs ($r , $s) { return ( sqrt($r*$r - ($r-$s)*($r-$s) )*2 ) ; } ?>
弦と矢と半径 – 7
input タグで number を使用している部分.
step=’0.001′ などとすれば小数値を入力できるが,欲しい動作ではない.
例えば 1.23456789 など任意の値を入力可能にしたかった.
step=’any’ と指定することで小数部を入力できるようになる.
<input type=’number’ name=’c’ value=’1.234567890′ size=’15’ step=’any’ />
https://mish.myds.me/…/r_cs/7/
PHP escapeshellarg
以前から気にはなっていた PHP の escapeshellarg を調べてみた.
次の様なコードがうまくない.
<?php $param = ($_REQUEST['input']) ; $cmd_to = "cal " . $param ; system ( $cmd_to ) ; ?>
次の様な入力を意図しているが,
…/cal/?input=2020
後ろに次のコマンドを付加されるとうまくない.
…/cal/?input=2020;ls -l
cal 2020 が表示された後 ls -l が動作している.
「コマンドインジェクション」と呼ぶらしく,検索するといろいろと出てくる.
コマンドの引数にあたる部分に escapeshellarg を使用するか,$param をチェックするする必要がある.
$cmd_to = "cal " . escapeshellarg ( $param ) ;
弦と矢と半径 – 6
Python のコードを修正して「結果のみ」を出力する様に変更.
import sys import math def r_cs (c , s) : return ( ( c*c ) / ( 8 *s ) + s/2 ) def s_rc (r , c) : return ( r-math.sqrt(r*r - (c/2)*(c/2) ) ) def c_rs (r , s) : return ( math.sqrt(r*r - (r-s)*(r-s) )*2 ) cmd = sys.argv[1] p1 = float(sys.argv[2]) p2 = float(sys.argv[3]) #print (cmd + " " + str(p1) + " " + str(p2)) if cmd == "r_cs" : print (r_cs(p1,p2)) elif cmd == "s_rc" : print (s_rc(p1,p2)) elif cmd == "c_rs" : print (c_rs(p1,p2)) #else : print ("error") #print ("")
PHP .
あまり綺麗なコードでないので,ここには張り付けていません.リンク先を見てください.
https://mish.myds.me/…/r_cs/6/
弦と矢と半径 – 5
PHP から Python の呼び出しで,Python のコマンドライン引数を使用する.
<?php echo ("call python\n") ; echo ("\n") ; system ("python r_cs.py r_cs 6 1") ; system ("python r_cs.py s_rc 5 6") ; system ("python r_cs.py c_rs 5 1") ; echo ("\n") ; system ("python r_cs.py r_cs 8 2") ; system ("python r_cs.py s_rc 5 8") ; system ("python r_cs.py c_rs 5 2") ; ?>
Python のコードは,
import sys import math def r_cs (c , s) : return ( ( c*c ) / ( 8 *s ) + s/2 ) def s_rc (r , c) : return ( r-math.sqrt(r*r - (c/2)*(c/2) ) ) def c_rs (r , s) : return ( math.sqrt(r*r - (r-s)*(r-s) )*2 ) cmd = sys.argv[1] p1 = float(sys.argv[2]) p2 = float(sys.argv[3]) print (cmd + " " + str(p1) + " " + str(p2)) if cmd == "r_cs" : print (r_cs(p1,p2)) elif cmd == "s_rc" : print (s_rc(p1,p2)) elif cmd == "c_rs" : print (c_rs(p1,p2)) else : print ("error") print ("")
Python がよくわかっていないので,いろいろなエラーが…
https://mish.myds.me/…/r_cs/5/
弦と矢と半径 – 2
今度は PHP からの呼び出し.
<?php echo ("call c++\n") ; system ("./a.out") ; echo ("call python\n") ; system ("python r_cs.py") ; ?>
実際の動作を試すには,gcc と python が必要です.
cpp のコンパイルは
g++ -Wall r_cs.cpp
これで ./a.out が作成されます.
python の呼び出しは
python r_cs.py
次の所で,同じ様な結果を表示します.
https://mish.myds.me/…/r_cs/2/
PHP から iconv コマンド呼び出し
シフトJIS のデータファイルをアップロードして WebGL で表示のテスト.
PHP から作成した .out を呼び出しているが,その中で文字コードの変換がうまく機能していない.
.out の中では iconv ライブラリを呼び出す.うまく機能しない時は iconv または uconv コマンド.
.out をコンソールから実行した時はうまく機能している.
いろいろと動作を調べていると,次の様なコマンドが PHP から呼出された時うまく機能していない様子.
iconv -f CP932 shiftjis.txt > out_file.txt
コンソールでは OK .
ここまで絞り込むのに 1 日かかった
今回の修正前 Synology NAS では次の様にしていた.
uconv -f sjis -t utf8 shiftjis.txt -o out_file.txt
先日テストしていた時 ASUSTOR NAS ではエラーになったので,単純に -t オプションを取ってしまった.
Iwao@AS5202T:/volume1/Web/Test/mics/tc_xconv $ iconv -f CP932 -t utf8 shiftjis.txt iconv: conversion to utf8 unsupported iconv: try 'iconv -l' to get the list of supported encodings Iwao@AS5202T:/volume1/Web/Test/mics/tc_xconv $
iconv -l を幾つかの環境で調べていると “utf8” の指定がうまくない.
いろいろな環境でうまく機能しそうなのは “UTF-8” .
-t オプションを指定しないとうまくないみたいで,次の様に変更.
iconv -f CP932 -t UTF-8 shiftjis.txt > out_file.txt
これで意図した動作になった.
2020/09/08 変換できない文字が存在した時に止まらない様な指定を追加.
https://mish.myds.me/wordpress/dev/2020/09/07/upload-mbcs-name/
exec_ic.hxx
text_gnc.hxx
Win10 に IIS と PHP – 3
どこかに設定があるのかもしれないが,
PHP でのエラーなどのログファイル.
場所は c:\Windows\Temp\ .
今回テストした PHP のコード
<?php $tempfile = $_FILES['fname']['tmp_name']; $filename = './data/' . $_FILES['fname']['name'] ; $up_status = false ; if (is_uploaded_file($tempfile)) { $up_status = move_uploaded_file($tempfile , $filename) ; } $link = "" ; if ($up_status) { $p_info = pathinfo($filename) ; $pi_ext = $p_info['extension'] ; $bmp_name = $filename . ".bmp" ; $to_bmp = FALSE ; if ($pi_ext == "png") { $img = imagecreatefrompng ($filename) ; $to_bmp = imagebmp($img,$bmp_name) ; } else if ($pi_ext == "jpg") { $img = imagecreatefromjpeg($filename) ; $to_bmp = imagebmp($img,$bmp_name) ; } else if ($pi_ext == "bmp") { $bmp_name = $filename ; $to_bmp = TRUE ; } if ($to_bmp) { $cmd_to = ("rsz_bmp.exe") . " " . $bmp_name ; exec ($cmd_to,$out,$ret) ; } if ($ret == 0) { $rsz_file = $out[count($out)-1] ; $bak_file = $filename . ".bak." . $pi_ext ; rename($filename,$bak_file) ; $rsz_name = pathinfo($rsz_file)['basename'] ; $file_rsz = $p_info['dirname'] . "/" . $rsz_name ; rename($rsz_file,$file_rsz) ; if ($pi_ext == "png") { $img_bmp = imagecreatefrombmp($file_rsz) ; imagepng ($img_bmp,$filename) ; } else if ($pi_ext == "jpg") { $img_bmp = imagecreatefrombmp($file_rsz) ; imagejpeg($img_bmp,$filename) ; } else if ($pi_ext == "bmp") { copy($file_rsz,$filename) ; } if (!file_exists($filename)) { $filename = $file_rsz ; } } if (file_exists($filename)) { $link .= "<hr/>" ; $link .= "<a href='" ; $link .= $filename ; $link .= "'>" ; $link .= $filename ; $link .= "</a>" ; $link .= "<br/>" ; $link .= "<img src='" ; $link .= $filename ; $link .= "'>" ; } } ?>
rsz_bmp.exe で画像ファイルを 2^n にリサイズし,その結果のファイル名を標準出力に出力する.
画像を出力する imagebmp などはあまり速くない.
同様の PHP を Synology NAS 上で.
https://itl.mydns.jp/…/tex_pow2.php
PHP のコードが悪いのか? Synology NAS では DIB から元の画像に戻すのがうまくいかない.
Win10 に IIS と PHP – 2
「IIS マネージャー」の「サイト」-「右クリック」で「Web サイトの追加…」.
手順は Win7 の時と同様.
「ディレクトリの参照」を「有効」に.
PHP で BMP を作成するコードを検索すると,imagebmp というのがあった.
ここにあったサンプルを /Test/php_gd/make_bmp.php として保存.
呼び出されると php.bmp が生成される.
以下の動作は Synology NAS を使用しています.
コードを一部修正して現在時刻の画像を作成しています.
上のブラウザの画像をクリックすると現在時刻の画像ファイルを更新します.
Win10 に IIS と PHP のインストール
Win10 環境で PHP を動作させるためのインストールなどの手順
今回使用したのは Win10 LTSC .
通常版に比べて不要なものが入らないのでこれを選択.
以前 Win7 環境に PHP を入れた時の手順
IIS での PHP Web サイトの構成
IIS の有効化.CGI が必要.
IIS の動作の確認.
Web PI のインストール.
Web PI を起動して PHP をインストール.
何故かエラー?
PHP Managet for IIS は複数バージョンの PHP を切替えるツールの様で今回は無くても良いか?
php -v や php -r “phpinfo();” で確認すると動作はしている.
次の内容を php として保存し,ブラウザで開く. <?php phpinfo(); ?>
PHP $_FILES
やってないとすぐ忘れてしまうのでメモ.
PHP マニュアル POST メソッドによるアップロード
php 側での次の様な取り出し.
$tempfile = $_FILES[‘fname‘][‘tmp_name’];
‘fname‘ にあたる部分は,input タグの name 属性.
<input type=”file” name =”fname” accept=”.jpg,.png”>
CHttpFile でのアップロード の場合は,汎用的になる様に処理している.
function uf_upload_files () { $d_dir = uf_get_upload_folder() ; // echo $d_dir . "<br/>\r\n" ; $up_status = false ; foreach ($_FILES as $keys => $values) { $file_e = $values ; $tempfile = $file_e['tmp_name'] ; $filename = $d_dir . $file_e['name'] ; $filename = uf_get_up_file_name($filename) ; if (is_uploaded_file($tempfile)) { $up_status = move_uploaded_file($tempfile,$filename) ; } } return $up_status ; }