在Google App Engine中,如何检查urlsafe创建的Key的输入有效性?

2023-12-05

假设我根据用户输入的网络安全网址创建一个密钥

key = ndb.Key(urlsafe=some_user_input)

我如何检查是否some_user_input已验证?

我当前的实验表明上面的语句会抛出ProtocolBufferDecodeError (Unable to merge from string.)例外,如果some_user_input无效,但无法从 API 中找到任何相关信息。有人可以确认这一点,并为我指出一些更好的方法来检查用户输入的有效性,而不是捕获异常吗?

多谢!


如果您尝试使用无效的 urlsafe 参数构造 Key

key = ndb.Key(urlsafe='bogus123')

你会得到一个类似的错误

Traceback (most recent call last):
  File "/opt/google/google_appengine/google/appengine/runtime/wsgi.py", line 240, in Handle
    handler = _config_handle.add_wsgi_middleware(self._LoadHandler())
  File "/opt/google/google_appengine/google/appengine/runtime/wsgi.py", line 299, in _LoadHandler
    handler, path, err = LoadObject(self._handler)
  File "/opt/google/google_appengine/google/appengine/runtime/wsgi.py", line 85, in LoadObject
    obj = __import__(path[0])
  File "/home/tim/git/project/main.py", line 10, in <module>
    from src.tim import handlers as handlers_
  File "/home/tim/git/project/src/tim/handlers.py", line 42, in <module>
    class ResetHandler(BaseHandler):
  File "/home/tim/git/project/src/tim/handlers.py", line 47, in ResetHandler
    key = ndb.Key(urlsafe='bogus123')
  File "/opt/google/google_appengine/google/appengine/ext/ndb/key.py", line 212, in __new__
    self.__reference = _ConstructReference(cls, **kwargs)
  File "/opt/google/google_appengine/google/appengine/ext/ndb/utils.py", line 142, in positional_wrapper
    return wrapped(*args, **kwds)
  File "/opt/google/google_appengine/google/appengine/ext/ndb/key.py", line 642, in _ConstructReference
    reference = _ReferenceFromSerialized(serialized)
  File "/opt/google/google_appengine/google/appengine/ext/ndb/key.py", line 773, in _ReferenceFromSerialized
    return entity_pb.Reference(serialized)
  File "/opt/google/google_appengine/google/appengine/datastore/entity_pb.py", line 1710, in __init__
    if contents is not None: self.MergeFromString(contents)
  File "/opt/google/google_appengine/google/net/proto/ProtocolBuffer.py", line 152, in MergeFromString
    self.MergePartialFromString(s)
  File "/opt/google/google_appengine/google/net/proto/ProtocolBuffer.py", line 168, in MergePartialFromString
    self.TryMerge(d)
  File "/opt/google/google_appengine/google/appengine/datastore/entity_pb.py", line 1839, in TryMerge
    d.skipData(tt)
  File "/opt/google/google_appengine/google/net/proto/ProtocolBuffer.py", line 677, in skipData
    raise ProtocolBufferDecodeError, "corrupted"
ProtocolBufferDecodeError: corrupted

这里有趣的是

File "/opt/google/google_appengine/google/appengine/ext/ndb/key.py", line 773, in _ReferenceFromSerialized
  return entity_pb.Reference(serialized)

这是最后执行的代码key.py模块:

def _ReferenceFromSerialized(serialized):
  """Construct a Reference from a serialized Reference."""
  if not isinstance(serialized, basestring):
    raise TypeError('serialized must be a string; received %r' % serialized)
  elif isinstance(serialized, unicode):
    serialized = serialized.encode('utf8')
  return entity_pb.Reference(serialized)

serialized这是解码后的 urlsafe 字符串,您可以在源代码链接中阅读更多相关信息。

另一个有趣的是最后一个:

File "/opt/google/google_appengine/google/appengine/datastore/entity_pb.py",   line 1839, in TryMerge

in the 实体_pb.py模块看起来像这样

  def TryMerge(self, d):
    while d.avail() > 0:
      tt = d.getVarInt32()
      if tt == 106:
        self.set_app(d.getPrefixedString())
        continue
      if tt == 114:
        length = d.getVarInt32()
        tmp = ProtocolBuffer.Decoder(d.buffer(), d.pos(), d.pos() + length)
        d.skip(length)
        self.mutable_path().TryMerge(tmp)
        continue
      if tt == 162:
        self.set_name_space(d.getPrefixedString())
        continue


      if (tt == 0): raise ProtocolBuffer.ProtocolBufferDecodeError
      d.skipData(tt)

这是实际尝试“将输入合并到键中”的地方。


您可以在源代码中看到,在从 urlsafe 参数构造 Key 的过程中,不会出现很多错误。首先它检查输入是否是string如果不是,则TypeError被提出,如果是但它不是“有效”,确实是ProtocolBufferDecodeError被提出。


我当前的实验表明,如果 some_user_input 无效,但无法从 API 中找到任何相关信息,则上面的语句将抛出 ProtocolBufferDecodeError (Unable to merge from string.) 异常。有人可以确认一下吗

有点确认了——我们现在知道也可以引发 TypeError。

并向我指出一些更好的方法来检查用户输入的有效性,而不是捕获异常?

这是检查有效性的好方法!如果应用程序引擎已经完成了这些检查,为什么还要自己检查呢?代码片段可能如下所示(不是工作代码,只是一个示例)

def get(self):
  # first, fetch the user_input from somewhere

  try:
    key = ndb.Key(urlsafe=user_input)
  except TypeError:
    return 'Sorry, only string is allowed as urlsafe input'
  except ProtocolBufferDecodeError:
    return 'Sorry, the urlsafe string seems to be invalid'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Google App Engine中,如何检查urlsafe创建的Key的输入有效性? 的相关文章

随机推荐

  • 在 Windows 上运行 Apache Hadoop 2.1.0

    我是 Hadoop 新手 在尝试在 Windows 7 计算机上运行它时遇到了问题 我特别感兴趣的是运行 Hadoop 2 1 0 作为其发行说明提到支持在 Windows 上运行 我知道我可以尝试使用 Cygwin 在 Windows 上
  • 使用 mechanize 和 Python 2.6 下载 HTML 的编码问题

    browser mechanize Browser page browser open url html page get data print html 它显示了一些奇怪的字符 我认为它是 UTF 8 字符串 但 Python 不知道这一
  • @ModelAttribute 和抽象类

    我知道也有过类似的问题 其中给出的例子过于零散且不清楚 我需要通过发送 POST 的页面上的表单来编辑实体 标准方法是控制器中使用带 ModelAttribute 的参数和验证器的方法 如果一种形式服务于抽象类的某个子类 则生成必要字段没有
  • 从 C# 中的未知类型进行转换

    我有一个对象 其中包含字符串中的值和字段中的原始类型 class myclass public string value public Type type myclass s new myclass s value 10 s type ty
  • MongoDB - 使用 update_many() 同时更新不同的数组

    首先 一些背景知识 我在 Python 中有一个函数 它查询外部 API 来检索与 ID 相关的一些信息 此类函数将 ID 作为参数 并返回数字列表 它们对应于与此类 ID 关联的某些元数据 例如 让我们在这样的函数中引入ID 0001 0
  • 如何找出 Haskell 中发生异常的行号?

    我是 haskell 的初学者 现在我正在努力解决负索引异常 但与其他通用语言不同的是 在我看来 haskell 没有显示发生异常的行号 是否可以知道发生异常的行号 现在基本上有两种好方法 随意洒HasCallStack通过您的代码进行约束
  • FCM 在使用 PHP 发送推送通知之前验证设备令牌 [重复]

    这个问题在这里已经有答案了 我的数据库中有 fcm 令牌 某些令牌用于发送推送通知 一切都按要求正常工作 但由于我得到了一些设备令牌 因此需要优化 string 116 multicast id 1234 success 0 failure
  • 使用 full_join 合并两个以上数据帧时的后缀

    我想使用嵌套的 full join 将多个数据帧合并在一起 此外 我希望能够向所有列添加后缀 以便在合并数据帧时 每个列名称指示它来自哪个数据帧 例如 像 T1 T2 这样的唯一时间标识符 x lt data frame i c a b c
  • TFS 被团队、区域、项目、区域、迭代所混淆

    我对 TFS 中的所有内容感到困惑 有人可以解释一下这一切是如何结合在一起的吗 团队项目集合 团队项目 Team Area 迭代 From 这一页 我认为一个 团队 项目集合可以包含多个 团队 项目 其中可以包含多个团队 是对的吗 项目可以
  • 如何检查二维向量中的所有元素是否为零?

    我在 Stack Overflow 上发现 这个语句可以用来判断向量的所有元素是否为零 但这仅适用于一维向量 bool zeros std all of v begin v end int i return i 0 我如何修改它以便它可以用
  • JS 事件:挂钩文本输入上的值更改事件

    我有一个文本输入 其内容是由脚本而不是用户更改的 所以我想在值发生变化时触发一个事件 我找不到合适的活动 我什至发现StackOverflow 上的这个 但这不是我正在寻找的解决方案 如何使用 jQuery 和文本输入来实现此功能 其中值设
  • 在 Google Play 上更新使用 PWA2APK 构建的 PWA 应用时出现问题

    我已经使用 PWA2APK 将 React 应用程序的第一个版本上传到 Google Play 效果很好 但每次我尝试通过上传新版本来更新应用程序时 都会收到以下信息 You uploaded an APK that is not sign
  • 多站点中的 ASP.NET 身份用户和角色 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我正在尝试在 ASP NET MVC 应用程序中创建权限系统 我一直在学习最新的身份框架 这是我的要求 A set of Hierarchical Roles for each
  • 如何在React Router v6中将函数传递给state

    当我单击其中一条路线的链接时 我想在两条路线之间共享状态 NewUser 我想要共享的状态和修改它的逻辑都保存在Users路线 我想传递将状态更改为的逻辑NewUsers route 当我将字符串传递给路由器中的状态对象时Link 我可以在
  • 如何在 Java 5 中使用 ExecutorService 实现任务优先级?

    我正在实现一个线程池机制 我想在其中执行不同优先级的任务 我想要一个很好的机制 通过该机制我可以向服务提交高优先级任务 并将其安排在其他任务之前 任务的优先级是任务本身的固有属性 无论我将该任务表达为Callable or a Runnab
  • Azure 文件存储活动是否可以触发 Azure WebJob 或 Azure Function?

    Azure 文件存储活动可以触发 Azure WebJob 或 Azure Function 吗 例如 在文件夹 todo 中创建文件时 目前 我们没有任何 Azure 文件绑定 但在我们的存储库中跟踪该功能时遇到问题 https gith
  • 无法使用 tidyr 中的 newivot_wider() 填充缺失值

    我对新事物感到疯狂tidyr pivot wider 具有缺失值特征的函数 有时有效 有时无效 这是一个可重现的示例 require tidyr df lt data frame color c green yellow nb c 1758
  • CudaAPIError:[1] 调用 cuLaunchKernel 会导致 Python 中的 CUDA_ERROR_INVALID_VALUE

    当我尝试使用 CUDA 在 Python 中运行此代码时遇到此错误 我正在遵循本教程 但我正在 Windows 7 x64 机器上尝试它 https www youtube com watch v jKV1m8APttU 事实上 我运行 c
  • 将 Excel 文件转换为 JSON 文件的最佳方法?

    我将数据保存在 Microsoft Excel 文件中 我需要将该数据转换为 Lambda 函数可以解析的内容 我认为最好的方法是将 Excel 文件转换为 JSON 文件 然后我的 Lambda 函数可以读取并解析它 最好的方法是什么 要
  • 在Google App Engine中,如何检查urlsafe创建的Key的输入有效性?

    假设我根据用户输入的网络安全网址创建一个密钥 key ndb Key urlsafe some user input 我如何检查是否some user input已验证 我当前的实验表明上面的语句会抛出ProtocolBufferDecod