前端/终端和后端都要检验输入的合法性,开发工作量*2,是否有更简单的处理方法? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
alexapollo
V2EX    程序员

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

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

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

    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     Solana     3142 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 12:22 PVG 20:22 LAX 05:22 JFK 08:22
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86