【问题标题】:How to validate and know if an URL is a Google Docs URL? |Python,Flask|如何验证和知道 URL 是否是 Google Docs URL? |Python,烧瓶|
【发布时间】:2020-12-22 15:49:37
【问题描述】:

我正在创建一个网站,该网站具有让用户彼此共享其 Google 文档 URL 的功能。我想在让用户发布之前验证用户的输入是否为 Google Docs URL,以便安全。我正在使用 Flask 和 Python,我想知道是否有任何方法可以验证这一点。

到目前为止,我学到的唯一验证是来自 FlaskForm 的验证,如下所示:

project_link = StringField('Google Docs link to your project', validators=[DataRequired()])

并在我的 models.py 中将 URL 的字符限制为 100

我认为一种可能的方法是在我的 views.py 中创建一些 Python 代码来检查 URL 是否包含诸如“docs.google.com”之类的短语...

我真的不知道如何验证 URL 是否为 Google Docs URL,如果您能告诉我如何验证,我将不胜感激。

谢谢。

【问题讨论】:

标签: python validation flask url google-docs


【解决方案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 版本。

【讨论】:

  • 在主题或URL解析库上,其实可以这样做Werkzeug自己的url库,自带flask(werkzeug是flask的基础,是运行在flask run上的开发服务器,它管理端口等)
【解决方案2】:
URL='www......'
if 'docs.google.com' in URL and '&site=' not in URL:
    print(True)

正如 monsieuralfonse64 指出的那样,您需要语句的后半部分来防止绕过 previous 页面被列为包含 docs.google.com,但不包含其他站点。

这个答案是错误的。正如再次指出的那样,链接前面可以有任意数量的前缀,从microsoft.com/hello?x=docs.google.comstackoverflow.com/docs.google.com?name=helloyoutube.com/watch?v=docs.google.com 的任何前缀都将在我的方法中得到验证。

【讨论】:

  • 这可行,但唯一的问题是有人可能有一个像这样的狡猾的 URL:http://example.com?prev=docs.google.com&site=dodgysite.com 并且只要字符串“docs.google.com”在其中,它就会评估为真
  • 很好看!我引入了一项检查以防止这种情况发生
  • 也许如果 'docs.google.com' 在 URL 和...?
  • 这行得通!谢谢!:) 但我需要将 if 语句中的“和”更改为“或”
  • 您为什么希望它成为 or ?正如 monsieuralfonse64 所指出的那样,如果站点 http://example.com?prev=docs.google.com&site=dodgysite.com 是一个或(它确实有 docs.google.com ,但由于它有 &site= ,你仍然想排除它。
【解决方案3】:

试试这样的:

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

【讨论】:

  • 感谢您的解决方案! :) 你认为下面的@E-A 解决方案比你的更好吗? (我只是想知道哪种方案更安全)
  • @Upchanges E-A 的解决方案并不理想,因为它只检查“docs.google.com”是否在字符串中,并且它可能在该字符串中的任何位置。从中立的角度来看,我可能会说我的更安全,也是因为前缀评估。
  • 好的,谢谢!对此,我真的非常感激!我现在就试试你的代码:)
  • 我选择了我的解决方案,因为它更简单(单行 if 语句),但你是否检查它的开头是否有任何实际区别(我排除了 &site= 反正)?顺便说一句,您可能也应该在前缀列表中包含www
  • @E-A google docs URL 应该以 docs.google.com 开头,在任何时候都不能包含它。而www 不是前缀,它是一个子域,如果基域前面没有docs,则将使用该子域。所以www.google.com会被使用,而不是www.docs.google.com
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 2010-10-10
  • 1970-01-01
  • 2023-03-12
相关资源
最近更新 更多