【076】spliti 2.0.0登場

このコミットが含まれているのは:
守矢諏訪子 2023-11-05 03:43:39 +09:00
コミット 945c4dceb2
5個のファイルの変更76行の追加173行の削除

ファイルの表示

@ -3,13 +3,50 @@
<id>gemini://technicalsuwako.moe</id>
<title>テクニカル諏訪子</title>
<updated>2023-10-23T16:00:00Z</updated>
<updated>2023-11-05T00:00:00Z</updated>
<author><name>テクニカル諏訪子</name></author>
<link href="gemini://technicalsuwako.moe" rel="alternate"></link>
<entry>
<id>blog/spliti-200.gmi</id>
<author><name>凛</name></author>
<title type="html">【】spliti 2.0.0登場</title>
<published>2023-11-05T00: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-200.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;PHPからGo言語に交換しました&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/norikae-102.gmi</id>
<author><name>凛</name></author>
@ -288,177 +325,5 @@ doas apk add urloli
</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>

ファイルの表示

@ -2,6 +2,7 @@
# 記事一覧
=> /blog/spliti-200.gmi 2023年11月05日 【】spliti 2.0.0登場
=> /blog/norikae-102.gmi 2023年10月23日 【076】乗換 1.0.2登場
=> /blog/spliti-112.gmi 2023年10月23日 【オワコンテック】spliti 1.1.2登場
=> /blog/postmarketos-make-repository.gmi 2023年10月15日 【PostmarketOS】自分のレポジトリを作り方

18
gemini/blog/spliti-200.gmi ノーマルファイル
ファイルの表示

@ -0,0 +1,18 @@
=> /blog.gmi ブログ一覧へ
#【】spliti 2.0.0登場
投稿日2023-11-05
## splitiって何?
splitiはMixiのフェイクニュース部分向けプライバシーUIです。
## 変更
* PHPからGo言語に交換しました
## ソースコード
=> https://gitler.moe/suwako/spliti Gitler
## 公式インスタンス
=> https://mixi.owacon.moe/
以上

ファイルの表示

@ -3,6 +3,7 @@
# avatar = gemini://076.moe/static/suwako.jpg
# description = テクニカル諏訪子様のtwtxtフィード
# link = ホームページ gemini://technicalsuwako.moe
2023-11-05T00:00:00Z09:00 【】spliti 2.0.0登場 - gemini://technicalsuwako.moe/blog/blog/spliti-200.gmi
2023-10-23T16:00:00Z09:00 【076】乗換 1.0.2登場 - gemini://technicalsuwako.moe/blog/blog/norikae-102.gmi
2023-10-23T00:00:00Z09:00 【オワコンテック】spliti 1.1.2登場 - gemini://technicalsuwako.moe/blog/blog/spliti-112.gmi
2023-10-15T00:00:00Z09:00 【PostmarketOS】自分のレポジトリを作り方 - gemini://technicalsuwako.moe/blog/blog/postmarketos-make-repository.gmi

18
src/blog/spliti-200/index.md ノーマルファイル
ファイルの表示

@ -0,0 +1,18 @@
title: 【】spliti 2.0.0登場
author: 凛
date: 2023-11-05
tags: jp,blog,ウエブ開発,,spliti
----
## splitiって何?
splitiはMixiのフェイクニュース部分向けプライバシーUIです。
## 変更
* PHPからGo言語に交換しました
## ソースコード
[Gitler](https://gitler.moe/suwako/spliti)
## 公式インスタンス
[https://mixi.owacon.moe/]()
以上