国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

安全性和類載入程序體系結構

2019-11-18 15:12:51
字體:
來源:轉載
供稿:網友

  ─ 類載入程序在JVM整體安全模式中的作用

--------------------------------------------------------------------------------

摘 要: java 技 術 之 所 以 適 用 于 網 絡 是 因 為 它 有 完 備 的、 設 計 到 其 結 構 中 的 安 全 模 式。 本 文 先 討 論Java 沙 箱 中 的 創 新 程 序, 然 后 討 論 安 全 模 式 中Java 虛 擬 機(JVM) 的 類 載 入 程 序 結 構。 類 載 入 程 序 結 構 能 將 從 不 同 來 源 下 載 的 代 碼 隔 離 開 來, 并 防 止 載 入 那 些 看 似 是 某 個 已 被 確 認 的 庫 的 一 部 分 而 實 際 上 并 未 獲 得 確 認 的 類。

沙 箱 刷 新 程 序
Java 安 全 模 式 的 重 點 在 于 保 護 最 終 用 戶 不 受 從 網 上 下 載 的 破 壞 性 程 序 的 干 擾。 為 達 到 這 個 目 的,Java 提 供 了 一 個 專 用 的 運 行Java 程 序 的 沙 箱。Java 程 序 在 它 的 沙 箱 內 可 做 任 何 事 情, 但 出 此 邊 界 就 不 能 有 任 何 操 作。 例 如, 未 經 確 認 的Java Applet 的 沙 箱 禁 止 許 多 操 作, 其 中 包 括:

禁 止 對 本 地 磁 盤 的 讀 寫;

除 了 下 載 此Applet 的 主 機 外 不 能 與 任 何 別 的 主 機 連 接;

禁 止 建 立 一 個 新 的 進 程;

禁 止 載 入 一 個 直 接 調 用 本 地 方 法 的 新 的 動 態 庫。
通 過 限 定 下 載 代 碼 的 可 執 行 操 作 的 范 圍,Java 安 全 模 式 可 使 用 戶 免 受 破 壞 性 程 序 的 威 脅。

類 載 入 程 序 體 系 結 構
在 安 全 沙 箱 中JVM 的 一 個 重 要 方 面 是 其 類 載 入 程 序 結 構。 在JVM 中, 類 載 入 程 序 負 責 輸 入 那 些 定 義 運 行 程 序 的 類 和 接 口 的 二 進 制 數 據。 在 圖1 中 只 有 一 塊 被 標 記 為“ 類 載 入 程 序”, 但 事 實 上, 在JVM 內 部 可 能 有 多 個 類 載 入 程 序。 可 以 說, 圖 中 的 類 載 入 程 序 實 際 代 表 了 一 個 可 能 涉 及 許 多 類 載 入 程 序 的 系 統。JVM 有 非 常 靈 活 的 類 載 入 結 構, 它 允 許Java 應 用 程 序 自 己 定 義 裝 載 類 的 方 式。



圖1 Java類載入程序體系結構
Java 應 用 能 用 二 種 類 載 入 程 序:“ 原 始 的” 類 載 入 程 序 和 類 載 入 程 序 對 象。 原 始 的 類 載 入 程 序( 只 有 一 個) 是JVM 的 一 部 分。 例 如, 如 果JVM 在 某 個 操 作 系 統 上 作 為C 程 序 被 啟 用, 那 么 原 始 的 類 載 入 程 序 就 是 那 個C 程 序 的 一 部 分。 原 始 的 類 載 入 程 序 裝 載 獲 得 確 認 的 類, 其 中 包 括Java API 類, 它 們 通 常 取 自 本 地 的 硬 盤。

在 程 序 運 行 時Java 應 用 裝 入 類 載 入 程 序 對 象, 它 們 能 以 自 定 義 的 方 式 載 入 類, 例 如 通 過 網 絡 來 下 載 類 文 件。JVM 認 為 它 用 原 始 的 類 載 入 程 序 裝 入 的 任 何 一 個 類 都 是 已 經 確 認 的, 不 管 它 是 否 是Java API 的 一 部 分。 然 而 它 對 那 些 通 過 類 載 入 對 象 裝 入 的 類 則 持 另 一 種 態 度。 在 默 認 的 情 況 下 它 認 為 它 們 是 未 獲 確 認 的。 雖 然 原 始 的 類 載 入 程 序 是 虛 擬 機 運 行 的 本 質 部 分, 但 類 載 入 對 象 不 是。 恰 恰 相 反, 類 載 入 程 序 是 用Java 寫 的, 編 譯 成 類 文 件, 載 入 虛 擬 機 中, 然 后 象 別 的 對 象 一 樣 被 實 例 化。 實 際 上 它 們 只 是 一 個 運 行 中 的 程 序 的 部 分 執 行 代 碼。 圖2 描 述 了 這 種 結 構。



圖2 Java類載入程序體系結構
因 為 有 了 類 載 入 程 序 對 象, 在 編 譯 時 你 不 必 知 道 都 有 哪 些 類 最 終 加 入 了Java 應 用 程 序。 這 樣, 你 能 在 運 行 時 動 態 地 擴 展Java 應 用 程 序。 當 你 運 行 應 用 程 序 時, 它 能 判 斷 需 要 別 的 什 么 類, 然 后 通 過 一 個 或 多 個 類 載 入 程 序 對 象 來 裝 入 它 們。 因 為 你 是 用Java 編 寫 類 載 入 程 序 的, 所 以 你 能 用 任 何 方 式 安 裝 類: 可 通 過 網 絡 下 載, 從 某 些 數 據 庫 中 取 得, 甚 至 在 乘 飛 機 時 把 它 算 出 來。

類 載 入 程 序 和 命 名 空 間
JVM 對 每 個 它 所 載 入 的 類 都 記 下 了 是 用 哪 種 類 載 入 程 序 裝 入 的, 當 一 個 被 載 入 的 程 序 引 用 另 一 個 類 時, 虛 擬 機 要 求 用 同 一 個 類 載 入 程 序 裝 入 被 引 入 的 類。 如 果 虛 擬 機 用 某 一 個 類 載 入 程 序 裝 入 了Volcano 類, 它 將 用 同 樣 的 類 載 入 程 序 來 裝 入Volcano 類 引 用 的 所 有 類。 如 果Volcano 引 用 了 一 個 叫Java 的 類, 也 許 調 用 了Java 類 的 方 法, 虛 擬 機 就 會 向 裝 入Volcano 類 的 載 入 程 序 要 求 獲 得Java 類。 載 入 程 序 返 回 的Java 類 與Volcano 類 是 動 態 鏈 接 的。

因 為JVM 用 這 種 方 法 裝 載 類, 在 默 認 條 件 下 某 個 類 只 能 看 見 用 同 一 個 類 載 入 程 序 裝 入 的 其 它 類。Java 體 系 結 構 用 這 種 方 法 在 單 個Java 應 用 中 建 立 多 個 命 名 空 間。 命 名 空 間 是 一 些 由 特 定 的 類 載 入 程 序 裝 入 的 類 的 獨 一 無 二 的 名 字 集 合。JVM 為 每 個 類 載 入 程 序 維 護 一 個 命 名 空 間, 所 有 由 該 類 載 入 程 序 裝 入 的 類 的 名 字 組 成 了 這 個 命 名 空 間。

例 如: 一 旦 某 個JVM 把 一 個 叫Volcano 的 類 裝 入 到 某 一 特 定 的 命 名 空 間 后, 就 不 能 再 把 別 一Volcano 類 裝 入 那 個 命 名 空 間。 然 而 你 可 以 把 多 個Volcano 類 裝 入JVM, 因 為 你 只 要 建 立 多 個 類 載 入 程 序 就 能 在 某 個Java 應 用 中 建 立 多 個 命 名 空 間。 如 果 你 在 某 個 運 行 著 的Java 應 用 中 建 立 了 三 個 單 獨 的 命 名 空 間( 三 個 類 載 入 程 序 每 個 載 入 程 序 一 個), 那 么 給 每 個 命 名 空 間 裝 入 一 個Volcano 類, 你 的 應 用 中 就 有 三 個 不 同 的Volcano。

Java 應 用 能 使 多 個 類 載 入 程 序 對 象 實 例 化, 不 管 它 是 否 來 自 同 一 個 類。 因 此 它 能 根 據 需 要 建 立 多 個 類 載 入 程 序 對 象。 用 不 同 的 類 載 入 程 序 裝 入 的 類 在 不 同 的 命 名 空 間 中, 并 且 除 非 明 確 許 可 外 都 不 能 互 相 訪 問。 當 你 開 發Java 應 用 時, 你 可 以 把 從 不 同 來 源 載 入 的 類 隔 離 到 不 同 的 命 名 空 間 中。 這 樣 用Java 的 類 載 入 程 序 體 系 結 構 就 可 控 制 不 同 來 源 的 代 碼 間 的 訪 問, 你 可 以 防 止 破 壞 性 代 碼 的 訪 問 正 常 的 代 碼。

Applet 的 類 載 入 程 序
Web 瀏 覽 器 是 用 類 載 入 程 序 進 行 動 態 擴 展 的 一 個 例 子, 它 用 類 載 入 程 序 對 象 從 網 上 為 某 個applet 下 載 類 文 件。Web 瀏 覽 器 啟 動 一 個 裝 入 類 載 入 程 序 對 象( 通 常 稱 作applet 類 載 入 程 序) 的Java 應 用, 這 種 類 載 入 程 序 對 象 知 道 怎 樣 從HTTP 服 務 器 獲 得 類 文 件。Applet 是 動 態 擴 展 的 一 個 例 子, 因 為 當Java 應 用 啟 動 時, 它 并 不 知 道 瀏 覽 器 會 要 它 從 網 上 下 載 哪 些 類 文 件。 要 下 載 的 類 文 件 是 在 運 行 中 瀏 覽 器 遇 上 含 有Java applet 的 網 頁 時 決 定 的。

Web 瀏 覽 器 啟 動 的Java 應 用 通 常 為 它 索 取 類 文 件 的 網 上 站 點 建 立 不 同 的applet 類 載 入 程 序 對 象。 因 而 不 同 來 源 的 類 文 件 由 不 同 的 類 載 入 程 序 對 象 裝 入, 并 被 放 入 主Java 應 用 內 不 同 的 命 名 空 間 中。 因 為 不 同 來 源 的applet 類 文 件 放 在 隔 離 開 的 命 名 空 間 中, 所 以 破 壞 性 的 代 碼 就 不 能 與 從 其 他 來 源 下 載 的 代 碼 直 接 接 觸。

類 載 入 程 序 間 的 合 作
通 常 情 況 下, 類 載 入 程 序 對 象 都 是 互 相 依 賴 以 完 成 各 自 遇 到 的 類 載 入 需 求, 至 少 它 們 都 依 賴 于 原 始 的 類 載 入 程 序。 例 如, 假 設 你 寫 了 個Java 應 用, 它 安 裝 了 一 個 通 過 從 網 上 下 載 類 文 件 來 獲 取 類 的 載 入 程 序。 假 定 在 運 行Java 應 用 期 間 要 求 你 的 類 載 入 程 序 裝 入 一 個 叫Volcano 的 類。 一 種 實 現 方 法 是, 首 先 讓 原 始 的 類 載 入 程 序 在 已 經 確 認 的 類 庫 中 尋 找 并 裝 入 該 類。 由 于Volcano 不 是Java API 的 一 部 分, 那 么 原 始 的 類 載 入 程 序 就 找 不 到 它, 這 樣 你 的 類 載 入 程 序 就 會 用 它 自 定 義 的 方 式 從 網 上 下 載Volcano 類, 假 定 你 的 類 載 入 程 序 能 下 載Volcano 類, 那 么 它 就 可 以 在 將 來 的 應 用 程 序 的 執 行 中 發 揮 作 用。

下 面 繼 續 同 一 個 例 子, 假 定 一 段 時 間 后Volcano 類 的 某 個 方 法 第 一 次 被 調 用, 它 引 用 了Java API 中 的String 類, 由 于 這 是 第 一 次 調 用, 虛 擬 機 要 求 你 的 類 載 入 程 序( 載 入Volcano 的 那 個) 裝 入String 類。 和 前 面 一 樣, 你 的 類 載 入 程 序 先 把 要 求 傳 遞 給 原 始 的 類 載 入 程 序, 不 過 這 一 次 原 始 的 類 載 入 程 序 能 直 接 返 回String 類, 因 為String 類 是 很 基 本 的 類, 它 肯 定 已 被 用 過, 因 此 也 已 被 裝 入 了。 大 多 數 情 況 下 原 始 的 類 載 入 程 序 會 返 回 從 正 獲 確 認 中 預 先 裝 入 的String 類。 這 樣, 類 載 入 程 序 就 不 會 再 從 網 上 下 載 它, 而 只 是 把 原 始 的 類 載 入 程 序 返 回 的 類 傳 遞 給 虛 擬 機。 以 后 不 管 什 么 時 候Volcano 類 要 引 用String 類, 虛 擬 機 都 會 調 用 已 載 入 的 這 個 類。

沙 箱 中 的 類 載 入 程 序
在Java 沙 箱 中, 類 載 入 程 序 體 系 結 構 是 阻 擋 破 壞 性 代 碼 的 第 一 道 防 線。 不 過 也 正 是 類 載 入 程 序 把 可 能 造 成 破 壞 的 代 碼 帶 進JVM 中。

類 載 入 程 序 體 系 結 構 對Java 水 箱 的 作 用 有:

它 阻 止 了 破 壞 性 代 碼 干 擾 良 好 的 代 碼。

它 保 護 已 獲 得 確 認 的 類 庫。
類 載 入 程 序 結 構 通 過 識 別 類 是 否 獲 得 確 認 來 保 護 類 庫。 如 果 某 個 破 壞 性 的 類 能 成 功 地 欺 騙JVM, 使JVM 相 信 它 是 來 自 于Java API 的 已 獲 確 認 的 類, 那 么 它 就 會 突 破 沙 箱 的 防 線。 而 類 載 入 程 序 結 構 能 防 止 未 獲 確 認 的 類 模 仿 已 獲 得 確 認 的 類, 這 種 預 防 辦 法 保 障 了Java 運 行 時 的 安 全。

命 名 空 間 和 保 護 屏
類 載 入 程 序 結 構 給 不 同 的 類 載 入 程 序 裝 入 的 類 提 供 了 受 保 護 的 命 名 空 間, 這 阻 止 了 破 壞 性 的 代 碼 干 擾 正 常 的 代 碼。 前 面 提 到 過, 命 名 空 間 是JVM 維 護 的 被 載 入 類 的 名 字 集 合。

命 名 空 間 有 助 于 安 全 性 是 因 為 你 能 在 不 同 命 名 空 間 的 類 間 放 置 保 護 屏。 在JVM 內 部, 同 一 個 命 名 空 間 中 的 類 能 直 接 地 互 相 交 互, 但 不 同 命 名 間 中 的 類 甚 至 不 知 道 對 方 的 存 在, 除 非 明 確 地 提 供 允 許 訪 問 的 機 制。 如 果 某 個 破 壞 性 的 類 被 裝 入 后 獲 得 了 對 目 前 其 它 裝 入 類 的 訪 問 權, 那 這 個 類 就 有 可 能 知 道 它 不 該 知 道 的 東 西, 或 有 可 能 干 擾 你 的 程 序 運 行。

建 立 一 個 安 全 的 環 境
當 你 寫 一 個 使 用 類 載 入 程 序 的 應 用 時, 你 就 建 立 了 一 個 運 行 被 動 態 裝 入 的 代 碼 的 環 境。 如 果 你 想 讓 它 沒 有 漏 洞, 在 編 寫 應 用 和 類 載 入 程 序 時 必 須 遵 守 一 些 規 則。 總 的 來 說 要 隔 離 破 壞 性 的 代 碼 和 正 常 的 代 碼, 并 象 保 護Java API 一 樣 保 護 獲 得 確 認 的 類 庫。

命 名 空 間 和 代 碼 來 源
為 了 發 揮 命 名 空 間 對 安 全 性 的 作 用, 你 要 確 保 用 不 同 的 類 載 入 程 序 從 不 同 的 來 源 裝 入 類。 這 就 是 支 持Java 的Web 瀏 覽 器 所 采 用 的 體 制。Web 瀏 覽 器 所 啟 動 的Java 應 用 通 常 為 它 從 網 上 下 載 類 的 每 個 來 源 建 立 不 同 的applet 類 載 入 程 序 對 象。 例 如, 某 個 瀏 覽 器 用 一 個 類 載 入 程 序 對 象 從http://www.riscapplets.com 下 載 類, 而 用 另 一 個 從http://www.meanapplets.com 下 載 類。

保 護 受 限 制 的 包
Java 允 許 同 一 個 包 中 的 類 互 相 授 予 某 些 訪 問 權 利, 但 不 能 對 包 外 的 類 授 予 訪 問 權。 因 此, 如 果 你 的 類 載 入 程 序 接 到 請 求, 要 裝 入 一 個 從 名 字 上 看 似 是Java API 一 部 分 的 類( 如 名 為Java.lang.virus 的 類), 它 就 要 小 心 處 理 這 一 請 示。 如 果 這 樣 的 類 被 裝 入 的 話, 它 就 有 權 訪 問Java.lang 這 個 已 獲 確 認 的 類 庫, 從 而 有 可 能 搞 破 壞。

因 此, 你 應 該 正 式 地 寫 這 樣 一 個 類 載 入 程 序, 它 能 很 簡 單 地 阻 絕 裝 入 那 些 看 似 是Java API 一 部 分( 或 任 何 其 它 已 獲 信 任 的 庫), 卻 不 在 本 地 已 獲 確 認 的 庫 中 的 類。 換 名 說, 當 你 的 類 載 入 程 序 把 請 示 傳 遞 給 原 始 的 類 載 入 程 序 后, 后 者 表 示 它 不 能 裝 入 這 個 類, 你 的 類 載 入 程 序 就 應 查 看 一 下 這 個 類 有 沒 有 聲 明 為 某 個 已 獲 確 認 的 包 中 的 一 員。 如 果 它 聲 明 了, 那 你 的 類 載 入 程 序 就 應 該 發 出 安 全 性 異 常 消 息, 而 不 是 從 網 上 下 載 它。

保 護 被 禁 止 的 包
此 外, 你 也 許 在 獲 得 信 任 的 庫 中 安 裝 了 一 些 包, 你 只 希 望 你 的 應 用 通 過 原 始 的 類 載 入 程 序 來 裝 入 其 中 的 類, 而 不 想 讓 那 些 你 的 類 載 入 程 序 裝 入 的 類 有 訪 問 權 利。 例 如, 假 定 你 已 經 建 立 了 一 個 叫absolutepower 的 包, 并 把 它 裝 到 原 始 的 類 載 入 程 序 有 權 訪 問 的 本 地 庫 中, 再 假 定 你 不 希 望 自 己 的 類 載 入 程 序 裝 入 的 類 能 裝 入absolutepower 包 中 的 任 何 一 個 類。 在 這 種 情 況 下, 你 所 寫 的 類 載 入 程 序 要 做 的 第 一 件 事 是 確 保 所 需 要 的 類 沒 有 聲 明 是absolutepower 包 中 的 一 員。 如 果 這 樣 的 類 有 需 求 的 話, 你 的 類 載 入 程 序 就 應 發 出 安 全 性 異 常 消 息 , 而 不 是 把 類 名 傳 給 原 始 的 類 載 入 程 序。

類 載 入 程 序 區 分 某 個 類 是 來 自 受 限 制 的 包 還 是 來 自 被 禁 止 的 包 的 唯 一 辦 法 是 看 它 的 名 字。 因 此 必 須 給 類 載 入 程 序 一 張 受 限 制 的 和 被 禁 止 的 包 的 名 單。 因 為 類 名java.lang.virus 表 示 它 是 來 自java.lang 的 包, 而java.lang 是 受 限 制 的 包, 所 以 如 果 原 始 的 類 載 入 程 序 不 能 載 入 它 的 話, 你 的 類 載 入 程 序 就 應 該 發 出 一 條 安 全 異 常 消 息。 因 為 類 名absolutepwer.FaneyClassloader 說 明 它 屬 于 被 禁 止 的 包absolutepwer, 你 的 類 載 入 程 序 也 應 該 發 出 安 全 異 常 消 息。

注 重 安 全 性 的 類 載 入 程 序
寫 注 重 安 全 性 的 類 載 入 程 序 的 方 法 一 般 是 用 以 下 四 步:

如 果 有 類 載 入 程 序 無 權 訪 問 的 類, 那 么 類 載 入 程 序 就 檢 查 需 要 的 類 是 否 屬 于 上 面 提 到 的 被 禁 止 的 包。 如 果 是, 就 發 一 條 安 全 性 異 常 消 息, 如 果 不 是 則 繼 續 第 二 步;

類 載 入 程 序 把 要 求 轉 給 原 始 的 類 載 入 程 序, 如 果 它 成 功 地 返 回 了 類, 類 載 入 程 序 就 返 回 它, 否 則 的 話 繼 續 第 三 步;

如 果 有 獲 得 信 任 的 包 禁 止 類 載 入 程 序 加 入 這 個 類, 那 么 類 載 入 程 序 就 檢 查 所 要 求 的 類 是 否 屬 于 受 限 制 的 包, 如 果 是, 它 就 發 安 全 異 常 消 息, 否 則 繼 續 第 四 步;

類 載 入 程 序 最 后 試 著 用 自 定 義 的 方 法 裝 入 類, 例 如 從 網 上 下 載。 如 果 成 功 的 話 就 返 回 這 個 類, 否 則 報 告 有“ 沒 有 發 現 類 定 義” 的 錯 誤。
類 載 入 程 序 執 行 上 述 第 一 步 和 第 三 步 保 護 了 已 獲 確 認 的 包。 第 一 步 徹 底 防 止 了 裝 入 被 禁 止 的 包 中 的 類, 第 三 步 禁 止 未 獲 得 確 認 的 類 把 它 自 己 添 加 到 已 獲 信 任 的 包 中。

結 論
類 載 入 程 序 的 體 系 結 構 用 二 種 方 法 幫 助 建 立Java 的 安 全 模 式:

把 代 碼 分 離 到 不 同 的 命 名 空 間 并 在 不 同 命 名 空 間 的 代 碼 間 設 置 保 護 屏;

保 護 象Java API 這 樣 已 獲 確 認 的 庫。
為 了 發 揮Java 類 載 入 程 序 體 系 結 構 在 安 全 性 方 面 的 作 用, 程 序 員 們 必 須 正 確 使 用 它 的 上 述 二 種 功 能。 為 利 用 命 名 空 間 所 形 成 的 保 護, 不 同 來 源 的 代 碼 應 用 不 同 的 類 載 入 程 序 對 象 來 裝 入; 為 利 用 受 信 任 的 包 得 到 的 保 護, 編 寫 的 類 載 入 程 序 必 須 對 照 受 限 制 的 和 被 禁 止 的 包 的 名 單 來 檢 查 所 需 求 的 類 的 命 名。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 双鸭山市| 胶州市| 张家川| 耿马| 萍乡市| 邛崃市| 九台市| 鄱阳县| 永靖县| 南郑县| 江阴市| 元氏县| 德州市| 安仁县| 岫岩| 武隆县| 黔西县| 体育| 合肥市| 孝昌县| 益阳市| 上栗县| 江阴市| 星子县| 绵竹市| 江陵县| 梧州市| 楚雄市| 沽源县| 福贡县| 漳平市| 太仓市| 衡阳县| 英吉沙县| 高邑县| 台东县| 施甸县| 陵川县| 昭平县| 宁晋县| 普兰县|