沙箱Java代碼

在上一篇文章中,我們研究了如何保護移動Java代碼 。 這樣做的一種選擇是在籠子或沙箱中運行代碼。

這篇文章探討了如何為Java應用程序設置這樣的沙箱。

安全經理

Java中支持沙箱的安全性設施是java.lang.SecurityManager

默認情況下,Java在沒有SecurityManager情況下運行,因此您應在應用程序中添加代碼以啟用以下代碼:

System.setSecurityManager(new SecurityManager());

您可以使用標準的SecurityManager或后代。

SecurityManager有許多checkXXX()方法,這些方法都轉發給checkPermission(permission, context) 。 此方法要求AccessController進行實際工作(請參見下文)。

[ checkXXX()方法是Java 1.1的遺物 。]

如果允許請求的訪問,則checkPermission()安靜地返回。 如果被拒絕,則拋出java.lang.SecurityException

實現沙箱的代碼應在執行敏感操作之前調用checkXXX方法:

SecurityManager securityManager = System.getSecurityManager();
if (securityManager != null) {Permission permission = ...;securityManager.checkPermission(permission);
}

JRE包含許多地方的代碼。

權限

權限表示對系統資源的訪問。

為了允許這種訪問,必須向嘗試訪問的代碼顯式授予相應的許可(請參見下文)。

權限源自java.security.Permission 。 它們有一個名稱和一個可選的操作列表(以逗號分隔的字符串值形式)。

Java附帶了許多預定義的權限,例如FilePermission 。 您還可以添加自己的權限 。

以下是read文件/home/remon/thesis.pdf的權限:

Permission readPermission = new java.io.FilePermission('/home/remon/thesis.pdf', 'read');

您可以通過授予代碼權限AllPermission來執行任何事情。 這與不使用SecurityManager運行它具有相同的效果。

政策規定

使用策略 授予權限。 策略負責確定代碼是否有權執行安全敏感的操作。

AccessController查閱Policy以查看是否授予了Permission

在任何給定時間只能使用一個Policy對象。 應用程序代碼可以將Policy子類化以提供自定義實現 。

Policy的默認實現使用配置文件加載授權。 有一個系統范圍的策略文件和一個(可選)用戶策略文件 。

您可以使用PolicyTool程序創建其他策略配置文件。 每個配置文件都必須使用UTF-8編碼。

默認情況下,根本不授予代碼任何權限。 每個grant語句都會添加一些權限。 授予的權限無法撤消。

以下策略片斷授予代碼,從起源/home/remon/code/目錄read權限的文件/home/remon/thesis.pdf

grant codeBase 'file:/home/remon/code/-' {permission java.io.FilePermission '/home/remon/thesis.pdf','read';
};

請注意, codeBase的部分是URL ,因此,即使在Windows系統上,也應始終使用正斜杠。

帶尾隨/ codeBase匹配指定目錄中的所有類文件(不是JAR文件)。 帶有尾隨/* codeBase匹配該目錄中包含的所有文件(類和JAR文件)。 帶有尾隨/- codeBase匹配目錄中的所有文件(類和JAR文件),并遞歸匹配該目錄中包含的子目錄中的所有文件。

對于Windows系統上文件權限中的路徑,您需要使用雙反斜杠( \\ ),因為\是轉義字符:

grant codeBase 'file:/C:/Users/remon/code/-' {permission java.io.FilePermission'C:\\Users\\remon\\thesis.pdf', 'read';
};

為了獲得更大的靈活性,您可以編寫帶有可變部分的贈款。 我們已經看到了codeBase通配符。 您也可以替換系統屬性 :

grant codeBase 'file:/${user.home}/code/-' {permission java.io.FilePermission'${user.home}${/}thesis.pdf', 'read';
};

注意
${/}替換為系統的路徑分隔符。 無需在 codeBase ,因為這是一個URL。

簽名碼

當然,我們應該確保我們使用的代碼是簽名的 ,以便我們知道它實際上是我們認為來自的人。

我們可以使用signedBy子句在策略中測試簽名:

keystore 'my.keystore';
grant signedBy 'signer.alias', codeBase ... {...
};

這一政策片段使用的密鑰庫別名為my.keystore來查找公鑰證書與別名signer.alias

然后,它驗證執行代碼已由與找到的證書中的公鑰相對應的私鑰簽名。

只能有一個keystore條目。

codeBasesignedBy子句的組合指定了ProtectionDomain 。 同一ProtectionDomain中的所有類都具有相同的權限。

特權代碼

每當嘗試進行資源訪問時,堆棧上的所有代碼必須具有該資源訪問的權限,除非堆棧上的某些代碼已標記為privileged

將代碼標記為特權可使一段受信任的代碼臨時允許訪問比直接調用它的代碼更多的資源。 換句話說,安全系統將所有呼叫者視為來自發出特權呼叫的類的ProtectionDomain的所有呼叫者,但僅在特權呼叫的持續時間內。

您可以通過在AccessController.doPrivileged()調用中運行代碼來使代碼具有特權:

AccessController.doPrivileged(new PrivilegedAction() {public Object run() {// ...privileged code goes here...return null; }
});

組裝沙箱

現在我們有了組裝沙箱所需的所有零件:

  1. 安裝SecurityManager
  2. 簽名應用程序罐
  3. 授予我們簽名的所有代碼AllPermission
  4. 在移動代碼可能調用的地方添加權限檢查
  5. 權限檢查doPrivileged()塊后運行代碼

我在GitHub上創建了一個簡單的示例。

參考: 安全軟件開發博客中來自我們JCG合作伙伴 Remon Sinnema的Java代碼沙盒 。

翻譯自: https://www.javacodegeeks.com/2012/11/sandboxing-java-code.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370759.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370759.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370759.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微型計算機2017年9月上,2017年9月計算機一級考試WPS Office沖刺題

2017年9月計算機一級考試WPS Office沖刺題2017年下半年計算機一級考試將在9月份進行,為了方便考生備考計算機一級考試。下面是小編為大家帶來的計算機一級考試WPS Office沖刺題,歡迎閱讀。沖刺題一:1、PowerPoint 演示文稿和模板的擴展名是【…

七. 多線程編程5.創建多線程

到目前為止,我們僅用到兩個線程:主線程和一個子線程。然而,你的程序可以創建所需的更多線程。例如,下面的程序創建了三個子線程:// Create multiple threads.class NewThread implements Runnable { String name; /…

11尺寸長寬 iphone_弱電工程LED顯示屏尺寸規格及計算方法

前言:led屏幕在生活中,隨處可見,顯示屏、廣播屏等等,但是led尺寸怎么計算的,你知道嗎?今天我們一起了解一下led屏幕尺寸的計算方法。正文:一、點間距的計算1、各單元板常見型號及尺寸LED屏普遍是…

marquee標簽的使用

<!DOCTYPE html> <html> <head><meta charset"utf-8" /><title>演示marquee</title><style type"text/css">*{padding: 0px;margin: 0px;}marquee{border: 1px solid purple;}img{width: 360px;height: auto;}&…

32位數據源中沒有mysql_[SpringBoot實戰]快速配置多數據源(整合MyBatis)

前言由于業務需求&#xff0c;需要同時在SpringBoot中配置兩套數據源&#xff08;連接兩個數據庫&#xff09;&#xff0c;要求能做到service層在調用各數據庫表的mapper時能夠自動切換數據源&#xff0c;也就是mapper自動訪問正確的數據庫。本文內容&#xff1a;在SpringbootM…

考研計算機冷門學校,考研5個冷門的985院校 別隨大流,這些幾所也是很不錯的...

導語&#xff1a;想必大家考研的目的有很多&#xff0c;最主要的就是想去更好的學校提升自己&#xff0c;大部分會肯定是會更傾向于985這類的院校&#xff0c;每年其實除了那些被“擠破頭”的985院校&#xff0c;其實還有不少“低調”的985院校是非常值得報考的&#xff0c;下面…

名為 cursor_jinserted 的游標不存在_質量工程師必須了解的測量常識,你不知道怎么行...

01測量器具的分類測量器具是一種具有固定形態、用以復現或提供一個或多個已知量值的器具。按用途的不同量具可分為以下幾類&#xff1a;1. 單值量具只能體現一個單一量值的量具。可用來校對和調整其它測量器具或作為標準量與被測量直接進行比較&#xff0c;如量塊、角度量塊等。…

window.onload事件

!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title>window.onload</title><!--window.onload注意點&#xff1a;01.在整個頁面中只能存在一次&#xff0c;否則后面會覆蓋前面02.頁面中所有的內容加載…

bzoj4869

http://www.lydsy.com/JudgeOnline/problem.php?id4869 終于A了。。。參考了下dalao的代碼。。。 拓展歐幾里得定理&#xff0c;改了幾次就不變了&#xff0c;但是用的時候要在快速冪里判是不是要用。 #include<bits/stdc.h> using namespace std; typedef long long ll…

一張圖一個表——CSS選擇器總結

CSS選擇器總結&#xff1a; (這些表是一張圖片^_^) 看底部 完整思維導圖圖片和表格的下載地址&#xff1a;https://download.csdn.net/download/denlnyyr/10597820 &#xff08;我不想選擇要積分幣下載的&#xff0c;但那里最低必須選擇1個積分……&#xff09; 參考文獻&…

JavaOne 2012覆蓋率

年度Java盛會JavaOne會議于9月30日至10月4日在舊金山舉行。 進行了許多有趣的演示&#xff0c;再次證明了健康的Java生態系統。 Java Code Geeks未能參加會議&#xff0c;但是我們的JCG合作伙伴Dustin Marx出席了會議&#xff0c;并且慷慨地提供了有關該事件的完整報道&#x…

native層 安卓_安卓逆向——拼xx協議java層分析

制丨阿星整理丨阿星老鐵們大家好&#xff0c;今天小編給大家帶來很實用的技巧叫拼xx協議java層分析&#xff0c;有啥不足的地方望大家指點指點&#xff01;首先抓包 反編譯這個時間段我們方法剖析一下找到onclick 看他的走向找到方法的地方都是在進行寫入 所以我們直接分析結果…

對口高考計算機vf試題,計算機對口升學模擬答案.doc

2013年計算機專業對口高考模擬試題二一、選擇題1&#xff0e;計算機硬件系統由( )組成A.CPU和內存 B.控制器和運算器 C.主機和外設 D.CPU、內存和外存2.下列敘述中&#xff0c;正確的說法是( )。A.鍵盤、鼠標、光筆、數字化儀和掃描儀都是輸入設備B.打印機、顯示器、數字化儀都…

Java集合框架圖

轉載于:https://www.cnblogs.com/areyouready/p/6835279.html

JavaScript學習第一天(一)

JavaScript介紹 JavaScript一種直譯式腳本語言&#xff0c;是一種動態類型、弱類型、基于原型的語言&#xff0c;內置支持類型。它的解釋器被稱為JavaScript引擎&#xff0c;為瀏覽器的一部分&#xff0c;廣泛用于客戶端的腳本語言&#xff0c;最早是在HTML&#xff08;標準通用…

折半查找的思想及源碼_常用排序與查找算法

1 選擇排序選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工作原理是&#xff1a;第一次從待排序的數據元素中選出最小(或最大)的一個元素&#xff0c;存放在序列的起始位置&#xff0c;然后再從剩余的未排序元素中尋找到最小(大)元素&#xff0c;然后放到已排序的序…

滾動視差?CSS 不在話下

何為滾動視差 視差滾動&#xff08;Parallax Scrolling&#xff09;是指讓多層背景以不同的速度移動&#xff0c;形成立體的運動效果&#xff0c;帶來非常出色的視覺體驗。 作為網頁設計的熱點趨勢&#xff0c;越來越多的網站應用了這項技術。 通常而言&#xff0c;滾動視差在…

計算機圖形學試題a卷,計算機圖形學復習題及答案

一、選擇題1.計算機繪圖設備一般使用( )顏色模型。A. RGBB. CMYC. HSVD. HLS2.在透視投影中&#xff0c;主滅點的最多個數是( )A1B2C3D43.多邊形填充時&#xff0c;下述論述錯誤的是( )A 多邊形被兩條掃描線分割成許多梯形&#xff0c;梯形的底邊在掃描線上&#xff0c;腰在多邊…

番石榴的弦類

在“ 檢查Java中的空&#xff0c;空或僅空白字符串”一文中 &#xff0c;我演示了Java生態系統&#xff08;標準Java&#xff0c; Guava &#xff0c; Apache Commons Lang和Groovy &#xff09;中用于檢查字符串是否為空&#xff0c;空或空白的常見方法。僅類似于C&#xff03…

用python做數據分析流程圖_使用Pyecharts進行高級數據可視化

歡迎使用Markdown編輯器經管之家&#xff1a;Do the best economic and management education&#xff01;你好&#xff01; 這是你第一次使用 Markdown編輯器 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章&#xff0c;了解一下Markdown的基本語…