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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1017閲覧

フォームデータのファイル保存時の整合性に関して

gyungyun545

総合スコア84

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/04/17 09:06

編集2019/04/17 09:07

#状況
現在、javascriptとpythonで簡単なアンケートサイトを立ち上げ中です。
ほぼクライアントは完成し、あとはサーバー側でユーザのデータを保存すれば完了です。
簡易的にファイル保存にしてしまおうと思ったのですが、ファイル保存の場合、大量のサブミットが同時に発生した場合の整合性がどうなるのか少し心配になってきました。
500人ほどから回答を頂く予定なので、数人が同時にサブミットすることはあり得るかと思います。

保守やバックアップ、整合性の観点でデータベースの方が好ましいとは考えておりますが、ログファイルなどに非同期で出力保存するケースもあるのでできるはずと考えております。

#困っていること
WEBサーバーの構築は初めてなので、起こりうる問題が想定できず。
このやり方で問題なく整合性のあるファイル保存ができるのか?
他にもっと良い方法があるのか?ご教授いただけますと幸いです。

下は、ユーザから$.postで投げられたjsonデータをファイルに追記するcgiです。

python3

1#!/usr/bin/env python3.6 2# -*- coding: utf-8 -*- 3import json 4import cgi 5import cgitb 6import sys 7import random, string 8cgitb.enable() 9 10data = sys.stdin.read() 11params = json.loads(data) 12 13with open("output.txt", mode="a") as f: 14 json.dump(params, f) 15 16exit()

#試したこと
bash上で500回同じファイルに追記モードでjson.dump行うテストを行いました。
ファイル内での順序は入れ替わりましたが欠けたデータはななかったので上のやり方で問題なく行くはずだと考えてます。

bash

1for i in {1..500} ; do 2 ./test.py ${i} & 3done

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

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

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

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

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

guest

回答1

0

ベストアンサー

結論から言うとファイルで管理する場合、送信前のページにtoken発行機構を付け登録処理で最初のtokenの場合だけ許す。という処理がベターです。

これは実際のWEBサイトは並列で実行されるのでタイミング次第では書き込んでる途中に別なデータが割り込むのも確率的には不整合する可能性があるためです。
同じファイルを更新する場合は別途ディレクトリを使ったロック処理をするのが確実ですが、待ち、リトライ、再実行させるなど必要です。

どのようなデータ連携かは推察し得ないので明確な回答はできませんが、ユーザIDなどユニークな値があるならばそれをファイル名にすると衝突性は低くなります(WEBサービスなので複数のタブを開いて一斉送信するとやっぱり不整合を起こす)。

そのためDBを使わないならtoken機構が一番確実です

投稿2019/04/17 10:04

namda

総合スコア705

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

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

gyungyun545

2019/04/17 13:49

ご回答有り難うございます。 非常に初歩的な質問になり申し訳ないですが、具体的にどのような処理を追加するのでしょうか? jQueryにパッケージがあるのでしょうか?
namda

2019/04/18 03:00

①サーバにアクセスするとtoken生成する→②サーバで生成したtokenをサーバに保存する→③ページにtokenを表示する→④書き込み時にtokenも一緒に送る→⑤サーバで②で生成したtokenと送られてきたtokenが同じか比較し同じだったらファイルに書き込む が一連の流れです。 ⑤でtokenが異なる場合、他の人と競合してるので①からやり直すようページに表示します。 もしこの方法が難しいと感じたのならば、sqlite3など簡易DBを使ったほうが良いです。
gyungyun545

2019/04/18 08:22

ご丁寧にありがとうございます。 現状、アンケート終了後にサーバが発行したパスワード(ランダム英数字文字列)をユーザに表示するようにしてます。それと同様にもっと長い文字列を最初に発行して、javascriptの変数として保管して、submit時に送信してサーバで照合すればtokenになりますでしょうか?
退会済みユーザー

退会済みユーザー

2019/04/18 09:11

横からすみません。 回答がよく理解できなかったのですが、質問が「複数名の同時 submit の競合」を心配しているのに対して、「CSRF 対策または多重投稿対策」を回答しているように見えます。 双方正しく理解されているのでしょうか? 私の理解だけが間違ってれば申し訳ない^^;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問