?? jdbc-spec.frame5.html
字號(hào):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=gb2312">
<title></title>
</head>
<body bgcolor="#ffffff">
<table width="600">
<tr>
<td><font size="-1"><a href="jdbc-spec.frame.html">目錄</a> | <a
href="jdbc-spec.frame4.html">上一頁(yè)</a> | <a href="jdbc-spec.frame6.html">下一頁(yè)</a>
</font></td>
<td align="right"><i>JDBC<sup><font size="-2">TM</font></sup> 指南:入門(mén)</i></td>
</tr>
</table>
<hr>
<p><br>
<a name="4985"></a> </p>
<h2>5 安全性考慮</h2>
<p>基于以上討論,考慮到安全問(wèn)題,主要有兩種 JDBC 方案:
<ul>
<p><a name="5936"></a></p>
<li>對(duì)于 Java 應(yīng)用程序方案,Java
代碼是“可信任的”。由于安全方面的原因,這種情況也可考慮可信任的
applet。<br>
<br>
<a name="5935"></a> </li>
<li>相反,不允許不可信任的 Java applet
訪問(wèn)本地文件或到任意主機(jī)的網(wǎng)絡(luò)連接。<br>
<br>
</li>
</ul>
<p><a name="4986"></a></p>
<h3>5.1 JDBC 和不可信任的 applet </h3>
<p>JDBC 應(yīng)遵循標(biāo)準(zhǔn)的 applet 安全模型。特別地:
<ul>
<p><a name="4992"></a></p>
<li>JDBC 應(yīng)假定常規(guī)未簽名 applet 不可靠<br>
<br>
<a name="4996"></a> </li>
<li>JDBC 應(yīng)禁止不可信任的 applet 訪問(wèn)本地?cái)?shù)據(jù)庫(kù)數(shù)據(jù)<br>
<br>
<a name="5083"></a> </li>
<li>如果下載的 JDBC 驅(qū)動(dòng)程序向 JDBC DriverManager 注冊(cè),則 JDBC
應(yīng)只用該驅(qū)動(dòng)程序來(lái)滿足與驅(qū)動(dòng)程序同源加載的代碼的連接請(qǐng)求。<br>
<br>
<a name="5010"></a> </li>
<li>通常只允許不可信任的 applet
從下載它的服務(wù)器上打開(kāi)數(shù)據(jù)庫(kù)連接。<br>
<br>
<a name="5099"></a> </li>
<li>當(dāng)連接到遠(yuǎn)程數(shù)據(jù)庫(kù)服務(wù)器時(shí),JDBC
應(yīng)避免自動(dòng)或隱式地使用本地信任書(shū)。<br>
<br>
</li>
</ul>
<p><a name="5094"></a></p>
<p>如果 JDBC
驅(qū)動(dòng)程序?qū)油耆_信打開(kāi)與數(shù)據(jù)庫(kù)服務(wù)器的網(wǎng)絡(luò)連接不需認(rèn)證成更高權(quán)限(可從在任意Internet主機(jī)上運(yùn)行的任意隨機(jī)程序得到),就可以允許
applet
打開(kāi)該連接。這種情況很少見(jiàn),而且也有要求,例如,數(shù)據(jù)庫(kù)服務(wù)器不能將
IP 地址用作限制訪問(wèn)的途徑。 </p>
<p><strong>對(duì)不可信任的 applet
的上述限制顯得相當(dāng)煩瑣。但是,它們與常規(guī) applet
安全模型是一致的,而且目前我們也找不到放松這些限制的方法。</strong></p>
<p><a name="5019"></a> </p>
<h3>5.2 JDBC 和 Java 應(yīng)用程序</h3>
<p>對(duì)于常規(guī) Java 應(yīng)用程序(例如除不可信任的 applet 之外的所有 Java
代碼),JDBC 應(yīng)從本地 classpath
加載驅(qū)動(dòng)程序,并允許應(yīng)用程序自由訪問(wèn)文件、遠(yuǎn)程服務(wù)器等。 </p>
<p><a name="5058"></a>但是,與 applet
類(lèi)似,如果由于某種原因而從遠(yuǎn)程源加載不可信任的 sun.sql.Driver
類(lèi),則該驅(qū)動(dòng)程序只應(yīng)與同源加載的代碼一起使用。 </p>
<p><a name="20404"></a> </p>
<h3>5.3 網(wǎng)絡(luò)安全性</h3>
<p>特別在Internet的情況下,網(wǎng)上的數(shù)據(jù)庫(kù)請(qǐng)求和數(shù)據(jù)傳送的安全性對(duì)于
JDBC
用戶(hù)至關(guān)重要。但應(yīng)注意,本規(guī)范中定義的是編程接口而不是網(wǎng)絡(luò)協(xié)議。DBMS
廠商或連接廠商的數(shù)據(jù)庫(kù)訪問(wèn)網(wǎng)絡(luò)協(xié)議通常已固定了。在使用 JDBC
驅(qū)動(dòng)程序和 DBMS 服務(wù)器前,JDBC
用戶(hù)應(yīng)校驗(yàn)網(wǎng)絡(luò)協(xié)議是否已提供足夠且必需的安全性。 </p>
<p><a name="35982"></a>如果 JavaSoft 為已公布的、DBMS 無(wú)關(guān)的 JDBC-NET
驅(qū)動(dòng)程序協(xié)議發(fā)布標(biāo)準(zhǔn)(如第 <a href="jdbc-spec.frame3.html#506">3</a>
節(jié)中所述),則在選擇協(xié)議時(shí)必須考慮安全性。 </p>
<p><a name="35974"></a> </p>
<h3>5.4 驅(qū)動(dòng)程序的安全職責(zé)</h3>
<p>因?yàn)?JDBC
驅(qū)動(dòng)程序可在多種情況下使用,所以對(duì)驅(qū)動(dòng)程序編寫(xiě)人員而言,遵循簡(jiǎn)單的安全規(guī)則很重要。這樣可以防止
applet 進(jìn)行非法的數(shù)據(jù)庫(kù)連接。 </p>
<p><a name="20406"></a>如果將下載的驅(qū)動(dòng)程序作為 applet,因?yàn)闃?biāo)準(zhǔn)安全管理器會(huì)防止
applet 驅(qū)動(dòng)程序進(jìn)行非法連接,所以不必遵循這些規(guī)則。但是,JDBC
驅(qū)動(dòng)程序編寫(xiě)人員應(yīng)注意:如果驅(qū)動(dòng)程序是“成功的”,用戶(hù)就可以將其安裝到本地磁盤(pán)中。這種情況下,驅(qū)動(dòng)程序就成為
Java 環(huán)境的可信任部分,且須確保訪問(wèn) applet
時(shí)未濫用該驅(qū)動(dòng)程序。因此,我們強(qiáng)調(diào)所有 JDBC
驅(qū)動(dòng)程序編寫(xiě)人員都遵循基本安全規(guī)則。 </p>
<p><a name="20407"></a>連接打開(kāi)時(shí),這些規(guī)則即生效。此時(shí)驅(qū)動(dòng)程序和虛擬機(jī)需要檢查是否允許當(dāng)前調(diào)用程序連接到所給數(shù)據(jù)庫(kù)。打開(kāi)連接后無(wú)需另行檢查。
</p>
<p><a name="20408"></a> </p>
<h4>5.4.1 謹(jǐn)慎共享 TCP 連接</h4>
<p>如果 JDBC 驅(qū)動(dòng)程序試圖打開(kāi) TCP 連接,則 Java
安全管理器將自動(dòng)檢查該打開(kāi)操作。安全管理器會(huì)檢查當(dāng)前調(diào)用堆棧是否有
applet。如果有,則將限制打開(kāi) applet
可以調(diào)用的計(jì)算機(jī)。因此,一般情況下 JDBC 驅(qū)動(dòng)程序?qū)?TCP
的打開(kāi)檢查交由 Java 虛擬機(jī)負(fù)責(zé)。 </p>
<p><a name="20410"></a>但是,如果 JDBC
驅(qū)動(dòng)程序要在多個(gè)不同數(shù)據(jù)庫(kù)連接中共享 TCP
連接,則驅(qū)動(dòng)程序?qū)⒇?fù)責(zé)確保允許每個(gè)調(diào)用程序都可與目標(biāo)數(shù)據(jù)庫(kù)通訊。例如,如果為
applet A 打開(kāi)到計(jì)算機(jī) foobah 的 TCP 連接,則并不意味著應(yīng)自動(dòng)允許
applet B 共享該連接。applet B 可能并不具有訪問(wèn)計(jì)算機(jī) foobah 的權(quán)限。 </p>
<p><a name="20411"></a>因此,在允許重用現(xiàn)有 TCP 連接以前,JDBC
驅(qū)動(dòng)程序應(yīng)通過(guò)安全管理器檢查是否允許當(dāng)前調(diào)用程序連接該計(jì)算機(jī)??捎萌缦麓a段實(shí)現(xiàn):
</p>
<pre><code> SecurityManager security = System.getSecurityManager();
</code></pre>
<pre><code> if (security != null) {
</code></pre>
<pre><code> security.checkConnect(hostName, portNumber);
</code></pre>
<pre><code> }
</code></pre>
<p>如果不允許連接,Security.checkConnect 方法將拋出
java.lang.SecurityException。 </p>
<p><a name="20424"></a> </p>
<h4>5.4.2 檢查所有本地文件訪問(wèn)</h4>
<p>如果 JDBC
驅(qū)動(dòng)程序需要訪問(wèn)當(dāng)前計(jì)算機(jī)上的本地?cái)?shù)據(jù),則必須確保其調(diào)用程序被允許打開(kāi)目標(biāo)文件。例如
</p>
<pre><code> SecurityManager security = System.getSecurityManager();
</code></pre>
<pre><code> if (security != null) {
</code></pre>
<pre><code> security.checkRead(fileName);
</code></pre>
<pre><code> }
</code></pre>
<p>如果當(dāng)前調(diào)用程序是一個(gè)無(wú)法訪問(wèn)給定文件的 applet,則
Security.checkRead 方法將拋出 java.lang.SecurityException。 </p>
<p><a name="25392"></a>與使用 TCP
連接類(lèi)似,如果在多重調(diào)用線程中共享文件資源,且驅(qū)動(dòng)程序是作為可信任代碼運(yùn)行的,則驅(qū)動(dòng)程序只需考慮這些安全問(wèn)題。
</p>
<p><a name="20431"></a> </p>
<h4>5.4.3 假設(shè)最壞的情況</h4>
<p>某些驅(qū)動(dòng)程序可能使用本地方法以跨接低層數(shù)據(jù)庫(kù)。這時(shí),確定低層庫(kù)所要打開(kāi)的文件或網(wǎng)絡(luò)連接將較為困難。
</p>
<p>上述環(huán)境下,除非驅(qū)動(dòng)程序完全確信訪問(wèn)無(wú)害,否則驅(qū)動(dòng)程序必須作出“最壞情況”的安全假設(shè),同時(shí)應(yīng)拒絕對(duì)下載的
applet 的所有數(shù)據(jù)庫(kù)訪問(wèn)。</p>
<p><a name="20464"></a>例如,JDBC-ODBC 橋可能檢查 ODBC
數(shù)據(jù)源名稱(chēng)的含義,且只允許 applet 使用那些引用機(jī)器上數(shù)據(jù)庫(kù)的
ODBC 數(shù)據(jù)源名稱(chēng),這些數(shù)據(jù)庫(kù)允許 applet 打開(kāi)連接(參見(jiàn)上文 <a
href="jdbc-spec.frame5.html#20408">5.4.1</a>)。但是,對(duì)于某些 ODBC
數(shù)據(jù)源名稱(chēng),驅(qū)動(dòng)程序可能無(wú)法確定目標(biāo)數(shù)據(jù)庫(kù)的主機(jī)名,因此會(huì)拒絕下載
applet 訪問(wèn)這些數(shù)據(jù)源。 </p>
<p><a name="20468"></a>為確定當(dāng)前調(diào)用程序是否為可信任的應(yīng)用程序或
applet(并可因此允許訪問(wèn)任意數(shù)據(jù)庫(kù)),JDBC
驅(qū)動(dòng)程序可以檢查是否允許調(diào)用程序?qū)懭肴我馕募?</p>
<pre><code> SecurityManager security = System.getSecurityManager();
</code></pre>
<pre><code> if (security != null) {
</code></pre>
<pre><code> security.checkWrite("foobaz");
</code></pre>
<pre><code> }
</code></pre>
<pre><code>
</code></pre>
<p><br>
</p>
<hr>
<font size="-1"><a href="jdbc-spec.frame.html">
<p>目錄</a> | <a href="jdbc-spec.frame4.html">上一頁(yè)</a> | <a
href="jdbc-spec.frame6.html">下一頁(yè)</a> </font></p>
<hr>
<address>
<a href="mailto:jdbc@wombat.eng.sun.com">jdbc@wombat.eng.sun.com</a> 或 <a
href="mailto:jdbc-odbc@wombat.eng.sun.com">jdbc-odbc@wombat.eng.sun.com</a>
</address>
<a href="../../../relnotes/SMICopyright.html"><font size="-1"><i>
<p>版權(quán)所有 © 1996, 1997 Sun Microsystems, Inc. 保留所有權(quán)利。</i></font> </a><!-- HTML generated by Suzette Pelouch on April 10, 1998 -->
</p>
</body>
</html>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -