电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

java安全編碼指南之:Mutability可變性詳解

瀏覽:2日期:2022-08-24 17:39:27

簡介

mutable(可變)和immutable(不可變)對象是我們在java程序編寫的過程中經常會使用到的。

可變類型對象就是說,對象在創建之后,其內部的數據可能會被修改。所以它的安全性沒有保證。

而不可變類型對象就是說,對象一旦創建之后,其內部的數據就不能夠被修改,我們可以完全相信這個對象。

雖然mutable對象安全性不夠,但是因為其可以被修改,所以會有效的減少對該對象的拷貝。

而immutable對象因為不可改變,所以嘗試對該對象的修改都會導致對象的拷貝,從而生成新的對象。

我們最常使用的String就是一個immutable對象。

那么可變性在java的安全編碼中的最佳實踐是怎么樣的呢? 一起來看看吧。

可變對象和不可變對象

知道了可變對象和不可變對象的不同之處之后,我們看一下怎么才能判斷這個對象是可變對象還是不可變對象呢?

首先,最簡單的一點就是,不可變對象創建之后就不能夠被修改,所以不可變對象里面基本上沒有setXXX之類的方法,而可變對象提供了setXXX這些可以修改內部變量狀態的方法。

看一個例子java.util.Date是一個可變對象,而java.time.LocalTime是不可變對象。

看下他們的方法定義有什么區別呢?

java安全編碼指南之:Mutability可變性詳解

首先是Date,我們可以看到在其中定義了很多setXXX方法。

java安全編碼指南之:Mutability可變性詳解

而在LocalTime中,我們基本上看不到setXXX方法。

同時不可變對象的字段基本上都是final的,防止被二次修改。

第二,不可變對象一般來說是不可繼承的,在java中就是以final關鍵字做限定的:

public class Date

public final class LocalTime

第三,不可變對象一般會隱藏構造函數,而是使用類似工廠模式的方法來創建對象,這樣為實例的創建提供了更多的機動性。

創建mutable對象的拷貝

那么如果我們想使用mutable對象,又不想被別人修改怎么辦呢?

簡單的辦法就是拷貝一份要使用的對象:

public class CopyOutput { private final java.util.Date date; ... public java.util.Date getDate() {return (java.util.Date)date.clone(); } }

這里大家還要注意深拷貝和淺拷貝的問題。

為mutable類創建copy方法

既然要為mutable對象創建拷貝,那么相應的mutable類也需要提供一個copy方法來協助拷貝。

這里需要考慮一個深拷貝和淺拷貝的問題。

不要相信equals

我們知道在HashMap中怎么去查找一個key呢?先去找這個key的hash值,然后去判斷key.equals方法是否相等,考慮下面這種情況:

private final Map<Window,Extra> extras = new HashMap<>(); public void op(Window window) { Extra extra = extras.get(window); }

op方法接收一個Window對象,然后將其當成key從HashMap中取出對應的value。

如果,這個時候,我們有一個類A繼承了Window,并且hash值和equals都和另外一個Window對象B相同,那么使用A這個key可以獲取到B這個key存儲的數據!

怎么解決這個問題呢?

Java中有一個特別的HashMap:IdentityHashMap,這個Map的key和value比較是用==而不是equals方法,所以可以有效的避免上面出現的問題。

private final Map<Window,Extra> extras = new IdentityHashMap<>(); public void op(Window window) { Extra extra = extras.get(window); }

如果沒有這樣的Map可用,那么可以使用不可變對象作為key或者使用Window的私有變量,從而惡意攻擊者無法獲得這個變量。

public class Window { /* pp */ class PrivateKey {Window getWindow() { return Window.this;} } final PrivateKey privateKey = new PrivateKey(); private final Map<Window.PrivateKey,Extra> extras = new WeakHashMap<>(); ... } public class WindowOps { public void op(Window window) {// Window.equals may be overridden,// but safe as we don’t use it.Extra extra = extras.get(window.privateKey);... } }

不要直接暴露可修改的屬性

如果一個可變類中的某個屬性確實需要暴露被外部使用,那么一定要將這個屬性定義為private,并且使用wrapper方法將其包裝起來。

如果直接暴露出去,那么基本上就沒有權限控制可言,任何程序只要能夠拿到你這個對象,就可以對屬性進行修改。考慮下下面的應用方式,我們在修改state的方法中加入了一個參數校驗和權限控制。

public final class WrappedState { // private immutable object private String state; // wrapper method public String getState() {return state; } // wrapper method public void setState(final String newState) {this.state = requireValidation(newState); } private static String requireValidation(final String state) {if (...) { throw new IllegalArgumentException('...');}return state; } }

public static fields應該被置位final

同樣的,如果你是一個類變量,當然不希望這個變量會被任何人修改,那么需要將其置位final。

public class Files { public static final String separator = '/'; public static final String pathSeparator = ':'; }

public static final field 應該是不可變的

如果類變量是public static final的,那么這個變量一定要是不可變的。

有人會問了,都定義成了final了,是不是就已經不可變了?

其實不然,比如我們定義了一個final的List,雖然這個list不能變化,但是list里面的值是可以變化的。我們需要將可變變量修改為不可變變量,如下所示:

import static java.util.Arrays.asList; import static java.util.Collections.unmodifiableList; ... public static final List<String> names = unmodifiableList(asList( 'Fred', 'Jim', 'Sheila' ));

如果使用JDK9中引入的of()或者ofEntries()方法,可以直接創建不可修改的集合:

public static final List<String> names = List.of('Fred', 'Jim', 'Sheila');

以上這篇java安全編碼指南之:Mutability可變性詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 马尔表面粗糙度仪-MAHR-T500Hommel-Mitutoyo粗糙度仪-笃挚仪器 | 废旧物资回收公司_广州废旧设备回收_报废设备物资回收-益美工厂设备回收公司 | 丝杆升降机-不锈钢丝杆升降机-非标定制丝杆升降机厂家-山东鑫光减速机有限公司 | 帽子厂家_帽子工厂_帽子定做_义乌帽厂_帽厂_制帽厂 | 物联网卡_物联网卡购买平台_移动物联网卡办理_移动联通电信流量卡通信模组采购平台? | 烘干设备-热泵烘干机_广东雄贵能源设备有限公司 | 盐水蒸发器,水洗盐设备,冷凝结晶切片机,转鼓切片机,絮凝剂加药系统-无锡瑞司恩机械有限公司 | 南京种植牙医院【官方挂号】_南京治疗种植牙医院那个好_南京看种植牙哪里好_南京茀莱堡口腔医院 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 | 佛山商标注册_商标注册代理|专利注册申请_商标注册公司_鸿邦知识产权 | 碳纤维布-植筋胶-灌缝胶-固特嘉加固材料公司 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | 免费分销系统 — 分销商城系统_分销小程序开发 -【微商来】 | 档案密集架,移动密集架,手摇式密集架,吉林档案密集架-厂家直销★价格公道★质量保证 | 低温柔性试验仪-土工布淤堵-沥青车辙试验仪-莱博特(天津)试验机有限公司 | 脉冲除尘器,除尘器厂家-淄博机械 | 河南道路标志牌_交通路标牌_交通标志牌厂家-郑州路畅交通 | 手表腕表维修保养鉴定售后服务中心网点 - 名表维修保养 | 药品冷藏箱厂家_低温冰箱_洁净工作台-济南欧莱博电子商务有限公司官网 | 重庆LED显示屏_显示屏安装公司_重庆LED显示屏批发-彩光科技公司 重庆钣金加工厂家首页-专业定做监控电视墙_操作台 | 工业废水处理|污水处理厂|废水治理设备工程技术公司-苏州瑞美迪 今日娱乐圈——影视剧集_八卦娱乐_明星八卦_最新娱乐八卦新闻 | 上海租奔驰_上海租商务车_上海租车网-矢昂汽车服务公司 | 铝单板_铝窗花_铝单板厂家_氟碳包柱铝单板批发价格-佛山科阳金属 | 环氧乙烷灭菌器_压力蒸汽灭菌器_低温等离子过氧化氢灭菌器 _低温蒸汽甲醛灭菌器_清洗工作站_医用干燥柜_灭菌耗材-环氧乙烷灭菌器_脉动真空压力蒸汽灭菌器_低温等离子灭菌设备_河南省三强医疗器械有限责任公司 | 消泡剂-水处理消泡剂-涂料消泡剂-切削液消泡剂价格-东莞德丰消泡剂厂家 | 根系分析仪,大米外观品质检测仪,考种仪,藻类鉴定计数仪,叶面积仪,菌落计数仪,抑菌圈测量仪,抗生素效价测定仪,植物表型仪,冠层分析仪-杭州万深检测仪器网 | 软文发布平台 - 云软媒网络软文直编发布营销推广平台 | 湖南专升本-湖南省专升本报名-湖南统招专升本考试网 | 设定时间记录电子秤-自动累计储存电子秤-昆山巨天仪器设备有限公司 | 深圳希玛林顺潮眼科医院(官网)│深圳眼科医院│医保定点│香港希玛林顺潮眼科中心连锁品牌 | 磁力抛光机_磁力研磨机_磁力去毛刺机_精密五金零件抛光设备厂家-冠古科技 | 在线钠离子分析仪-硅酸根离子浓度测定仪-油液水分测定仪价格-北京时代新维测控设备有限公司 | 螺杆式冷水机-低温冷水机厂家-冷冻机-风冷式-水冷式冷水机-上海祝松机械有限公司 | 帽子厂家_帽子工厂_帽子定做_义乌帽厂_帽厂_制帽厂_帽子厂_浙江高普制帽厂 | 传动滚筒,改向滚筒-淄博建凯机械科技有限公司 | 上海赞永| IWIS链条代理-ALPS耦合透镜-硅烷预处理剂-上海顶楚电子有限公司 lcd条形屏-液晶长条屏-户外广告屏-条形智能显示屏-深圳市条形智能电子有限公司 | 电销卡_北京电销卡_包月电话卡-豪付网络| 超声波分散机-均质机-萃取仪-超声波涂料分散设备-杭州精浩 | 干洗店加盟_洗衣店加盟_干洗店设备-伊蔻干洗「武汉总部」 | 合肥网带炉_安徽箱式炉_钟罩炉-合肥品炙装备科技有限公司 | 曙光腾达官网-天津脚手架租赁-木板架出租-移动门式脚手架租赁「免费搭设」 |