如何保护/过滤HTML表单和输入文件一起提交?

如何保护/过滤HTML表单和输入文件一起提交?,html,forms,input,Html,Forms,Input,我有一个包含2个输入的表单: 使用input type=“file”从手机摄像头获取的文件 短码(6个字符的一次性过期密码) 要求是1)验证短代码是否有效,2)如果有效,则继续接收文件 目前,在我的实现中,如果短代码无效,服务器仍会接收文件,将其编码为base64,将其作为隐藏表单字段返回给客户端,并添加错误消息 我不想将文件临时保存在服务器上,因为它(尚未)授权。我将该文件编码为base64,以便用户不必再次重复拍摄另一张照片的过程。他/她只需要重新键入短代码(希望这次是正确的)。也 问题:有

我有一个包含2个输入的表单:

  • 使用input type=“file”从手机摄像头获取的文件

  • 短码(6个字符的一次性过期密码)

  • 要求是1)验证短代码是否有效,2)如果有效,则继续接收文件

    目前,在我的实现中,如果短代码无效,服务器仍会接收文件,将其编码为base64,将其作为隐藏表单字段返回给客户端,并添加错误消息

    我不想将文件临时保存在服务器上,因为它(尚未)授权。我将该文件编码为base64,以便用户不必再次重复拍摄另一张照片的过程。他/她只需要重新键入短代码(希望这次是正确的)。也

    问题:有什么更好的替代方案,例如:

  • 如果快捷码无效,我不必接收图像输入(出于安全原因和节省带宽)
  • 如果快捷码无效,用户不必重新捕获图像

  • 将图像保存在服务器上,给它一个id,只需将id发送回隐藏字段中的用户即可。服务器不需要在服务器和客户机之间来回发送整个映像,而只需保留映像,并为客户机提供一些稍后可以引用的内容

    注意事项如下:

    • id必须完全随机且不可用,否则客户端可能会欺骗服务器使用另一个用户的映像
    • 或者,如果你能以某种方式将上传与用户关联起来,那么也可以(会话数据等)
    • 由于用户可能会在任何时候放弃该进程,您的服务器现在可能在磁盘上有一个映像,任何人都不会使用该映像;您需要设置某种垃圾收集,定期删除任何废弃的上传文件

    将图像保存在服务器上,给它一个id,只需将id发送回隐藏字段中的用户即可。服务器不需要在服务器和客户机之间来回发送整个映像,而只需保留映像,并为客户机提供一些稍后可以引用的内容

    注意事项如下:

    • id必须完全随机且不可用,否则客户端可能会欺骗服务器使用另一个用户的映像
    • 或者,如果你能以某种方式将上传与用户关联起来,那么也可以(会话数据等)
    • 由于用户可能会在任何时候放弃该进程,您的服务器现在可能在磁盘上有一个映像,任何人都不会使用该映像;您需要设置某种垃圾收集,定期删除任何废弃的上传文件

    如果密码不正确,为什么还要将文件发送到服务器

    您可以使用密码对服务器进行javascript ajax调用,以检查密码是否有效。如果有效,那么来自ajax调用的回调可以提交包含输入type=“file”的表单

    上传未经授权用户的文件有潜在的危险——至少是对带宽的浪费

    已添加

    不用说,您必须在服务器端验证所有内容,而不仅仅是在客户端

    A.您可以在发送文件的表单中再次包含密码

    B.您的ajax请求可以使服务器端打开会话cookie并
    记住您已验证(只要会话打开)。然后,当您提交带有文件的表单时,服务器端验证只需检查您的会话。

    如果密码不正确,为什么还要将文件发送到服务器

    您可以使用密码对服务器进行javascript ajax调用,以检查密码是否有效。如果有效,那么来自ajax调用的回调可以提交包含输入type=“file”的表单

    上传未经授权用户的文件有潜在的危险——至少是对带宽的浪费

    已添加

    不用说,您必须在服务器端验证所有内容,而不仅仅是在客户端

    A.您可以在发送文件的表单中再次包含密码

    B.您的ajax请求可以使服务器端打开会话cookie并
    记住您已验证(只要会话打开)。然后,当您提交表单和文件时,服务器端验证只需检查您的会话。

    您有什么问题?您有什么问题?AJAX确实是一个解决方案,但如果有其他不需要它的更简单的替代方案,我不想要它。另外,你的建议,关于我如何理解它容易被黑客攻击,因为在回调之后调用的第二个表单submit很容易被hi-jacked.hi@Dynameyes。这两种情况我都不同意。非ajax方式要求您将带宽、cpu和磁盘空间浪费在可能最终与任何用户都没有关联的文件上(不仅仅是图像,因为有人可以使用它以RESTfull方式向您发送文件)。对于第二部分,您当然可以添加服务器接收到的令牌,或者只需将密码与文件一起发送。。。没有劫持或黑客攻击,因为验证发生在服务器端(不仅仅是通过html/js)Hi@oogi,当然你的建议可以奏效,但我发现(IMO)对于一个简单的请求来说很复杂。我正在寻找一个更优雅的解决方案。比如说,我是否可以将HTTP头用于短代码(即,如果在接收HTTP正文或内容之前读取/处理了头)?或者发出一个403,但不知何故,客户端可以在不丢失输入文件的情况下优雅地恢复。AJAX确实是一个解决方案,但如果有其他不需要它的更简单的替代方案,我不想要它。还有,你的建议,关于我如何理解