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