technicalsuwako.moe/gemini/blog.atom

465 行
33 KiB
XML
Raw Blame 履歴

このファイルには曖昧(ambiguous)なUnicode文字が含まれています

このファイルには、他の文字と見間違える可能性があるUnicode文字が含まれています。 それが意図的なものと考えられる場合は、この警告を無視して構いません。 それらの文字を表示するにはエスケープボタンを使用します。

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0">
<id>gemini://technicalsuwako.moe</id>
<title>テクニカル諏訪子</title>
<updated>2023-10-23T16:00:00Z</updated>
<author><name>テクニカル諏訪子</name></author>
<link href="gemini://technicalsuwako.moe" rel="alternate"></link>
<entry>
<id>blog/norikae-102.gmi</id>
<author><name></name></author>
<title type="html">【076】乗換 1.0.2登場</title>
<published>2023-10-23T16:00:00Z</published>
<category term="jp"></category>
<category term="blog"></category>
<category term="ソフト開発"></category>
<category term=""></category>
<category term="乗換"></category>
<link href="gemini://technicalsuwako.moe/blog/norikae-102.gmi" rel="alternate"></link>
<content type="html">
&lt;h2 id=&#34;heading&#34;&gt;乗換って何?&lt;/h2&gt;
&lt;p&gt;乗換はCLIでの路線情報を確認ツールです。&lt;br /&gt;
Yahooでスパイウェアが多すぎるため、CLI用のフロントエンドを作りました。&lt;/p&gt;
&lt;h2 id=&#34;heading-1&#34;&gt;変更&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ヤフー社はHTMLをちょっと更新されたから、乗換を修正する事が必要となった&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;heading-2&#34;&gt;ソースコード&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://gitler.moe/suwako/norikae&#34;&gt;Gitler&lt;/a&gt;&lt;br /&gt;
&lt;a href=&#34;https://codeberg.org/TechnicalSuwako/norikae&#34;&gt;Codeberg&lt;/a&gt;&lt;br /&gt;
&lt;a href=&#34;https://notabug.org/TechnicalSuwako/norikae&#34;&gt;Notabug&lt;/a&gt;&lt;br /&gt;
&lt;a href=&#34;https://git.disroot.org/TechnicalSuwako/norikae&#34;&gt;Disroot&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;heading-3&#34;&gt;ダウンロード&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://gitler.moe/suwako/norikae/releases&#34;&gt;リリースページ&lt;/a&gt;&lt;br /&gt;
&lt;a href=&#34;https://076.moe/repo/src/norikae&#34;&gt;ソースコード&lt;/a&gt;&lt;br /&gt;
&lt;a href=&#34;https://076.moe/repo/bin/norikae&#34;&gt;バイナリー&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以上&lt;/p&gt;
</content>
</entry>
<entry>
<id>blog/spliti-112.gmi</id>
<author><name></name></author>
<title type="html">【オワコンテック】spliti 1.1.2登場</title>
<published>2023-10-23T00:00:00Z</published>
<category term="jp"></category>
<category term="blog"></category>
<category term="ウエブ開発"></category>
<category term="オワコンテック"></category>
<category term="spliti"></category>
<link href="gemini://technicalsuwako.moe/blog/spliti-112.gmi" rel="alternate"></link>
<content type="html">
&lt;h2 id=&#34;spliti&#34;&gt;splitiって何?&lt;/h2&gt;
&lt;p&gt;splitiはMixiのフェイクニュース部分向けプライバシーUIです。&lt;/p&gt;
&lt;h2 id=&#34;heading&#34;&gt;変更&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;投稿内の画像もプロクシー化&lt;/li&gt;
&lt;li&gt;投稿内の画像はレスポンシブに&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;heading-1&#34;&gt;ソースコード&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://gitler.moe/suwako/spliti&#34;&gt;Gitler&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;heading-2&#34;&gt;公式インスタンス&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;&#34;&gt;https://mixi.owacon.moe/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以上&lt;/p&gt;
</content>
</entry>
<entry>
<id>blog/postmarketos-make-repository.gmi</id>
<author><name></name></author>
<title type="html">【PostmarketOS】自分のレポジトリを作り方</title>
<published>2023-10-15T00:00:00Z</published>
<category term="jp"></category>
<category term="blog"></category>
<category term="linux"></category>
<category term="デジタル自主"></category>
<category term="スマホ"></category>
<category term="postmarketos"></category>
<category term="pinephone"></category>
<category term="alpine"></category>
<link href="gemini://technicalsuwako.moe/blog/postmarketos-make-repository.gmi" rel="alternate"></link>
<content type="html">
&lt;p&gt;&lt;a href=&#34;/blog/crux-make-port-repository/&#34;&gt;半年前に言った通り、あたしのパソコンでのLinuxを使用歴が非常に長いですが、スマホでの使用歴はそれ程長くないのです。&lt;/a&gt;&lt;br /&gt;
2020年にはMan(ko)jaroを使用していましたが、毎回パッケージの更新後に度々問題が生じた為、Mobian(PinePhone用Debian)に切り替えました。&lt;br /&gt;
Mobianは2022年まで使用していましたが、年経ってもLinuxスマホの進歩があんまなかった為、再びPixel 3でGrapheneOS(Google非依存のAndroid)に戻りました。&lt;br /&gt;
しかし、2023年10月現在、ついに大きな進展が見られる様になった為、PinePhoneを処理して、PostmarketOSを試してみたところ、Androidを使用する意欲がなくなりました。&lt;/p&gt;
&lt;p&gt;ちなみに、PostmarketOSはスマホ専用Alpine Linuxベースのディストリビューションです。&lt;/p&gt;
&lt;h2 id=&#34;heading&#34;&gt;レポジトリの作り方&lt;/h2&gt;
&lt;h3 id=&#34;heading-1&#34;&gt;初回のみ&lt;/h3&gt;
&lt;p&gt;以下のステップは初回だけ実行して下さい。&lt;br /&gt;
まず、必要なツールをインストールします。&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;doas apk update
doas apk add alpine-sdk
doas addgroup &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;$(&lt;/span&gt;whoami&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;)&lt;/span&gt; abuild
doas reboot
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;再起動後、新しいディレクトリと鍵ペアを生成して下さい。&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;mkdir -p ~/.local/src/repo
abuild-keygen -a -i
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;heading-2&#34;&gt;新しいパッケージを作成する&lt;/h3&gt;
&lt;p&gt;次のステップは、APKBUILDファイルを作成する事です。&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;&lt;span style=&#34;color:#a2f&#34;&gt;cd&lt;/span&gt; ~/.local/src/repo
mkdir urloli
&lt;span style=&#34;color:#a2f&#34;&gt;cd&lt;/span&gt; urloli
nvim APKBUILD
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;例:&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;# Maintainer: Suwako Moriya &amp;lt;suwako at 076 dot moe&amp;gt;
pkgname=urloli
pkgver=2.2.0
pkgrel=1
pkgdesc=&amp;#34;$pkgname&amp;#34;
url=&amp;#34;https://076.moe&amp;#34;
arch=&amp;#34;all&amp;#34;
license=&amp;#34;GPL&amp;#34;
source=&amp;#34;https://076.moe/repo/src/$pkgname/$pkgname-$pkgver.tar.gz&amp;#34;
makedepends=&amp;#34;go&amp;#34;
options=&amp;#34;!check !strip&amp;#34;
package() {
mkdir -p $pkgdir/etc/urloli $pkgdir/usr/bin $pkgdir/etc/init.d $pkgdir/www/active/urlo.li
mv -i config.json $pkgdir/etc/urloli/config.json
make
mv urloli $pkgdir/usr/bin/urloli
curl https://076.moe/repo/init/openrc/init.d/urloli &amp;gt; $pkgdir/etc/init.d/urloli
mv view $pkgdir/www/active/urlo.li
mv static $pkgdir/www/active/urlo.li
chmod +x $pkgdir/etc/init.d/urloli
chmod +x $pkgdir/usr/bin/urloli
echo &amp;#34;Change the domain name in \&amp;#34;/etc/$pkgname/config.json\&amp;#34;.&amp;#34;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;URLロリはGo以外従属ソフトがありませんが、Goはコンパイル時だけで必要ですので、「makedepends」に追加しました。&lt;br /&gt;
実行するには必要であれば、「depends」に追加して下さい。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意PostmarketOSやAlpineで、「ninja」をインストールする場合、&lt;code lang=&#34;&#34;&gt;apk add ninja&lt;/code&gt;ではなく&lt;code lang=&#34;&#34;&gt;apk add samurai&lt;/code&gt;を使用して下さい。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;次は「sha512sum」を生成し、ビルドを行って下さい。&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;abuild checksum
abuild
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Alpineではパッケージの署名が必要ですが、PostmarketOSでは自動で署名される為、これは不要です。&lt;/p&gt;
&lt;h2 id=&#34;heading-3&#34;&gt;レポジトリサーバーの準備&lt;/h2&gt;
&lt;p&gt;次のステップは、サーバーを準備です。&lt;br /&gt;
サーバーはOpenBSDの場合&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;doas nvim /etc/httpd.conf
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;...
server &amp;#34;076.moe&amp;#34; {
listen on * port 443 tls
tls certificate &amp;#34;/etc/ssl/076.moe.crt&amp;#34;
tls key &amp;#34;/etc/ssl/private/076.moe.key&amp;#34;
root &amp;#34;/htdocs/076.moe/www&amp;#34;
directory index &amp;#34;index.html&amp;#34;
location &amp;#34;/repo/*&amp;#34; {
directory auto index
}
location &amp;#34;/.well-known/acme-challenge/*&amp;#34; {
root &amp;#34;/acme&amp;#34;
request strip 2
}
}
server &amp;#34;www.076.moe&amp;#34; {
listen on * port 443 tls
tls certificate &amp;#34;/etc/ssl/076.moe.crt&amp;#34;
tls key &amp;#34;/etc/ssl/private/076.moe.key&amp;#34;
block return 301 &amp;#34;https://076.moe$REQUEST_URI&amp;#34;
}
server &amp;#34;www.076.moe&amp;#34; {
alternative { 076.moe }
listen on * port 80
block return 301 &amp;#34;https://076.moe$REQUEST_URI&amp;#34;
}
server &amp;#34;l3nbzyxgrkmd46nacmzf2sy6tpjrwh4iv3pgacbrbk72wcgxq5a.b32.i2p&amp;#34; {
listen on * port 8450
root &amp;#34;/htdocs/076.moe/www&amp;#34;
directory index &amp;#34;index.html&amp;#34;
location &amp;#34;/repo/*&amp;#34; {
directory auto index
}
}
server &amp;#34;7dt6irsmfvbrtgn4nuah56kky6mvr472fbwwaltuxpf26qdqkdhfvnqd.onion&amp;#34; {
listen on * port 8500
root &amp;#34;/htdocs/076.moe/www&amp;#34;
directory index &amp;#34;index.html&amp;#34;
location &amp;#34;/repo/*&amp;#34; {
directory auto index
}
}
...
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;doas mkdir -p /var/www/htdocs/076.moe/www/repo/alpine
doas chown -R &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;$(&lt;/span&gt;whoami&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;)&lt;/span&gt;:&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;$(&lt;/span&gt;whoami&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;)&lt;/span&gt; /var/www/htdocs/076.moe
doas rcctl restart httpd
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;heading-4&#34;&gt;パッケージを公開&lt;/h3&gt;
&lt;p&gt;公開鍵をアップロードした後、パッケージを公開して下さい。&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;rsync -rtvzP ~/.abuild/*.rsa.pub &lt;span style=&#34;color:#666&#34;&gt;(&lt;/span&gt;君のIPアドレス&lt;span style=&#34;color:#666&#34;&gt;)&lt;/span&gt;:/var/www/htdocs/076.moe/www/repo/alpine
&lt;span style=&#34;color:#a2f&#34;&gt;cd&lt;/span&gt; ~/packages
rsync -rtvzP repo &lt;span style=&#34;color:#666&#34;&gt;(&lt;/span&gt;君のIPアドレス&lt;span style=&#34;color:#666&#34;&gt;)&lt;/span&gt;:/var/www/htdocs/076.moe/www/repo/alpine
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;heading-5&#34;&gt;レポジトリの確認&lt;/h2&gt;
&lt;p&gt;最後のステップは、自分のパッケージをインストールする事です。&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;&lt;span style=&#34;color:#a2f&#34;&gt;cd&lt;/span&gt; /etc/apk/keys
doas wget https://&lt;span style=&#34;color:#666&#34;&gt;(&lt;/span&gt;ドメイン名&lt;span style=&#34;color:#666&#34;&gt;)&lt;/span&gt;/repo/alpine/&lt;span style=&#34;color:#666&#34;&gt;(&lt;/span&gt;.rsa.pubのファイル名&lt;span style=&#34;color:#666&#34;&gt;)&lt;/span&gt;
&lt;span style=&#34;color:#a2f&#34;&gt;cd&lt;/span&gt; ..
doas nvim repositories
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;http://mirror.postmarketos.org/postmarketos/v23.06
http://dl-cdn.alpinelinux.org/alpine/v3.18/main
http://dl-cdn.alpinelinux.org/alpine/v3.18/community
http://(ドメイン名)/repo/alpine/repo # これを追加して下さい
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;doas apk update
doas apk add urloli
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;以上&lt;/p&gt;
</content>
</entry>
<entry>
<id>blog/spliti-111.gmi</id>
<author><name></name></author>
<title type="html">【オワコンテック】spliti 1.1.1登場</title>
<published>2023-09-09T00:00:00Z</published>
<category term="jp"></category>
<category term="blog"></category>
<category term="ウエブ開発"></category>
<category term="オワコンテック"></category>
<category term="spliti"></category>
<link href="gemini://technicalsuwako.moe/blog/spliti-111.gmi" rel="alternate"></link>
<content type="html">
&lt;h2 id=&#34;spliti&#34;&gt;splitiって何?&lt;/h2&gt;
&lt;p&gt;splitiはMixiのフェイクニュース部分向けプライバシーUIです。&lt;/p&gt;
&lt;h2 id=&#34;heading&#34;&gt;変更&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;YouTube動画があれば、オワコンYouTubeに変更させる様に&lt;/li&gt;
&lt;li&gt;サムネイルがなければ、getimg()関数をす部に終了する様に&lt;/li&gt;
&lt;li&gt;もっと小さいバグを修正&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;heading-1&#34;&gt;ソースコード&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://gitler.moe/suwako/spliti&#34;&gt;Gitler&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;heading-2&#34;&gt;公式インスタンス&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;&#34;&gt;https://mixi.owacon.moe/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以上&lt;/p&gt;
</content>
</entry>
<entry>
<id>blog/fix-broken-contact-form.gmi</id>
<author><name></name></author>
<title type="html">【PHP】正しい連絡フォームの作り方(クライアント側をぜったいに信用するな</title>
<published>2023-08-04T00:00:00Z</published>
<category term="blog"></category>
<category term="jp"></category>
<category term="プログラミング"></category>
<category term="php"></category>
<category term="ウエブ開発"></category>
<category term="html"></category>
<category term="javascript"></category>
<link href="gemini://technicalsuwako.moe/blog/fix-broken-contact-form.gmi" rel="alternate"></link>
<content type="html">
&lt;h2 id=&#34;heading&#34;&gt;問題&lt;/h2&gt;
&lt;p&gt;現在の「モダン」ウェブ開発で、連絡フォームはJavascriptで制御されていますが、これは大きなリスクがあります。&lt;br /&gt;
その理由について、直ぐに説明します。&lt;/p&gt;
&lt;p&gt;以下のスクショをご覧いただいたら、何が問題は何だと思いますか?&lt;br /&gt;
&lt;a href=&#34;https://ass.technicalsuwako.moe/fuanform1.png&#34;&gt;&lt;img src=&#34;https://ass.technicalsuwako.moe/fuanform1.png&#34; alt=&#34;&#34; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;正解は:送信ボタンは&lt;code lang=&#34;&#34;&gt;&amp;lt;form&amp;gt;&lt;/code&gt;タグの外にある事です。&lt;br /&gt;
これでは、Javascriptを無効にした場合、送信ボタンをクリックする事が出来ません。&lt;/p&gt;
&lt;p&gt;このフォームを送信する為には、この送信ボタンをフォーム内に移動し、&lt;code lang=&#34;&#34;&gt;type=&amp;quot;button&amp;quot;&lt;/code&gt;&lt;code lang=&#34;&#34;&gt;type=&amp;quot;submit&amp;quot;&lt;/code&gt;に変更する事で、Javascriptなしでもフォームを送信する事が可能になります。&lt;br /&gt;
そんな感じ:&lt;br /&gt;
&lt;a href=&#34;https://ass.technicalsuwako.moe/fuanform2.png&#34;&gt;&lt;img src=&#34;https://ass.technicalsuwako.moe/fuanform2.png&#34; alt=&#34;&#34; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;そうして、入力画面で「required=&amp;quot;&amp;quot;」というパラメータがあり、これによりJavascriptが無効であってもフィールドが入力されているかどうかを確認できます。&lt;br /&gt;
例:&lt;br /&gt;
&lt;a href=&#34;https://ass.technicalsuwako.moe/fuanform3.png&#34;&gt;&lt;img src=&#34;https://ass.technicalsuwako.moe/fuanform3.png&#34; alt=&#34;&#34; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;しかし、このパラメータを削除すると、どのような事態が起こると思いますか?&lt;br /&gt;
正解はこちら:&lt;br /&gt;
&lt;a href=&#34;https://ass.technicalsuwako.moe/fuanform4.png&#34;&gt;&lt;img src=&#34;https://ass.technicalsuwako.moe/fuanform4.png&#34; alt=&#34;&#34; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;また、確認画面ではフォームが&lt;code lang=&#34;&#34;&gt;&amp;lt;input type=&amp;quot;hidden&amp;quot; /&amp;gt;&lt;/code&gt;タグを沢山含んでいます。&lt;br /&gt;
その中の「value=&amp;quot;&amp;quot;」部分を変更する事が可能です。&lt;br /&gt;
これにより、MySQLインジェクションも可能となります。&lt;/p&gt;
&lt;h2 id=&#34;heading-1&#34;&gt;解決策&lt;/h2&gt;
&lt;p&gt;上述の問題を解決する為には、サーバー側でのチェックが必要です。&lt;br /&gt;
勿論、クライアント側とサーバー側の両方でチェックを行う事も可能です。&lt;/p&gt;
&lt;p&gt;例として、PHPの場合を紹介します(PHPを使用するフォームが多い為)&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;&lt;span style=&#34;color:#666&#34;&gt;&amp;lt;?&lt;/span&gt;php
session_name(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;formvals&amp;#34;&lt;/span&gt;);
session_start([
&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;cookie_httponly&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;true&lt;/span&gt;,
]);
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;empty&lt;/span&gt;(&lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;csrf_token&amp;#34;&lt;/span&gt;])) &lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;csrf_token&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; bin2hex(random_bytes(&lt;span style=&#34;color:#666&#34;&gt;32&lt;/span&gt;));
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#666&#34;&gt;!&lt;/span&gt;isset(&lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;step&amp;#34;&lt;/span&gt;])) &lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;step&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;;
&lt;span style=&#34;color:#b8860b&#34;&gt;$errmes&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; [];
&lt;span style=&#34;color:#b8860b&#34;&gt;$reqvals&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; [
&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;??&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;,
&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;kana&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;kana&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;??&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;,
];
&lt;span style=&#34;color:#b8860b&#34;&gt;$optvals&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; [
&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;??&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;,
];
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;$_SERVER&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;REQUEST_METHOD&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;) {
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#666&#34;&gt;!&lt;/span&gt;hash_equals(&lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;csrf_token&amp;#34;&lt;/span&gt;], &lt;span style=&#34;color:#b8860b&#34;&gt;$_POST&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;csrf_token&amp;#34;&lt;/span&gt;])) {
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;die&lt;/span&gt;(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;不正なCSRFトークン&amp;#34;&lt;/span&gt;);
}
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;step&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;) {
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;foreach&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;$reqvals&lt;/span&gt; &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$k&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$v&lt;/span&gt;) {
&lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b8860b&#34;&gt;$k&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; filter_input(INPUT_POST, &lt;span style=&#34;color:#b8860b&#34;&gt;$k&lt;/span&gt;, FILTER_SANITIZE_STRING);
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b8860b&#34;&gt;$k&lt;/span&gt;]) &lt;span style=&#34;color:#b8860b&#34;&gt;$reqvals&lt;/span&gt;[&lt;span style=&#34;color:#b8860b&#34;&gt;$k&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b8860b&#34;&gt;$k&lt;/span&gt;];
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$errmes&lt;/span&gt;[] &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$k&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;をご入力下さい。&amp;#34;&lt;/span&gt;;
}
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;foreach&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;$optvals&lt;/span&gt; &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$k&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$v&lt;/span&gt;) {
&lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b8860b&#34;&gt;$k&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; filter_input(INPUT_POST, &lt;span style=&#34;color:#b8860b&#34;&gt;$k&lt;/span&gt;, FILTER_SANITIZE_STRING);
&lt;span style=&#34;color:#b8860b&#34;&gt;$optvals&lt;/span&gt;[&lt;span style=&#34;color:#b8860b&#34;&gt;$k&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b8860b&#34;&gt;$k&lt;/span&gt;];
}
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;empty&lt;/span&gt;(&lt;span style=&#34;color:#b8860b&#34;&gt;$errmes&lt;/span&gt;)) &lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;step&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;2&lt;/span&gt;;
}
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;step&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;2&lt;/span&gt;) {
&lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;step&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;;
session_destroy();
header(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Location: /success.html&amp;#34;&lt;/span&gt;);
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;die&lt;/span&gt;();
}
}
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;else&lt;/span&gt; {
&lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;csrf_token&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; bin2hex(random_bytes(&lt;span style=&#34;color:#666&#34;&gt;32&lt;/span&gt;));
&lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;step&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;;
}
&lt;span style=&#34;color:#080&#34;&gt;?&amp;gt;&lt;/span&gt;&lt;span style=&#34;&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;&amp;lt;html&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;head&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;meta charset=&amp;#34;utf-8&amp;#34; /&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;title&amp;gt;連絡フォーム&amp;lt;/title&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;/head&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;body&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;&amp;lt;?php
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; if ($_SESSION[&amp;#34;step&amp;#34;] == 1) {
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; if (count($errmes) != 0) {
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;?&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;ul style=&amp;#34;font-width: bolder; color: #f00; list-style: none;&amp;#34;&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;&amp;lt;?php
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; foreach ($errmes as $e) {
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; echo &amp;#34;&amp;lt;li&amp;gt;&amp;#34;.$e.&amp;#34;&amp;lt;/li&amp;gt;&amp;#34;;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; }
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;?&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;/ul&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;&amp;lt;?php
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; }
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;?&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;form method=&amp;#34;POST&amp;#34; action=&amp;#34;/contact.php&amp;#34;&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;input type=&amp;#34;hidden&amp;#34; name=&amp;#34;csrf_token&amp;#34; value=&amp;#34;&amp;lt;?= $_SESSION[&amp;#39;csrf_token&amp;#39;] ?&amp;gt;&amp;#34;&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;table&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;tbody&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;tr&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;td&amp;gt;お名前 (必須):&amp;lt;/td&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;td&amp;gt;&amp;lt;input placeholder=&amp;#34;山田 太郎&amp;#34; required=&amp;#34;&amp;#34; name=&amp;#34;name&amp;#34; type=&amp;#34;text&amp;#34; value=&amp;#34;&amp;lt;?= $reqvals[&amp;#34;name&amp;#34;] ?&amp;gt;&amp;#34; /&amp;gt;&amp;lt;/td&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;/tr&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;tr&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;td&amp;gt;お名前 (かな) (必須):&amp;lt;/td&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;td&amp;gt;&amp;lt;input placeholder=&amp;#34;やまだ たろう&amp;#34; required=&amp;#34;&amp;#34; name=&amp;#34;kana&amp;#34; type=&amp;#34;text&amp;#34; value=&amp;#34;&amp;lt;?= $reqvals[&amp;#34;kana&amp;#34;] ?&amp;gt;&amp;#34; /&amp;gt;&amp;lt;/td&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;/tr&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;tr&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;td&amp;gt;御社又は関連サイトのURL:&amp;lt;/td&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;td&amp;gt;&amp;lt;input placeholder=&amp;#34;https://076.moe/&amp;#34; name=&amp;#34;url&amp;#34; type=&amp;#34;text&amp;#34; value=&amp;#34;&amp;lt;?= $optvals[&amp;#34;url&amp;#34;] ?&amp;gt;&amp;#34; /&amp;gt;&amp;lt;/td&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;/tr&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;/tbody&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;/table&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;button&amp;gt;確認画面へ&amp;lt;/button&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;/form&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;&amp;lt;?php
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; } else if ($_SESSION[&amp;#34;step&amp;#34;] == 2) {
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;?&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;form method=&amp;#34;POST&amp;#34; action=&amp;#34;/contact.php&amp;#34;&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;input type=&amp;#34;hidden&amp;#34; name=&amp;#34;csrf_token&amp;#34; value=&amp;#34;&amp;lt;?= $_SESSION[&amp;#39;csrf_token&amp;#39;] ?&amp;gt;&amp;#34;&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; お名前 (必須): &amp;lt;?= $reqvals[&amp;#34;name&amp;#34;] ?&amp;gt;&amp;lt;br /&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; お名前 (かな) (必須): &amp;lt;?= $reqvals[&amp;#34;kana&amp;#34;] ?&amp;gt;&amp;lt;br /&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; 御社又は関連サイトのURL: &amp;lt;?= $optvals[&amp;#34;url&amp;#34;] ?&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;button&amp;gt;送信する&amp;lt;/button&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;/form&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;&amp;lt;?php
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; } else {
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;?&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;p&amp;gt;不明なエラー。&amp;lt;/p&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;&amp;lt;?php
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; }
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;?&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;/body&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;&amp;lt;/html&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;結果:&lt;br /&gt;
&lt;a href=&#34;https://ass.technicalsuwako.moe/anzenform1.png&#34;&gt;&lt;img src=&#34;https://ass.technicalsuwako.moe/anzenform1.png&#34; alt=&#34;&#34; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://ass.technicalsuwako.moe/anzenform2.png&#34;&gt;&lt;img src=&#34;https://ass.technicalsuwako.moe/anzenform2.png&#34; alt=&#34;&#34; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://ass.technicalsuwako.moe/anzenform3.png&#34;&gt;&lt;img src=&#34;https://ass.technicalsuwako.moe/anzenform3.png&#34; alt=&#34;&#34; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://ass.technicalsuwako.moe/anzenform4.png&#34;&gt;&lt;img src=&#34;https://ass.technicalsuwako.moe/anzenform4.png&#34; alt=&#34;&#34; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://ass.technicalsuwako.moe/anzenform5.png&#34;&gt;&lt;img src=&#34;https://ass.technicalsuwako.moe/anzenform5.png&#34; alt=&#34;&#34; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://ass.technicalsuwako.moe/anzenform6.png&#34;&gt;&lt;img src=&#34;https://ass.technicalsuwako.moe/anzenform6.png&#34; alt=&#34;&#34; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ねぇねぇー!&lt;br /&gt;
簡単でしょー!&lt;/p&gt;
&lt;p&gt;以上&lt;/p&gt;
</content>
</entry>
</feed>