当前位置: 首页 > 科技观察

不好说,Jpa的功能差点让我丢了饭碗

时间:2023-03-12 20:02:17 科技观察

故事背景前段时间有朋友在微信上问我删除的数据能不能恢复。问了原因,居然是一个配置项引起的。.故事的细节是在SpringBoot中使用jpa操作数据库,jpa就不详细介绍了。相信大家都知道或者用过。jpa中有一个配置项,可以让程序在启动的时候自动初始化表结构或者更新表结构。听起来不错,也很实用。事实上,这是一个非常危险的功能。我个人认为不应该提供这个功能。只要有洞,就可能有问题。这个配置是:spring.jpa.hibernate.ddl-autocreate(风险系数2星)应用启动时,如果数据库中没有对应的表,会自动根据实体类的结构创建表结构.如果表已经存在,表中的数据将被清除。create-drop(危险因素3星)应用程序启动时,如果数据库中没有对应的表,会自动按照实体类的结构创建表结构。如果表已经存在,表中的数据将被清除。当程序停止时,数据库中的所有表将被删除。update(风险系数1星)应用程序启动时,如果数据库中没有对应的表,会根据实体类的结构自动创建一个表结构。如果表已经存在,则判断是否有新字段或修改长度。如果是这样,表结构将被更新而不影响数据。validate(riskfactor0stars)validate不会更新和删除表或数据,只会做验证逻辑。无(风险因素为0星)禁用ddl操作。如何防范这类问题,归根结底是技术负责人不重视网络安全问题。主要有以下几点:数据不备份在线数据必须备份,备份必须放在不同的机器上,以降低风险值。数据库账号权限细分,不给删除权限,如果公司有DBA,业务的逻辑删除可能会更好,数据库相关的安全也会受到严格控制。如果没有DBA,基本都是自己开发管理,技术leader来做。普通开发者可以只给只读账号,偶尔上网查资料。另外,你需要有一个读写账户才能在程序中使用。比如删除、DDL等操作,应该只为管理员账号保留,否则容易发生意外。应用中的framework有DDL操作的功能,禁止使用这个问题。除了开发者粗心之外,最重要的是框架自带了DDL功能。像这样的功能应该被禁止。所有的表结构在上线前都要确认。最好手动完成。像DDL这样的操作会锁表,最好在非高峰期进行。交给程序自动去做是不靠谱的。记得之前我们代码里也有自动建表的逻辑,在codereview的时候被指出来,然后去掉了。虽然说使用起来更方便,但是增加了在线数据库的风险。在一些开源框架中也有类似的逻辑,当表不存在时会自动为你创建好表。