V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
alexapollo
V2EX  ›  程序员

前端/终端和后端都要检验输入的合法性,开发工作量*2,是否有更简单的处理方法?

  •  
  •   alexapollo ·
    geekan · 2016-09-20 00:28:25 +08:00 · 9304 次点击
    这是一个创建于 3021 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前端要在输入错误时做实时提示(可能得有本地逻辑),后端要保证数据合法
    需求可能不同,但活确实是差不多的
    有没有比较好的方法来做这个事?

    50 条回复    2016-10-07 17:22:51 +08:00
    seki
        1
    seki  
       2016-09-20 00:34:26 +08:00
    用框架和模板
    linuxchild
        2
    linuxchild  
       2016-09-20 00:53:05 +08:00 via iPhone
    没有吧 后端不能相信前端传来的数据…
    sylecn
        3
    sylecn  
       2016-09-20 00:57:45 +08:00 via Android
    如果是浏览器客户端,前端必须支持编译到 JavaScript 才能在浏览器执行, 所以能够做到的语言不多。我知道的能在生产环境用的只有 JavaScript 和非常相关的替代比如 coffee script 和 typescript ,以及 clojurescript.

    如果前端是 app 或者桌面应用,可以前后端用同一种语言开发。这样就可以用共享库 /模块的方式 share 代码。只要把校验这部分代码分割出来成为独立模块就好。

    问问题的时候还是多给些上下文比较好。核心思路都是在前端和后端用同一种语言。当初 node.js 兴起的时候,这个是一大卖点。
    think2011
        4
    think2011  
       2016-09-20 01:04:23 +08:00
    后端传验证规则给前端。

    这是本来打算做的做法,后来因为某些原因搁浅了。
    EthanZ
        5
    EthanZ  
       2016-09-20 02:40:42 +08:00   ❤️ 12
    validations on FE are for stupid users,
    validations on BE are for malicious users.
    ChiangDi
        6
    ChiangDi  
       2016-09-20 07:06:27 +08:00 via Android
    都用 JavaScript
    hjc4869
        7
    hjc4869  
       2016-09-20 07:55:04 +08:00 via iPhone
    后端传一个正则和一个提示文本给前端。
    maxlvlvlv
        8
    maxlvlvlv  
       2016-09-20 07:55:42 +08:00 via iPad
    Middleware
    ersic
        9
    ersic  
       2016-09-20 08:01:31 +08:00   ❤️ 19
    我觉得前端验证是为了提高用户体验,后端验证是为了系统的安全性,功能性是不同的。
    huntererer
        10
    huntererer  
       2016-09-20 08:04:03 +08:00
    字数什么的验证可以放前端,用户体验好,但是"真正"的验证一定要放后端校验。
    ChefIsAwesome
        11
    ChefIsAwesome  
       2016-09-20 08:25:33 +08:00
    活差多了好吧。除了个正则一样,其他都不一样。
    int64ago
        12
    int64ago  
       2016-09-20 08:42:24 +08:00
    前后端都是 JS 的话,就共用一套实现就好了
    myweishanli
        13
    myweishanli  
       2016-09-20 08:43:31 +08:00
    可以参考 yii2 后端配置好规则,前端自动生成对应的验证代码,后端也是根据规则验证。
    sundev
        14
    sundev  
       2016-09-20 08:54:58 +08:00
    这的确是个问题,因为随着前端规模的增大,验证已经不局限于一个正则了,而是复杂的逻辑,那么必然导致前端后端出现重复的逻辑。我做的一个项目也出现这个问题,正在寻找方法。
    我们目前的做法是简单验证由自定义好的规则,后端前端自动生成部分验证逻辑,但是碰到复杂逻辑是后端前端各写一份代码。
    sunjourney
        15
    sunjourney  
       2016-09-20 08:56:01 +08:00   ❤️ 1
    前端验证只是保证用户体验的,想省功夫就用 ajax 后端实时验证咯
    lwbjing
        16
    lwbjing  
       2016-09-20 09:31:10 +08:00
    那就,,前端就不要做了,后端去提示,,哈哈。。
    4641585
        17
    4641585  
       2016-09-20 09:32:52 +08:00
    这是谈到 Node.js 有什么优势时的一个典型场景。
    cosgbgas
        18
    cosgbgas  
       2016-09-20 09:38:48 +08:00
    这的确是个问题。
    7sDream
        19
    7sDream  
       2016-09-20 09:42:48 +08:00   ❤️ 1
    貌似用 Django + django-angular 可以做到写一遍验证,前后端通用。

    还有我之前准备报名 GSoC 的时候写的一个 proposal ,是准备给 Django 增加通用的客户端验证组件:

    https://gist.github.com/7sDream/46de98da073b9021c5d0

    发到 Google Group 之后貌似大家也挺支持的。

    但是准备报名的时候我家出了点事,然后 proposal 就没写完……

    后来我补完了,但是也没机会参加了 =,=

    不过思路应该还可以?
    qhxin
        20
    qhxin  
       2016-09-20 10:04:54 +08:00
    除非打造可信前端、终端、信道。然而这样成本比做两次验证还大。而且现有环境下前端验证和后端验证的性质是不一样的,不能混为一谈。
    Karblue
        21
    Karblue  
       2016-09-20 10:08:44 +08:00
    又想用户体验好。又想省事。让我和为难啊(:doge
    zikkeung
        22
    zikkeung  
       2016-09-20 10:13:18 +08:00
    typescript 可破
    guyskk
        23
    guyskk  
       2016-09-20 10:28:44 +08:00 via Android
    校验规则理论上是可以前后端通用的,但 JS 版还没实现。根据后端 API 自动生成 JS 代码,发出请求之前自动校验数据,不通过就直接生成一个 400 响应。
    https://github.com/guyskk/validater
    有打算实现 JS 版的联系我吧,有问题也可以提 issue 。
    baby4free
        24
    baby4free  
       2016-09-20 10:32:11 +08:00
    理论上是可以后端校验就行了 跟前端约定好错误码及错误消息体 前端可以根据返回的错误做对应的展示
    不过为了用户体验 前端还是做一下比较好
    BruceLi
        25
    BruceLi  
       2016-09-20 10:34:55 +08:00
    都要验证,不过前端是为了提升用户体验,后端是为了业务逻辑的完整和数据安全,侧重点不同,验证的方法也不完全一样,如果前后端可以分享代码,把验证的逻辑单独变成一个库应该能节省一些人力和时间。
    tobeyouth
        26
    tobeyouth  
       2016-09-20 13:35:45 +08:00
    可以把校验写成 schema,前后端引用同一份 schema 文件,然后各自进行校验

    http://json-schema.org/
    wizardforcel
        27
    wizardforcel  
       2016-09-20 13:38:56 +08:00
    找不同的人做,让人手 *2 。
    sampeng
        28
    sampeng  
       2016-09-20 17:58:26 +08:00
    这本来就是一个体力活。。。
    tanszhe
        29
    tanszhe  
       2016-09-20 18:06:22 +08:00
    一个小插件 http://www.yxsss.com/g/ 在表单原生加入 req exp ts 这 3 个属性就好了
    req="true"
    exp ="正则表达式"
    ts ="文案"
    vghdjgh
        30
    vghdjgh  
       2016-09-20 18:16:56 +08:00
    楼上说的 json schema 是一个方式
    不过只能验证是不是合法,前端体验不一定满足需求,所以常用于后台系统。
    wxhm1120
        31
    wxhm1120  
       2016-09-20 18:41:48 +08:00
    再招个人-。-
    Nitroethane
        32
    Nitroethane  
       2016-09-20 19:20:24 +08:00
    话说这种事不是应该安全部门的人负责么 0.0
    ibufu
        33
    ibufu  
       2016-09-20 19:46:16 +08:00
    前端别做了吧,反正后端会抛个错误过来
    oyjc
        34
    oyjc  
       2016-09-20 19:46:40 +08:00
    服务端: C# (.net
    浏览器: C# 使用 Bridge.net 编译到 Javascript

    ** 在不久的未来:
    服务端: C#
    浏览器: C# 编译到 Webassembly ,直接操作浏览器 DOM 等 Javascript 能访问到的 API.
    chemzqm
        35
    chemzqm  
       2016-09-20 21:28:51 +08:00
    godmin railsadmin 只要在 model 层加上验证就可以了,谁用谁知道😀
    alexapollo
        36
    alexapollo  
    OP
       2016-09-20 21:49:06 +08:00
    @seki 什么框架和模板能比较好解决这个问题呢
    @sylecn 可行,但 JS 感觉还是略 evil ,我倒是愿意用 scala 做前后端统一的语言 LOL
    @think2011 有理,但感觉写起来会不会比纯前端逻辑复杂得多?毕竟约束规则没法很简单的描述,除非校验的地方很通用,一开始都想得清楚才行
    @ersic 但始终都增加了 100%工作量
    @7sDream 写的真多啊,不错的活,不过 django-angular 好使吗。。绑定到某个前端框架特别费劲。。
    7sDream
        37
    7sDream  
       2016-09-20 21:58:48 +08:00
    @alexapollo 我自己并没有用过 不过 Google Group 上的人回复我说这个写的不错。有个 form validation 的 Demo : http://django-angular.awesto.com/form_validation/
    WalkingEraser
        38
    WalkingEraser  
       2016-09-20 22:46:51 +08:00 via Android
    自己写个 parser 处理,/滑稽
    FrankFang128
        39
    FrankFang128  
       2016-09-20 22:49:42 +08:00
    你们搞前后分离的,终于发现这个问题了?
    guyskk
        40
    guyskk  
       2016-09-21 00:08:32 +08:00 via Android
    @FrankFang128
    没分离就不用校验吗,校验都放在服务端了而已,
    分离后也可以只服务端校验。
    Felldeadbird
        41
    Felldeadbird  
       2016-09-21 00:23:15 +08:00
    我的做法是,后端返回 JSON ,包含必要的信息。然后前端做提示就行了 :) 。绝对够懒。
    qiyuey
        42
    qiyuey  
       2016-09-21 00:50:11 +08:00 via Android
    controller 层需要验证一遍, service 层需要验证一遍,怎么破?
    bdbai
        43
    bdbai  
       2016-09-21 00:57:29 +08:00 via Android
    @FrankFang128 后端怎么实时校验?
    zongren
        44
    zongren  
       2016-09-21 10:36:38 +08:00
    规则当然只制定一遍
    而且可以用后端生成 js 代码
    mysterin
        45
    mysterin  
       2016-09-21 10:40:52 +08:00
    前端:不要相信客户输入的数据
    后端:不要相信前端传送的数据
    引申:
    moyang
        46
    moyang  
       2016-09-21 10:43:19 +08:00
    Node.js 后端,一个 lib 两边用 :P
    FrankFang128
        47
    FrankFang128  
       2016-09-21 11:03:54 +08:00 via Android
    @guyskk 我说的是同一个逻辑 前后都要写 这个问题
    xiongbiao
        48
    xiongbiao  
       2016-09-21 12:14:02 +08:00
    共用一套 json schema 嘛
    srx1982
        49
    srx1982  
       2016-09-21 22:31:56 +08:00
    @ersic 同感
    mingyun
        50
    mingyun  
       2016-10-07 17:22:51 +08:00
    @tobeyouth 这个还没用过呢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2383 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:02 · PVG 00:02 · LAX 08:02 · JFK 11:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.