質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

857閲覧

HTTP GETメソッドを受けつけるバックエンド側でDBにUPDATEをかける処理をかけるのはおかしいですか?

murabito

総合スコア108

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/06/30 03:15

ユーザー登録を登録フォームにメールアドレスを入力して行うと、メールアドレスを確認するために、期限付きのトークンが付与されたURLを記載したメールをユーザーに送信する部分を昨日、バックエンドの勉強のために作り始めた簡易ウェブアプリに実装しました。

例えば、メールに記載されるURLは以下のようなものです。

https://_______.com/verify?token=joafjaiejoiomovaeoioje

このURLからのリクエストを受け付けるバックエンド側ではトークンを検証して、検証で問題なければこのトークンに紐づくユーザーをDBから取得し、そのユーザーのメアド確認済みフラグをtrueに変更し、DBに更新をかけています。

この場合、困ったのが、エンドポイントで受け付けるメソッドをPUTやPATCHにしてしまうと、仮登録後に送信されるメール内のリンクをクリックした時に、ブラウザーで該当ページを表示すると、そんなエンドポイントないと400系のエラーが出てしまったのです。

リンクだから自ずとGETになるのだなと思い、エンドポイント側の受付メソッドもそれに応じて、GETに変更し、とりあえず、やりたいことは実現することが出来ました。

しかし疑問として、GETメソッドを受け付ける側でDBテーブルに追加や更新をかける処理って、GETのイメージと異なるものがあり、自分がやっているのは果たして正しいのだろうかと思ってしまいました。

自分のやり方が間違っているのでしょうか?それとも、こういう場合はこういうものなのでしょうか?

ご教示いただけると大変ありがたいです。よろしく御願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyabi-sun

2022/06/30 04:00

こういうコードが関係しない質問はteratailでは非推奨で どちらかと言うとQuora等の別媒体の方が適しています
murabito

2022/06/30 04:09

そうだったのですか。。。すみません、ガイドラインの方を確認いたします!
68user

2022/06/30 07:45

プログラミングにおける設計段階での疑問なわけで、全く問題ないでしょう。
guest

回答2

0

ベストアンサー

GETメソッドを受け付ける側でDBテーブルに追加や更新をかける処理って、GETのイメージと異なるものがあり、自分がやっているのは果たして正しいのだろうかと思ってしまいました。

なるほど、確かにRESTfulの観点で言えばGETメソッドでDBの更新をかけに行くのは不自然に感じます。

しかし、そもそもWebサイトってどこでも荒らし対策にアクセスログくらいは取得してます。
またGoogleやらYouTubeやらのサービスは
閲覧しただけで「ユーザーの利便性の為にアクセス記録を保管して今後の検索に役立てます」とかもっともらしい事を言いながらDBに保存しまくり抽出しまくりなわけですよ。

GETというのはクライアント側の都合です。
「HTMLなりJSONください」って問い合わせでHTMLやJSONを返さないのは論外ですが、
ちゃんと求めたデータを返しつつ、裏でこっそりなんかするってのは実際問題サービス提供者側はよくやってる行動です。

今回の件は
「今からメールを送信すると共に30分だけアクセス出来る貴方だけが閲覧出来るページが出現します。」
「そのページにGETでアクセスしたら、本人確認とみなしてDBに本人確認済みフラグが建ちます!」
「はい、これがそのURLです。アクセスをお願いします。」

筋が通って納得出来るならそれで良いかと思います。

どこぞの無断・超小さい文字の利用規約で情報引っこ抜いていくのに比べれば
100倍清廉潔白なWebサービスだと思いませんか?

投稿2022/06/30 04:13

miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

murabito

2022/06/30 04:22

回答ありがとうございます。 > 筋が通って納得出来るならそれで良いかと思います。 メール内で「認証完了させるために以下のリンクをクリックしてください」と説明を添えている限り、リンクをクリックした後に認証完了処理が行われることのユーザーへの説明は十分出来ているから、問題ないということですね! 先程読んでいた以下の指摘もクリアしていると思いますし、GETでこの場合やっても問題ないという確信に繋がりました! RFC-7231: 4.2.1. Safe Methods. https://www.rfc-editor.org/rfc/rfc7231#section-4.2.1 "What is important, however, is that the client did not request that additional behavior and cannot be held accountable for it."
guest

0

自分のやり方が間違っているのでしょうか?それとも、こういう場合はこういうものなのでしょうか?

事情がよく分からないのではっきりしたことは言えませんが、何らかの理由で GET にせざるを得ないなら間違っているということにはならないと思うのですが? 

ASP.NET のフレームワークに実装されている Email Confirmation でも Token をクエリ文字列に設定しています。

具体的には以下の記事の「(7) Register ページの修正」のセクションの画像を見てください。

Email Confirmation の実装 (CORE)
http://surferonwww.info/BlogEngine/post/2020/05/18/email-confirmation-and-password-recovery-in-aspnet-core-identity.aspx

投稿2022/06/30 03:31

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

murabito

2022/06/30 04:04

ご回答ありがとございます!リンク先の他にも回答頂いた後に自分でもメール認証の実装方法を紹介している記事をいくつか見てみたのですが、たしかにGETで受け付けてそのままDB更新していました。 一方でこんな気になる記事も見つけて、見ているところです。 GETで受け付けるが、一旦、フロントでPOST送信させるフォームを表示させてから、DB更新はPOSTで受け付けたメソッドの方で対応するみたいなやり方です。 https://softwareengineering.stackexchange.com/questions/422507/email-confirmation-links-must-be-get-but-not-safe
退会済みユーザー

退会済みユーザー

2022/06/30 06:24

but not safe と言われれば、URL にトークンがクエリ文字列として追加されることを考えれば、まぁ、そうだとは思います。 ただ、Email Confirmation は有効なメールアドレスを持っている人しかユーザー登録させないという目的に過ぎないので、but not safe でも大きな問題はなさそうと個人的には思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問