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

Web 表单名设计的安全问题

  •  
  •   v2Geeker · 2015-04-20 11:46:38 +08:00 · 3853 次点击
    这是一个创建于 3505 天前的主题,其中的信息可能已经有所发展或是发生改变。

    嗨,大家好。

    今天我开始要接手一个新的安全性较高的项目了,目前在进行到设计表单的阶段上遇到了一些以前不曾细想的安全问题,那就是如何设计表单名。

    问题如下:

    1、 如果表单设计如下,name属性为“user_name”,那么这样不是给别人猜到了数据库的设计了吗?

    <input type="text" name="user_name" />
    
    <input type="password" name="user_pswd" />
    

    2、 设计如下表单,这种表单名在后端比较容易使用处理,直接$_POST['user']即可得到所有的相关值。那么相对于 1 中的表单名,下面的表单名会不会有什么隐患呢?

    <input type="text" name="user[user_name]" />
    
    <input type="password" name="user[user_pswd]" />
    

    3、 设计表单名的时候,不直接对应到数据库字段名,然后表单提交到后端时,在映射回对应的数据库字段名,这样做需要写许多获取表单值的代码了。

    <input type="text" name="user[nick_name]" />
    
    <input type="password" name="user[a_password]" />
    

    以上,综合安全性和开发效率,选择哪种好?或者还有其它方式?

    各位帮忙看看,谢谢~

    13 条回复    2015-04-20 21:37:27 +08:00
    jarlyyn
        1
    jarlyyn  
       2015-04-20 11:50:36 +08:00   ❤️ 1
    1.为啥要直接用字段名作为inputname,不是很能理解。
    2.为啥字段名被暴露后就没这么安全了?drupal/wp之类的表结构不是固定的么,难道也不安全了?
    3.你自己写个类不就能解决这个问题了么……
    oott123
        2
    oott123  
       2015-04-20 12:05:10 +08:00 via Android   ❤️ 1
    我觉得随你便…
    做好过滤就行了。
    你不会告诉我说你直接把整个 POST 进来的数组就那么插入数据库了吧?
    littlehz
        3
    littlehz  
       2015-04-20 12:21:05 +08:00   ❤️ 1
    1、input name 和数据库字段名是否一致,无所谓
    2、任何命名方式,外部传入的数据都是要做处理、过滤,intval、trim,判断 >= <=,长度等等,身份证、手机号、座机号、QQ号至少需要格式验证。
    3、需要入库的数据另外在程序里拼数组,通过PDO的prepare execute做SQL安全转义。
    4、看你的想法是打算把 $_POST 或者 $_POST['user'] 直接丢数据库,算了吧。
    5、即使用$_POST['user']能得到全部的数据,一样需要$_POST['user']['user_name']一条一条在程序里检查输入
    loading
        4
    loading  
       2015-04-20 12:33:21 +08:00 via iPhone   ❤️ 1
    您不会是后台直接拼sql吧?因为只有这样你的所谓便利才体现出来。

    听说过sql注入吗?

    如果你防了注入,你应该不会问这样的问题。
    v2Geeker
        5
    v2Geeker  
    OP
       2015-04-20 13:12:24 +08:00
    @jarlyyn
    @littlehz
    @loading
    @oott123

    好的,谢谢大家的回答~

    肯定知道怎样处理SQL注入和安全防范啦。

    还有一个就是,让别人知道数据表的字段设计感觉不是特别安全......
    lichao
        6
    lichao  
       2015-04-20 13:23:59 +08:00
    1 猜到数据库设计又能如何?很多开源项目,数据库设计不都是公开的吗?

    2 最好在 $_POST['user'] 后加个白名单过滤,因为别人可以随意修改你的表单,
    参照 Rails 的 params.require(:user).permit(:username, :user_pswd)

    3 又回到问题 1 了,设计的目标是别人知道数据库结构,你也应该能保证安全
    lujiajing1126
        7
    lujiajing1126  
       2015-04-20 13:53:56 +08:00
    一般都是和后台字段名公用的吧,写起来简单粗暴

    数据库这个。你只要不被人注入,他知道又能怎么样。。

    参考simple_form这个gem包。。
    tabris17
        8
    tabris17  
       2015-04-20 13:54:21 +08:00
    猜到数据库字段名字又怎样。如果程序安全人家也不能拿你咋地,如果程序不安全,人家不知道字段名也一样能爆库
    wind4
        9
    wind4  
       2015-04-20 14:14:54 +08:00
    你需要表前缀、字段前缀、各种前缀
    php230
        10
    php230  
       2015-04-20 15:50:49 +08:00
    不用数据库字段名是对的,至于使用什么规则命名,觉得什么方便用什么就OK
    pany
        11
    pany  
       2015-04-20 17:06:39 +08:00
    sql语句预编译吧
    Felldeadbird
        12
    Felldeadbird  
       2015-04-20 17:18:47 +08:00
    人家要暴库,你是的手段是只能防君子,不防小人。后端做好过滤处理,就行了。话说随着技术的发展,现在SQL注入都是以老旧程序为主,而XSS更容易被人忽略。看看乌云上各大公司的,更多漏洞出现在XSS、逻辑错误上。
    yakczh
        13
    yakczh  
       2015-04-20 21:37:27 +08:00
    表单名字用 A...z 后端建立个map,接受参数转换一下,这样就不怕猜到表名了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2836 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 14:29 · PVG 22:29 · LAX 06:29 · JFK 09:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.