首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  程序员

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

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

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

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

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

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

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

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



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

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

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

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

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

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