【076】spliti 2.0.0登場
このコミットが含まれているのは:
コミット
945c4dceb2
211
gemini/blog.atom
211
gemini/blog.atom
|
@ -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">【076】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="076"></category>
|
||||
|
||||
<category term="spliti"></category>
|
||||
|
||||
<link href="gemini://technicalsuwako.moe/blog/spliti-200.gmi" rel="alternate"></link>
|
||||
<content type="html">
|
||||
|
||||
|
||||
|
||||
<h2 id="spliti">splitiって何?</h2>
|
||||
<p>splitiはMixiのフェイクニュース部分向けプライバシーUIです。</p>
|
||||
<h2 id="heading">変更</h2>
|
||||
<ul>
|
||||
<li>PHPからGo言語に交換しました</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/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">
|
||||
|
||||
|
||||
|
||||
<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>
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
# 記事一覧
|
||||
|
||||
=> /blog/spliti-200.gmi 2023年11月05日 【076】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】自分のレポジトリを作り方
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
=> /blog.gmi ブログ一覧へ
|
||||
|
||||
#【076】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 【076】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
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
title: 【076】spliti 2.0.0登場
|
||||
author: 凛
|
||||
date: 2023-11-05
|
||||
tags: jp,blog,ウエブ開発,076,spliti
|
||||
----
|
||||
## splitiって何?
|
||||
splitiはMixiのフェイクニュース部分向けプライバシーUIです。
|
||||
|
||||
## 変更
|
||||
* PHPからGo言語に交換しました
|
||||
|
||||
## ソースコード
|
||||
[Gitler](https://gitler.moe/suwako/spliti)
|
||||
|
||||
## 公式インスタンス
|
||||
[https://mixi.owacon.moe/]()
|
||||
|
||||
以上
|
読み込み中…
新しいイシューから参照