tag:crieit.net,2005:https://crieit.net/tags/%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3/feed
「セキュリティ」の記事 - Crieit
Crieitでタグ「セキュリティ」に投稿された最近の記事
2021-07-12T13:59:06+09:00
https://crieit.net/tags/%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3/feed
tag:crieit.net,2005:PublicArticle/17498
2021-07-12T13:59:06+09:00
2021-07-12T13:59:06+09:00
https://crieit.net/posts/7dd8343d175c01861002f60c5e7956bd
【セキュリティ】スイッチのポートセキュリティ
<h1 id="まず、ポートセキュリティとは"><a href="#%E3%81%BE%E3%81%9A%E3%80%81%E3%83%9D%E3%83%BC%E3%83%88%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%81%A8%E3%81%AF">まず、ポートセキュリティとは</a></h1>
<p>ポートセキュリティとは、その名の通り、スイッチに接続するポートに対してのセキュリティです。</p>
<p>知らない機器がスイッチポートに繋がってLAN接続するのを防ぎます。<br />
<code>インターフェースコンフィギュレーションモードにて</code><br />
<code>switchport port-security</code><br />
で有効にします</p>
<p>ここで、</p>
<p><code>switchport port-security maximum 3</code><br />
とか設定すると、このスイッチには最大3台までしか接続できなくなる。</p>
<p>これを超えて6台とか繋いだら、<br />
セキュリティ違反モードが作動します。</p>
<h2 id="セキュリティ違反モードとは"><a href="#%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E9%81%95%E5%8F%8D%E3%83%A2%E3%83%BC%E3%83%89%E3%81%A8%E3%81%AF">セキュリティ違反モードとは</a></h2>
<p>違反すると何が起こるかというと、</p>
<ol>
<li>セキュアなMACアドレス以外のパケットを破棄する</li>
<li>SNMPトラップやSyslogメッセージの送信と、違反カウンタの増加</li>
<li>ポートのシャットダウン</li>
</ol>
<p>です。。。が。</p>
<p>これは違反モードがshutdown(デフォルト)の時の話。</p>
<p>違反モードは3つ(shutdown、restrict、protect)あって</p>
<p>restrictにすると、<br />
3. ポートのシャットダウンがなくなり</p>
<p>protectにすると、<br />
2. SNMPトラップやSyslogメッセージの送信と、違反カウンタの増加がさらになくなります。</p>
skyms
tag:crieit.net,2005:PublicArticle/17292
2021-05-27T12:11:46+09:00
2021-05-27T12:11:46+09:00
https://crieit.net/posts/XSS
XSSについてちゃんと調べてみた
<h1 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h1>
<p>OWASP ZAPで脆弱性診断を行ったところ、<strong>クロス サイト スクリプティング(DOMベース)</strong> というのが出てしまいました。<br />
XSS自体はよく聞くので知っていましたが、「DOMベースって何?そもそもXSSのことちゃんと理解してないな?」<br />
と思い調べてみたので、まとめていきます。</p>
<h1 id="XSSとは"><a href="#XSS%E3%81%A8%E3%81%AF">XSSとは</a></h1>
<p>Webサイトの脆弱性を突き、攻撃者がそこに悪質なスクリプトを仕掛ける攻撃です。<br />
画面を一時的に改ざんしてログイン情報を抜き取ったり、Cookieを盗み見たりなど、とにかく危険満載って感じです。</p>
<p>XSSには以下の3パターンがあります。</p>
<h2 id="反射型"><a href="#%E5%8F%8D%E5%B0%84%E5%9E%8B">反射型</a></h2>
<p>フォーム入力などを行った次のページで発生するヤツです。<br />
<a target="_blank" rel="nofollow noopener" href="https://gihyo.jp/dev/serial/01/javascript-security/0002">こちら</a>の例を使用させていただきます。</p>
<p>検索画面で、ユーザーが「HTML5」と入力すると、<br />
<code>http://example.jp/search?q=HTML5</code>というURLで検索結果が表示されるとします。</p>
<p>検索結果画面では、よく「◯◯を検索しました。◯件見つかりました。」みたいなのがありますよね。<br />
その部分がHTMLで以下の様になっているとします。</p>
<pre><code class="html">語句「<span class="keyword">HTML5</span>」を検索しました。20件の文書が見つかりました。
</code></pre>
<p>ユーザーが入力した「HTML5」をそのまま<code>span</code>で囲んで出力している感じですね。</p>
<p>これにもし、検索キーワードとして<code><script>alert(1)</script></code>なんてものを入力された場合</p>
<pre><code class="html">語句「<span class="keyword"><script>alert(1)</script></span>」を検索しました。20件の文書が見つかりました。
</code></pre>
<p>となってしまいます。</p>
<p>本来文字列として表示されるべき部分が<code><script></code>要素になってしまい、<br />
ブラウザ上ではJavaScriptが動作してしまうことで、XSSが発生します。</p>
<p>これを利用して、<code>alert(1)</code>なんて可愛いものではなくてもっとエグいものを仕込まれることで被害が起きるという仕組みですね。</p>
<h2 id="蓄積型"><a href="#%E8%93%84%E7%A9%8D%E5%9E%8B">蓄積型</a></h2>
<p>DBに保存されている情報を表示させるときに発生するヤツです。</p>
<p>例えば掲示板サイトがあったとして、攻撃者が本文に</p>
<pre><code class="html"><script>alert(1)</script>
</code></pre>
<p>と入力して投稿→DBに保存されたとします。</p>
<p>他のユーザーが掲示板を開くとこの攻撃者からの投稿が表示され、<br />
JavaScriptが勝手に実行されてしまい、XSSが発生します。</p>
<h2 id="DOMベース型 "><a href="#DOM%E3%83%99%E3%83%BC%E3%82%B9%E5%9E%8B%E3%80%80">DOMベース型 </a></h2>
<p>JavaScriptがDOMを構築するときに発生するヤツです。<br />
今回起きてたのはコレですね。<br />
<a target="_blank" rel="nofollow noopener" href="https://gihyo.jp/dev/serial/01/javascript-security/0006">こちら</a>の例を使用させていただきます。</p>
<p>以下のようなコードがあるとします。</p>
<pre><code class="javascript">div = document.getElementById("info");
div.innerHTML = location.hash.substring(1);
</code></pre>
<p><code>location.hash.substring(1)</code>でURLのハッシュ部分(#以降)を取得し、<br />
それを<code>id="info"</code>の<code>div</code>要素に入れることで、画面に表示させている処理です。</p>
<p>URLが<code>http://example.jp/#title1</code>みたいなものなら問題ないですが、<br />
<code>http://example.jp/#<img src=1 onerror=alert(1)></code> のようなURLを開いた場合、<br />
<code><img src=1 onerror=alert(1)></code> がHTML内に展開され、JavaScriptが実行されることでXSSが発生します。</p>
<h1 id="困ったことに全く心当たりがない"><a href="#%E5%9B%B0%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8%E3%81%AB%E5%85%A8%E3%81%8F%E5%BF%83%E5%BD%93%E3%81%9F%E3%82%8A%E3%81%8C%E3%81%AA%E3%81%84">困ったことに全く心当たりがない</a></h1>
<p>今回起きた(診断された)DOMベースのXSSが何なのかはわかったけど、<br />
自分のコードにおいて心当たりが全く無い!<br />
フロントエンドはVueで作成しているので、VueにおけるXSSについても調べる必要がありそうだなと。<br />
OWSP ZAPの誤検知の可能性もあるので、万が一明確な原因が見つかったら、またまとめておこうかなと思います。</p>
<h1 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h1>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://gihyo.jp/dev/serial/01/javascript-security/0002?page=1">第2回 Webセキュリティのおさらい その2 XSS:JavaScriptセキュリティの基礎知識|gihyo.jp … 技術評論社</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://gihyo.jp/dev/serial/01/javascript-security/0006">第6回 DOM-based XSS その1:JavaScriptセキュリティの基礎知識|gihyo.jp … 技術評論社</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://www.slideshare.net/tobaru_yuta/vuejs-xss">Vue.js で XSS</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/miya_zato/items/7ea57326c86a198fcf08">XSSと、XSSの種類について - Qiita</a></li>
</ul>
みみみみみ
tag:crieit.net,2005:PublicArticle/15407
2019-09-18T23:38:34+09:00
2019-09-18T23:41:27+09:00
https://crieit.net/posts/cookie
【セキュリティ】cookieとセッション、セッションハイジャックとは
<h1 id="cookieとセッション、セッションハイジャックとは"><a href="#cookie%E3%81%A8%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%80%81%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%8F%E3%82%A4%E3%82%B8%E3%83%A3%E3%83%83%E3%82%AF%E3%81%A8%E3%81%AF">cookieとセッション、セッションハイジャックとは</a></h1>
<p><em>※あくまで個人の見解での説明であり、厳密の意味とは異なる場合があります。</em></p>
<h3 id="1. cookieとは"><a href="#1.++cookie%E3%81%A8%E3%81%AF">1. cookieとは</a></h3>
<p>途中まで画面に項目を入力していて、前の画面に戻らないといけないってなったときに全部やり直しっていうのはなかなかしんどい<br />
そんなあなたのためにウェブサーバとウェブブラウザ間での情報を保管してくれるのがcookie<br />
開きなおして大量の情報が保持されてる時の安心感</p>
<p>cookieを消すことができるのはウェブブラウザ側<br />
つまり見ようと思えばだれでも見られるところに情報がある<br />
個人情報やらクレジットカード情報やらは入力面倒だろうけど、保持されないほうがいいね</p>
<h3 id="2. セッションとは"><a href="#2.+%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E3%81%AF">2. セッションとは</a></h3>
<p>サーバが発行するのがセッション</p>
<p>ウェブサーバとウェブブラウザは忍者<br />
互いの合言葉を毎回確認しないと気が済まない<br />
サーバが番号を発行してセッションIDをつくり、ウェブブラウザ側がそのセッションIDを使っていればサーバのデータを閲覧更新削除できるやったー</p>
<p>違ってたらもちろんデータに手は出せない</p>
<p>でも悪い奴らはそのデータに手を出したい</p>
<p>そうさセッションIDが分かれば悪さができてしまうのだ</p>
<h3 id="3. セッションハイジャックとは"><a href="#3.++%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%8F%E3%82%A4%E3%82%B8%E3%83%A3%E3%83%83%E3%82%AF%E3%81%A8%E3%81%AF">3. セッションハイジャックとは</a></h3>
<p>ハイジャックってのは、飛行機乗っ取りとかでよく聞く<br />
セッションハイジャックはサーバデータをなりすましてもってっちゃう<br />
セッションIDを推測やら盗聴やらでゲットできちゃったらデータはおしまい</p>
<h3 id="4. セッションハイジャックを防ぐには?"><a href="#4.++%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%8F%E3%82%A4%E3%82%B8%E3%83%A3%E3%83%83%E3%82%AF%E3%82%92%E9%98%B2%E3%81%90%E3%81%AB%E3%81%AF%EF%BC%9F">4. セッションハイジャックを防ぐには?</a></h3>
<p>忍者は必要<br />
ただし忍者にも複雑なセッションIDにも限界はある<br />
門番とか関所とかも準備しとこう</p>
<p>おわり</p>
じゅりぽぽ
tag:crieit.net,2005:PublicArticle/14760
2019-01-30T09:07:41+09:00
2019-02-04T22:50:37+09:00
https://crieit.net/posts/63e2bc14bf8fa678f60351647fd9537c
誰にでも分かる易しい情報漏洩のしかた - 基礎編
<p>最近peingにてTwitterのトークンなどが流出する問題が発生しました。しかしこれは何も知らなければ簡単に作り出せてしまう脆弱性です。具体的にどのようにしてこの情報漏洩が発生したのか、そしてどのようにして防ぐことができるのかのざっとの基礎について書いてみます。(ちなみに特に続きの記事はありません)</p>
<h2 id="そもそもなぜ情報漏洩したのか"><a href="#%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82%E3%81%AA%E3%81%9C%E6%83%85%E5%A0%B1%E6%BC%8F%E6%B4%A9%E3%81%97%E3%81%9F%E3%81%AE%E3%81%8B">そもそもなぜ情報漏洩したのか</a></h2>
<h3 id="ユーザーの情報を表示する昔ながらの方法"><a href="#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E6%83%85%E5%A0%B1%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E6%98%94%E3%81%AA%E3%81%8C%E3%82%89%E3%81%AE%E6%96%B9%E6%B3%95">ユーザーの情報を表示する昔ながらの方法</a></h3>
<p>例えば下記のような構造のusersテーブルがあったとします。</p>
<div class="table-responsive"><table>
<thead>
<tr>
<th>カラム</th>
<th>役割</th>
</tr>
</thead>
<tbody>
<tr>
<td>id</td>
<td>ID</td>
</tr>
<tr>
<td>name</td>
<td>名前</td>
</tr>
<tr>
<td>twitter_token</td>
<td>TwitterのAccess token</td>
</tr>
<tr>
<td>twitter_secret</td>
<td>TwitterのAccess token secret</td>
</tr>
</tbody>
</table></div>
<p>Webサービス上にてユーザーの名前を表示したい場合、例えばPHPのLaravelであれば下記のようにして表示します。</p>
<pre><code class="php">お名前:<span>{</span><span>{</span> $user->name <span>}</span><span>}</span>
</code></pre>
<p>データをMySQLから取得後、メモリ上にはTwitterのトークンなどが存在しますが、ここではテンプレート上で名前しか表示していないので問題はありません。わざわざトークンを表示する、ということもないと思うのでこういった場合には問題になりません。</p>
<h3 id="ユーザー情報をAPIで取得する場合"><a href="#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E6%83%85%E5%A0%B1%E3%82%92API%E3%81%A7%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88">ユーザー情報をAPIで取得する場合</a></h3>
<p>最近はフロントエンドとバックエンドが分かれることが多くなり、直接テンプレート上に表示する形ではなく、バックエンドから情報をJSON形式に変更してフロントエンドに伝える、という形が多くなりました。</p>
<p>例えばユーザー情報をPHPのjson_encodeでJSONに変換すると、下記になります。</p>
<pre><code class="json">{
"id": 154,
"name": "taro",
"twitter_token": "weojwaiofj09a9aw9efjaw0efoawj2j3io2f",
"twitter_secret": "ojweiofjaoiejfajewkljfaoiwejf"
}
</code></pre>
<p>当然のことながら、表示したいところだけではなくユーザー情報全てがJSONに含まれています。これを送信するため、ChromeのDev Tool等では丸見えになります。こういったことが今回の原因の一つになっています。</p>
<h2 id="情報漏洩しないための対策"><a href="#%E6%83%85%E5%A0%B1%E6%BC%8F%E6%B4%A9%E3%81%97%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81%E3%81%AE%E5%AF%BE%E7%AD%96">情報漏洩しないための対策</a></h2>
<h3 id="送信する情報を制限する"><a href="#%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B%E6%83%85%E5%A0%B1%E3%82%92%E5%88%B6%E9%99%90%E3%81%99%E3%82%8B">送信する情報を制限する</a></h3>
<p>古き良き形と同様、単に表示したい情報をフィルタリングすればよいだけです。</p>
<h4 id="データベースから取得する際に制限する"><a href="#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%8B%E3%82%89%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E9%9A%9B%E3%81%AB%E5%88%B6%E9%99%90%E3%81%99%E3%82%8B">データベースから取得する際に制限する</a></h4>
<p>例えば、MySQLからデータを取得する場合、</p>
<pre><code class="sql">SELECT * FROM users
</code></pre>
<p>のようにして全部取得するのではなく、</p>
<pre><code class="sql">SELECT id, name FROM users
</code></pre>
<p>のように必要な情報だけを取得するようにします。メモリの無駄な消費も避ける事ができます。</p>
<h4 id="アプリケーションフレームワーク側で制限する"><a href="#%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E5%81%B4%E3%81%A7%E5%88%B6%E9%99%90%E3%81%99%E3%82%8B">アプリケーションフレームワーク側で制限する</a></h4>
<p>例えばLaravelの場合、モデルの設定でJSON化する情報を設定することができます。</p>
<pre><code class="php">protected $visible = ['id', 'name'];
</code></pre>
<p>上記のようにすればIDと名前しか表示されませんし、</p>
<pre><code class="php">protected $hidden = ['twitter_token', 'twitter_secret'];
</code></pre>
<p>上記のようにすれば隠したいカラムを指定することができます。</p>
<p>Railsの場合もto_jsonに<code>:only</code>や<code>:except</code>を指定することができます。</p>
<p>Goの場合、構造体に対してJSONの出力方法を指定する形になります。</p>
<pre><code>type User struct {
Id int `json:"id"`
Name string `json:"name"`
}
</code></pre>
<p>設定は省略できますが、大文字そのままで使うということもあまりないと思うのでだいたい設定するのではないかと思います。なので設定中に「あれ、tokenってJSONに含めていいんだっけ…?」と勘のいい人であれば気づくことができます。このようにセキュリティをしっかりするためにわざわざちょっと面倒な言語やフレームワークを使う、という選択肢もあるのではないかと思います。</p>
<p>もちろん知識があれば選択は自由ですが、それでも人間が作っているものですのでいつも不安は残ります。</p>
<h3 id="そもそも情報漏洩しても問題ないデータ構成にする"><a href="#%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82%E6%83%85%E5%A0%B1%E6%BC%8F%E6%B4%A9%E3%81%97%E3%81%A6%E3%82%82%E5%95%8F%E9%A1%8C%E3%81%AA%E3%81%84%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E6%88%90%E3%81%AB%E3%81%99%E3%82%8B">そもそも情報漏洩しても問題ないデータ構成にする</a></h3>
<p>今回の件でせせりさんもツイートされていましたが、人為的なミスは起こる可能性がありますので、その場合にも問題ないデータ構造にしておく、ということも重要です。</p>
<p>例えば今回の例であればIDと名前はusersテーブルに入れておき、Twitter関連の情報はsocialsテーブルとして分けて入れておく、という具合です。これであればたとえusersテーブルのJSON生成方法をちゃんと設定しなかったとしてもTwitterのトークンが漏洩するということはありません。(元々せせりさんはこのように作っていたらしいですが、サービス譲渡後に変わってしまったようです)</p>
<h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2>
<p>このように、正直情報漏洩は非常に簡単に行うことができますので、恐らく漏洩しているアプリは現時点でも非常に多いのではないかと思います。今回の騒動を見てダサいとか、対岸の火事だとか思わず、良い機会なので改めて自分で作っているサービスがあれば見直してみたり、セキュリティに付いてもっと深く調べてみると良いと思います。</p>
だら@Crieit開発者
tag:crieit.net,2005:PublicArticle/14505
2018-08-14T23:07:38+09:00
2018-10-31T12:53:51+09:00
https://crieit.net/posts/3007e75a4752e022ab2ad08cd46004de
「世界最悪のログイン処理コード」ではない可能性は無いのか?
<p>先日「世界最悪のログイン処理コード」が話題になった。</p>
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">世界最悪のログイン処理コード。実際のサービスで可動していたものだとか……<a target="_blank" rel="nofollow noopener" href="https://t.co/C2bG93ZCkj">https://t.co/C2bG93ZCkj</a> <a target="_blank" rel="nofollow noopener" href="https://t.co/EfVNAEslrn">pic.twitter.com/EfVNAEslrn</a></p>— はっしー@海外プログラマ🇳🇿元社畜 (@hassy_nz) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/hassy_nz/status/1027890455940198400?ref_src=twsrc%5Etfw">2018年8月10日</a></blockquote>
<p>ただ、開発者がその脆弱性を理解した上で、ちゃんと対処を行っており問題ない状態である可能性はないかを考えてみた。</p>
<h2 id="一番の問題"><a href="#%E4%B8%80%E7%95%AA%E3%81%AE%E5%95%8F%E9%A1%8C">一番の問題</a></h2>
<p>今回のコードで一番問題になっているのはやはりここだろう。</p>
<pre><code class="javascript">var accounts = apiService.sql(
"SELECT * FROM users"
);
</code></pre>
<p>生のSQLをサーバーに送って実行した結果をクライアント側で取得できるようにしていることで、第三者があらゆる情報を取得できてしまう脆弱性と、クライアント側にて大量のメモリ使用を強制させて負荷を与えるという問題をたった三行で想像させてしまう恐ろしいコードだ。</p>
<p>でも、ちょっと考え方を変えるとそうではない可能性もあるということが分かる。</p>
<h3 id="SQL文をフィルタリングしている"><a href="#SQL%E6%96%87%E3%82%92%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B">SQL文をフィルタリングしている</a></h3>
<p>もしサーバー側で送られてきたSQLをフィルタリングして、許可していないSQLを弾いている場合はデータベースのあらゆる情報をとれてしまうということはない。</p>
<h3 id="そもそもSQLをそのまま実行しているわけではない"><a href="#%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82SQL%E3%82%92%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%82%8F%E3%81%91%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84">そもそもSQLをそのまま実行しているわけではない</a></h3>
<p><code>SELECT * FROM users</code>というSQL文を引数として渡しているが、これを必ずしもサーバー側でそのまま実行しているとは限らない。そもそも<code>apiService.sql</code>というメソッドが引数だけを使って処理をしているとは限らない。</p>
<p>色々総合すると下記の様な感じになっている可能性もある。</p>
<p>JavaScript側</p>
<pre><code class="javascript">class ApiService {
sql(query) {
const response = $.ajax({
url: "/api/sql",
type: "get",
async: false,
data: {
username: $("#username").val(),
password: $("#password").val(),
sql: query
}
});
return response.result;
}
}
</code></pre>
<p>サーバー側</p>
<pre><code class="php">$methods = [
"SELECT * FROM users" => "getLoginUser",
:
];
$this->{$methods[$request["sql"]]}($request);
</code></pre>
<p><code>getLoginUser</code>の中で<code>SELECT id, nickname FROM users WHERE username = '$username' AND password = '$password'</code>みたいなのを実行して結果を返す感じ。</p>
<p>こんな感じであればセキュリティ的にもメモリ的にも全く問題はない。</p>
<p>ただしもちろんAPIのURLを別にすればいいだけでSQL文でフィルタリングする必要性も全く無いし、誰がどう見てもSQLを直接動かしているようにしか見えないので実装的にはとんでもない話ではあると思う。</p>
<h2 id="生パスワードを使ってる問題"><a href="#%E7%94%9F%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%8B%E5%95%8F%E9%A1%8C">生パスワードを使ってる問題</a></h2>
<p>次に問題となるのは入力されたパスワードをそのまま使っている、つまりデータベースにも生のパスワードが保存されているのではないか疑惑。これに関しては先程のようにサーバー側で単なるSQLを直接実行しているわけではないという前提であれば疑惑を回避できる。</p>
<p>ただ、<code>account.password === password</code>という処理があるせいで、やはり生パスワードを使っていないとおかしいのでは、という話になってしまう。</p>
<p>ただここは一応<code>$("#password").val()</code>は必ずしも#passwordが入力欄とは限らないので、例えば#password_inputに入力されたものを随時サーバーに送って、ハッシュ化したものを#passwordというhiddenに入れておく、という可能性があり、それであれば特にその部分の問題はなくなる。</p>
<p>もちろんこのコードにするためにわざわざ通信して変換しているという処理は理解し難い。</p>
<h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2>
<p>一応「世界最悪のログイン処理コード」であることを回避することができるような考え方は不可能ではなさそうだが、そのかわり今度は人としての優しさを失ったコードになってしまいそう。</p>
だら@Crieit開発者