20220109のPHPに関する記事は8件です。

laravelシンボリックリンクしても画像が表示されない

画像アップロードの仕方 laravelでは画像をアップロードして保存する際に public function store(Request $request) { $filename = $req->imgpath->getClientOriginalName(); $img = $req->imgpath->storeAs('', $filename); } のようにして保存できるのですが、その時のフォルダは storage/app になっているようです。僕が保存したときは上記のフォルダに保存されました。 アップロードした画像を表示 表示はとても簡単です。 <img src="{{ asset('storage/{ファイル名}') }}"/> これで普通なら表示できるのですが、何も表示されないと思います。 理由は簡単asset関数はpublicフォルダを参照するからそもそもフォルダ違うよねということです。 ではどうするのか。 シンボリックリンクをしてあげましょう。 シンボリックリンク シンボリックリンクとは特定のフォルダへのエイリアスとかポインタのようなものだと思っていただければと思います。 laravelではシンボリックリンクは超簡単にできます。 php artisan storage:link このコマンドを打つだけです。 $ls -la public なんやかんやの表示   storage -> /Users/ryotakarita/Desktop/sample-upload-pic/storage/app/public こんな感じでstorage->~~~の部分が表示されていたらOKです。 さあ、これで問題なく表示されるでしょう!といいうことでリロード! あれ、表示されない... 本題 なぜ表示されないのでしょうか? 冒頭を見返していただくとわかると思いますが、アップロードしたファイルの保存先は storage/app です。 シンボリックリンクされているパスと違いますよね。 解決策 保存する際のstoreAs関数の第一引数にpublicを指定してあげる。 以下のようにするということです。 public function store(Request $request) { $filename = $req->imgpath->getClientOriginalName(); $img = $req->imgpath->storeAs('public', $filename); } またはシンボリックリンクのリンク先を変更することでも解決できます。 変更の仕方はconfig/filesystems.php内の最後にある 'links' => [ public_path('storage') => storage_path('app'), ], のように修正してもできます。 一応これでもできるよという解決方法なのでいいやり方かどうかはわかりませんが。。。 また、リンク先を変更した際は php artisan storage:link を忘れないでください。 もしすでにリンクしている方は一度publicフォルダ内のstorage(リンクされているやつ)を削除するとエラーなくできると思います。 最後に なかなか解決に時間がかかりましたが少し理解が深まったのでよしとします。 間違い、ご指摘等ございましたらコメントにてご教授ください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP】htmlspecialchars()の使い方

背景 会員登録画面を作成中に出てきたので、備忘録かねて作成しました。 macOS : Monterey PHP : 8.1.1 エスケープ処理について htmlspecialchars()はエスケープ処理を行う関数であるが、まずエスケープ処理ってなんだってなったので調べてみた。 マークアップ言語のHTMLに限らず、プログラミング言語ではその言語にとって特別な意味を持つ記号があり、それをエスケープシーケンス(エスケープ文字、特殊文字)と言う。例えばHTMLでは < とか > とかが該当する。 記事に文章を入力するときなどに < や > を使おうとすると、通常これらの文字は、HTMLを動かす為に必要な記号だと判断され上手く表示されない。 そのため、入力フォームなどで < や > を文字として変換するための処理が用意されており、その処理のことをエスケープ処理という。 htmlspecialchars()の使い方 htmlspecialchars()の引数 htmlspecialchars(変換したい文字列, フラグ(変換するルールみたいなもの), エンコード, 既存のhtmlエンティティをエンコードするか否か(無くてもいい)) htmlspecialchars()使用例 htmlspecialchars($memo, ENT_QUOTES, "UTF-8") 第一引数 : エスケープ処理したい文字列 第二引数 : デフォルトでは、ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 詳しくは公式ドキュメント参照 第三引数 : UTF-8などのエンコードを指定 第四引数 : 一つのコード内で、htmlspecialchars()を二重にかける場合などに、変換した文字をさらに変換することを防止(勉強不足ですいませんが、使い方がよく分かってません) 戻り値は、変換後の文字列となる。 因みに、このメソッドはクロスサイト・スクリプティング脆弱性を防止するために重要なメソッドになる。 参照資料 1.PHP公式ドキュメント https://www.php.net/manual/ja/function.htmlspecialchars.php 2.エスケープ処理について https://www.f5.com/ja_jp/services/resources/glossary/escape-processing 3.第四引数について https://blog.dododori.com/create/program/htmlspecialchars/ 4.『体系的に学ぶ 安全なWebアプリケーションの作り方』 P120~137 https://wasbook.org/
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

mySqlではtimestampにNullを入れられない

初投稿になります。 Udemyのこちらの講座で一通り勉強したので、仕事であったら便利そうなWebアプリを作ってみようと思っています。 プログラミングの勉強を始めたきっかけはいつか別記事で書きたいと思っています。 つくろうとしている物 弊社には顧客管理や見積請求作成ソフトがありデータがリンクするようになっているのですが、リース器具管理だけ独立してexcelデータで、そこの管理を任されているので業務効率化とプログラミングの勉強を兼ねてリース管理アプリを作成しようと思いました。 躓いたところ リース商品は契約開始日や更新日、解約日など日付を入力する部分がたくさんあります。 講座を写径しながら、自分で作りたいものに作り替えいくとエラーにぶち当たりました。 エラーに慣れていなくてまったく読みもせずに、どこを写し間違えたかと見直し→書き直し→migrateをループしていました。ある程度したらエラーアレルギーも収まり、ちょっとずつ読めるようになりました。(これとっても不思議!)記事にするつもりはなかったのでエラー文は残してないのですが、テーブル名とデータの型名、NOT NULL ABLEが読み取れてTIMESTAMP型にNullは入れられないことに気づきました。 TIMESTAMPにNULLが入れられないということはMySqlでググれば解決策見つかりそうと判断。ついでにphpで書いていると思ったので(今現在も何の言語を書いているかよくわかっていない)「TIMESTAMP PHP NULL ABLE」で検索してもズバリな記事は見つからず途方に暮れてしまいました。 ->nullable()で解決 一人で気ままに学習するいいところとして、好きな時に切り上げられる点だと思います。 息抜きに散歩していると「laravelで検索したらわかるんじゃね?」と関係ある要素を考えれば至極当たり前なことに気づき、わくわくしながらググるとサクッと答えが出てきました!といっても日本語の情報ではなくEnglishだったので記事にさせていただきました。 $table->timestamp('カラム名')->nullable(); このように書くことによりNullを許可したTIMESTAMP型でカラムを作ることができます。 あとがき なぜ、TIMESTAMPにNullが許可されていないのか。 MySqlのTIMESTAMP型には2038年問題があるかららしいです。 Nullを許可する情報が少なかったのはこのせいなのかもしれません。 せっかく解決策が分かったけど、DATETIME型で作り直そうかなw プログラミングもマークダウンもブログを書くことも初心者なのでこうしたほうがいいとか、間違っている点などあればご指摘お願いします。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPファイルの読み込み方

ファイルの読み込み方の種類 PHPのファイルの読み込み方には1行ずつ読み込むか一気に読み込むかの2通りあります。 1.1行ずつ読み込む→fgets() 2.一気に読み込む→fread() 具体的に fgets() 流れ 1.第二引数にreadの頭文字を取った'r'を設定してファイルを読み込む。 2.fgets()は読み込む行が無くなった場合falseを返すのでfalseが返るまでwhileで1行ずつ取得し表示。 3.ファイルを閉じる。 $fp = fopen("ファイル名", "r"); while (($content = fgets($fp)) !== false){ echo $content; } fclose($fp); fread() 流れ 1.第二引数にreadの頭文字を取った'r'を設定してファイルを読み込む。 2.fread()で全ての値を変数に格納。 3.ファイルを閉じる。 4.格納されたものを表示。 $fp = fopen("ファイル名", "r"); $contents = fread($fp, filesize("ファイル名")); fclose($fp); echo $contents; fgets() VS fread() 結論から言うとfgets()を使うべきです。 メモリは有限なので限度を超えたファイルを一気に読み込むことができません。 なので大きなファイルを読み込む場合fgets()を使うべきでしょう。 またメモリに収まるサイズだったとしても一気読み込むのはPCの負担になるので動作が不安定になったり最悪の場合はシステムが停止する可能性もあるのでfgets()で慣れておきましょう。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【3秒で】phpでリダイレクト

<?php header('Location: https://www.google.com/'); exit(); ?>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Vulnhub]Quaoarの脆弱性診断

はじめに 免責事項 本記事で紹介する内容は、教育目的または脆弱性について仕組みを理解し周知、啓発を行うためだけに作成しております。 記載されているコードを実行した場合の損害は一切責任を負いません。 また、ハッキング行為をいかなる稼働環境・サービスに対しても行わないでください。成功しなくても試みること自体が違法行為にあたる場合があります。 上記の内容を十分理解された方のみ本記事をお読みください。 また、本記事の記載内容で、法的または倫理的に問題があると思われる箇所、その他お気づきの点などがございましたら、お手数ですがコメント欄までお知らせください。 Quaoarの概要 2017年6月にViper氏により制作されました。 ダウンロードは以下よりできます。 以下のコメントがありました。 クアオールへようこそ これは、Hackfest 2016 CTF http://hackfest.ca/ のために私が作成した脆弱なマシンです。 難易度 : 非常に簡単 ヒント 目指すもの このマシンは、コンピュータのセキュリティを学ぶことに興味がある人ができるように意図されています このマシンには3つのフラグがあります 1. シェルを取得する 2. ルートアクセスを取得する 3. ポストエクスプロイトフラグがあります。 脆弱性診断後の結論 想定しやすいパスワードはやめましょう。 脆弱性診断 事前調査 legionによるportscan sambaのヴァージョン特定 nmap -vvv -A -p 139,445 192.168.56.39 sambaにパスワードなしでログインできないか確認する sambaの線は保留します。 80番portの脆弱性診断を行う nikto -h 192.168.56.39 nmap --script vuln 192.168.56.39 wpscan --disable-tls-checks --url http://192.168.56.39/wordpress/ --enumerate ap --plugins-detection aggressive 以上診断より疎通可能なurlを導き出しました。 http://192.168.56.39/robots.txt http://192.168.56.39/upload/ http://192.168.56.39/upload/config http://192.168.56.39/upload/index.php http://192.168.56.39/wordpress/wp-config http://192.168.56.39/wordpress/wp-login http://192.168.56.39/upload/page/hello-world.php 画面で確認する robots.txtを見る。 大した情報はないです。 hydraでbrute force攻撃をしてみる hydra -L /usr/share/wordlists/10-million-password-list-top-1000000.txt -p test 192.168.56.39 http-post-form "/wordpress/wp-login:log=^USER^&pwd=^PASS^&wp-submit=Log+In&redirect_to=https%3A%2F%2F192.168.56.39%2Fwp-admin%2F&testcookie=1:F=Invalid username" login: admin password: test passwordを確定していきましょう。 hydra -l admin -P /usr/share/wordlists/10-million-password-list-top-1000000.txt 192.168.56.39 http-post-form "/wordpress/wp-login:log=^USER^&pwd=^PASS^&wp-submit=Log+In&redirect_to=https%3A%2F%2F192.168.56.39%2Fwp-admin%2F&testcookie=1:F=is incorrect" login: admin password: admin wordpressにログイン 無事 ログインできました。 reverse shellをやってみる 404ページにリバースシェルを入れる フロント画面 適当なページをリクエストしても、404にならない。 適当なページをページをクリックすると、 http://192.168.56.39/wordpress/?p=4 となっているので、ページを一から順に試してみる。 http://192.168.56.39/wordpress/?p=3 リバースシェルが取れました。 データベース情報を取得する /var/www/wordpress/wp-config.php を閲覧します。 一般userに昇格 worldpressのログインを考慮し、ユーザ名とパスワードを同一でログインしてみる。 1つ目のflagを取得しました。 root権限の昇格 ここで、考えられるパスワードは root toor データベースと同じ rootpassword! です。 2つ目のflagを取得しました。 そして、最後のflagです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

XAMPPでYahoo!メールからメールを送信する

XAMMPのローカル環境で、PHPを使って自分のYahoo!メールアカウントからメールを送信する方法を解説します。 環境 PC : Windows10 ローカル環境 : XAMPP version 3.3.0 メール : Yahoo!メール 尚、gmailでも基本的なやり方は同じですが、SMTPのポート番号や外部アプリケーションの受け入れ設定などが変わってきます。gmailの解説をした記事は既に多数ありますので、本稿では解説しません。 php.iniファイルの設定 まずは、いくつかのXAMPP設定ファイルの内容を変更する必要があります。   ひとつめはphp.iniファイルです。ファイルの場所はデフォルトではC:\xampp\php\php.iniになります。   作業前には必ずバックアップを取るようにしましょう ファイルを見つけたら、テキストエディタで次のように修正します。該当箇所はmail functionで検索すると出てきます。 php.ini [mail function] SMTP=localhost smtp_port=25 sendmail_path="\"C:\xampp\sendmail\sendmail.exe\" -t" mail.add_x_header=Off sendmail_pathではPHPからXAMPPのsendmailという機能が使えるように設定しています。上記のパスはデフォルトの値でですので、違う場所に保存している場合は該当のファイルパスを貼り付けてください。 sendmail.iniファイルの設定 ふたつめはsendmail.iniファイルです。ファイルの場所はデフォルトではC:\xampp\sendmail\sendmail.iniになります。  作業前には必ずバックアップを取るようにしましょう 同じようにファイルを開いて次のように修正します。 sendmail.ini [sendmail] smtp_server=smtp.mail.yahoo.co.jp smtp_port=465 smtp_ssl=auto auth_username=example(自分のYahoo!アカウント名) auth_password=hogehoge(Yahoo!アカウントのパスワード) force_sender=exapmle@yahoo.co.jp(Yahoo!メールアドレス) smtp_serverやsmtp_portの設定は、下記のYahoo!メールヘルプページからも確認できます。 https://support.yahoo-net.jp/PccMail/s/article/H000011473 Yahoo!メール側の設定 次にYahoo!メール側の設定を変更します。 Yahoo!メールを開いて、「設定」>「便利機能」>「IMAP/POP/SMTPアクセス」 の順にクリックし、下記の画面でYahoo! JAPAN公式サービス以外からのアクセスも有効にするに設定を変更します。 終わったら右下の「保存」ボタンを忘れずにクリックしましょう。 これでローカル環境上からYahoo!メールのSMTPサーバーが使えるようになりました。 ※余談 筆者はここの設定を知らずに、丸3日間悩みつつづけました(笑) PHPでメールを送信するコードを書く 設定が一通り終わったので、コードを書いていきましょう。今回は下記のメール送信用サンプルコードを用意しました。 mb_send_mail関数の第4引数であるヘッダ情報('From: ' . $fromにあたる部分)を記載していないサイトをたまに見かけますが、この引数がないとメールを送信できないので注意してください。 mailtest.php <?php //送信元のメールアドレス $from = 'exapmle@yahoo.co.jp'; //送信先のメールアドレス $to = 'example1090@gmail.com'; //件名 $subject = 'テスト送信'; //本文 $message = 'こんにちは。これはテスト送信です。'; if (mb_send_mail($to, $subject, $message, 'From: ' . $from)) { echo '送信成功!'; } else { echo '送信失敗。<br>エラーログを確認してください。 (xampp\sendmail\error.log)'; } 完成したら、C:\xampp\htdocs内にファイルを保存しましょう。 プログラムを実行する いよいよプログラムを実行します。 まずはAppacheを起動します。すでに起動している場合は、一度停止させてから再起動してください。 次に自分のブラウザでhttp://localhost/mailtest.phpを開いてください。下記のように「送信成功!」の文字が表示されれば成功です。送信先に設定したメールボックスを確認して、メールが届いていることを確認してください。 送信に失敗した場合は、下記のようメッセージが表示されます。xampp\sendmail\error.logからエラーログを確認し、原因を探ってみてください。 まとめ ここまでの作業、お疲れさまでした。メールは初心者がチャレンジしがちなプログラムであるにもかかわらず、SMTPなどの知識が必要になるため意外と難しいです。 私自身にとってこれがQiita初投稿となりますが、誰かのお役に立てれば幸いです。 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel,MySQL】設定ファイル.env、.env.example、database.phpの違いとは?

概要 本記事は、PHPフレームワークLaravel入門 第2版で学習している中の疑問・つまづきの備忘録です。 今回はLaravelでDBを利用する際の設定ファイルについてまとめます。 なお、PHPフレームワークLaravel入門 第2版ではSQLiteを利用していますが、MySQLに読み替えて同じことを行なっています。 設定ファイルはどれを使えばいいのか? LaravelにはDBを利用する際に使用する、設定に関するファイルが複数あります。 しかし、結局どれを使えばいいのか迷ったので調べてみました。 .envファイル このファイルには環境変数が定義されています。 DBに関する設定はデフォルトで以下の通りです。 DB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3306 DB_DATABASE=[プロジェクト名] DB_USERNAME=sail DB_PASSWORD=password 基本的に設定を変更するにはここを書き換えるといいようです。 後述のdatabase.phpでは、env()関数を使用して.envファイルで設定された環境変数を取得しています。 また、以下の通り.envファイルをGitHub等で管理してはいけません。 アプリケーションを使用する開発者/サーバごとに異なる環境設定が必要になる可能性があるため、.envファイルをアプリケーションのソース管理にコミットしないでください。さらに、機密性の高い資格情報が公開されるため、侵入者がソース管理リポジトリにアクセスした場合のセキュリティリスクになります。 Laravel 8.x 設定 ちなみに、デフォルトで.gitignoreファイル内でGitのソース管理対象から外すよう設定されています。 #.gitignoreファイル /node_modules /public/hot /public/storage /storage/*.key /vendor .env ##########ここに設定されている .env.backup .phpunit.result.cache docker-compose.override.yml Homestead.json Homestead.yaml npm-debug.log yarn-error.log /.idea /.vscode では、.envの設定項目や設定値をチーム内で共有したい場合はどうすれば良いのか? .env.exampleファイルを利用しましょう。 .env.exampleファイル このファイルに、共有したい設定を記載します。 ただし、本番環境で使用するような設定は記載すべきではないでしょう。 デフォルトでは以下のような設定値になっています。 DB_HOSTやDB_DATABASEの設定項目が.envと異なります。 自分自身を指すIPアドレスである、127.0.0.1が設定されるなど仮に外部に漏れても危険ではない値が設定されているようです。 DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD= チームで開発している場合は、アプリケーションに.env.exampleファイルを含め続けることをお勧めします。サンプル設定ファイルにプレースホルダー値を配置することにより、チームの他の開発者は、アプリケーションを実行するために必要な環境変数を明確に確認できます。 Laravel 8.x 設定 database.phpファイル こちらがDBの設定ファイルです。 デフォルトでは、ほとんどの項目でenv('.envの設定項目名', 'デフォルト値')関数を用いて環境変数を取得しています。 したがって、.envの内容を書き換えるとenv()関数で取得される値も変わります。 database.php //MySQLの設定のみ抜粋 'mysql' => [ 'driver' => 'mysql', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], Laravelのデータベースサービスの設定は、アプリケーションのconfig/database.php設定ファイルにあります。このファイルは、全データベース接続を定義し、デフォルトで使用する接続を指定できます。このファイル内のほとんどの設定オプションは、アプリケーションの環境変数の値によって決まります。Laravelがサポートしているデータベースシステムのほとんどの設定例をこのファイルに用意しています。 Laravel 8.x データベース:準備 まとめ .env 環境変数を定義する。env()関数を使用するとこのファイルの設定値を取得できる。 また、セキュリティリスクとなるため.envファイルをGitHub等で管理してはいけない。 .env.example チーム開発時に、アプリケーションを実行するために必要な環境変数を共有するために使用。 database.php DBの設定ファイル。 デフォルトでは多くの項目で、env()関数を使用して.envファイルから環境変数を取得している。 参考文献 PHPフレームワークLaravel入門 第2版 Laravel 8.x 設定 Laravel 8.x データベース:準備
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む