ユーザーが Google ドキュメントの URL を互いに共有できる機能を備えた Web サイトを作成しています。安全であるために、投稿を許可する前に、ユーザーの入力が Google ドキュメントの URL であることを検証したいと考えています。私は Flask と Python を使用していますが、これを検証する方法はあるだろうかと考えています。
これまでに学んだ唯一の検証は、以下のような FlaskForm からのものです。
project_link = StringField('Google Docs link to your project', validators=[DataRequired()])
そして、models.py で URL の文字を 100 に制限します
考えられる方法としては、views.py に URL に「docs.google.com」のようなフレーズが含まれているかどうかをチェックする Python コードを作成することだと思います...
URL が Google ドキュメント URL であるかどうかを検証する方法がよくわかりません。方法を教えていただければ幸いです。
ありがとうございます。
txt.find についてはどうですか?
– ジガノシュカ
2020 年 9 月 3 日 13:23
------------------------
次のようなことを試してください:
url = "http://docs.google.com/an/example/google/doc"
prefixes = ["https://","http://"]
def validate(url):
for pre in prefixes:
url = url.strip(pre) # this gets rid of http or https prefixes
if url.startswith("docs.google.com"):
return True
else:
return False
これには、「chrome://」などの不要なプレフィックスを除外する効果もあります。または「about://」。
例:
>>> url = "http://docs.google.com/document"
>>> validate(url)
True
>>> url = "https://googledocs.com"
>>> validate(url)
False
>>> url = "prefix://docs.google.com"
>>> validate(url)
False
13
解決策をありがとうございます。 :) 以下の @E-A ソリューションがあなたのソリューションよりも優れていると思いますか? (どちらのソリューションがより安全であるかを知りたかっただけです)
– 変更点
2020 年 10 月 1 日 3:02
@Upchanges E-A のソリューションは、「docs.google.com」が「docs.google.com」にあるかどうかを確認するだけなので、理想的ではありません。は文字列内にあり、その文字列内のどこにでも存在する可能性があります。中立的な観点からすれば、おそらく私の方がより安全であると言えるでしょう。修正評価。
– monsieuralfonse64
2020 年 10 月 1 日 16:51
わかりました、ありがとう!ほんとうにありがとう!今からあなたのコードを試してみます:)
– 変更点
2020 年 10 月 2 日 8:55
私がこのソリューションを選択したのは、その方が単純だからです (1 行の if ステートメント) が、最初にチェックするかどうかに関して実際の違いはありますか (&site= any を除外しました)方法)?補足として、おそらくプレフィックス リストに www も含める必要があります。
– E-A
2020 年 10 月 7 日 16:14
@E-A Google ドキュメントの URL は docs.google.com で始まる必要があり、どの部分にも docs.google.com を含めることはできません。 www はプレフィックスではなく、ベース ドメインの前にドキュメントがない場合に使用されるサブドメインです。したがって、www.google.com は使用されますが、www.docs.google.com は使用されません。
– monsieuralfonse64
2020 年 10 月 7 日 20:58
------------------------
URL='www......'
if 'docs.google.com' in URL and '&site=' not in URL:
print(True)
monsieuralfonse64 が指摘したように、前のページには docs.google.com が含まれているが、他のサイトは含まれていない場合のバイパスを防ぐために、ステートメントの後半が必要です。
この答えは間違っています。もう一度指摘したように、リンクの前には任意の数のプレフィックスを付けることができ、microsoft.com/hello?x=docs.google.com から stackoverflow.com/docs.google.com?name=hello までのあらゆるプレフィックスを付けることができます。私のアプローチでは、youtube.com/watch?v=docs.google.com がすべて検証されます。
7
1
これは機能しますが、唯一の問題は、http://example.com?prev=docs.google.com&site=dodgysite.com のような危険な URL を誰かが持つ可能性があることです。文字列「docs.google.com」に限ります。が含まれている場合、true と評価されます
– monsieuralfonse64
2020 年 9 月 3 日 13:26
よく見つかりました!このようなことが起こらないようにチェックを導入しました。
– E-A
2020 年 9 月 3 日 13:31
おそらく 'docs.google.com' URL と ... ?
– イタマール
2020 年 9 月 3 日 13:41
これはうまくいきます!ありがとうございます!:) ただし、if ステートメントの "and " を "or" に変更する必要がありました。
– 変更点
2020 年 10 月 1 日 2:59
なぜ or にする必要があるのでしょうか? monsieuralfonse64 が指摘したように、サイト http://example.com?prev=docs.google.com&site=dodgysite.com は、or の場合でも通過します (docs.google はあります)。 com が含まれていますが、&site= があるため、それでも除外する必要があります。
– E-A
2020 年 10 月 7 日 16:08
------------------------
これらのすでに優れたソリューションにもう 1 つのソリューションを追加したいと思います。もののためにこのように、いつでも既存のライブラリを使用することができます!
おそらく、既存のライブラリは、あなた自身では思いつかなかったいくつかの例外的なケースを考慮しているでしょう (適切なライブラリを選択した場合)。今は車輪の再発明はしたくないですよね?
私なら次のように対処します:
from urllib.parse import urlparse
url = "https://drive.google.nl"
format = "drive.google.com"
parsed = urlparse(url)
if(parsed.netloc == format and (parsed.scheme == "http" or parsed.scheme == "https")):
print(True)
私はこれを python3 でのみテストしましたが、他の Python バージョンでも動作すると確信しています。
1
件名または URL 解析ライブラリについては、実際にこの Werkzeug 独自の URL ライブラリを実行できます。これは flask に付属しています (werkzeug は tこれは flask のベースであり、flask 実行上で実行される開発サーバーであり、ポートなどを管理します)
– monsieuralfonse64
2020 年 10 月 8 日 21:06