📄 jdbc-spec.frame5.html
字号:
<!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">上一页</a> | <a href="jdbc-spec.frame6.html">下一页</a>
</font></td>
<td align="right"><i>JDBC<sup><font size="-2">TM</font></sup> 指南:入门</i></td>
</tr>
</table>
<hr>
<p><br>
<a name="4985"></a> </p>
<h2>5 安全性考虑</h2>
<p>基于以上讨论,考虑到安全问题,主要有两种 JDBC 方案:
<ul>
<p><a name="5936"></a></p>
<li>对于 Java 应用程序方案,Java
代码是“可信任的”。由于安全方面的原因,这种情况也可考虑可信任的
applet。<br>
<br>
<a name="5935"></a> </li>
<li>相反,不允许不可信任的 Java applet
访问本地文件或到任意主机的网络连接。<br>
<br>
</li>
</ul>
<p><a name="4986"></a></p>
<h3>5.1 JDBC 和不可信任的 applet </h3>
<p>JDBC 应遵循标准的 applet 安全模型。特别地:
<ul>
<p><a name="4992"></a></p>
<li>JDBC 应假定常规未签名 applet 不可靠<br>
<br>
<a name="4996"></a> </li>
<li>JDBC 应禁止不可信任的 applet 访问本地数据库数据<br>
<br>
<a name="5083"></a> </li>
<li>如果下载的 JDBC 驱动程序向 JDBC DriverManager 注册,则 JDBC
应只用该驱动程序来满足与驱动程序同源加载的代码的连接请求。<br>
<br>
<a name="5010"></a> </li>
<li>通常只允许不可信任的 applet
从下载它的服务器上打开数据库连接。<br>
<br>
<a name="5099"></a> </li>
<li>当连接到远程数据库服务器时,JDBC
应避免自动或隐式地使用本地信任书。<br>
<br>
</li>
</ul>
<p><a name="5094"></a></p>
<p>如果 JDBC
驱动程序层完全确信打开与数据库服务器的网络连接不需认证成更高权限(可从在任意Internet主机上运行的任意随机程序得到),就可以允许
applet
打开该连接。这种情况很少见,而且也有要求,例如,数据库服务器不能将
IP 地址用作限制访问的途径。 </p>
<p><strong>对不可信任的 applet
的上述限制显得相当烦琐。但是,它们与常规 applet
安全模型是一致的,而且目前我们也找不到放松这些限制的方法。</strong></p>
<p><a name="5019"></a> </p>
<h3>5.2 JDBC 和 Java 应用程序</h3>
<p>对于常规 Java 应用程序(例如除不可信任的 applet 之外的所有 Java
代码),JDBC 应从本地 classpath
加载驱动程序,并允许应用程序自由访问文件、远程服务器等。 </p>
<p><a name="5058"></a>但是,与 applet
类似,如果由于某种原因而从远程源加载不可信任的 sun.sql.Driver
类,则该驱动程序只应与同源加载的代码一起使用。 </p>
<p><a name="20404"></a> </p>
<h3>5.3 网络安全性</h3>
<p>特别在Internet的情况下,网上的数据库请求和数据传送的安全性对于
JDBC
用户至关重要。但应注意,本规范中定义的是编程接口而不是网络协议。DBMS
厂商或连接厂商的数据库访问网络协议通常已固定了。在使用 JDBC
驱动程序和 DBMS 服务器前,JDBC
用户应校验网络协议是否已提供足够且必需的安全性。 </p>
<p><a name="35982"></a>如果 JavaSoft 为已公布的、DBMS 无关的 JDBC-NET
驱动程序协议发布标准(如第 <a href="jdbc-spec.frame3.html#506">3</a>
节中所述),则在选择协议时必须考虑安全性。 </p>
<p><a name="35974"></a> </p>
<h3>5.4 驱动程序的安全职责</h3>
<p>因为 JDBC
驱动程序可在多种情况下使用,所以对驱动程序编写人员而言,遵循简单的安全规则很重要。这样可以防止
applet 进行非法的数据库连接。 </p>
<p><a name="20406"></a>如果将下载的驱动程序作为 applet,因为标准安全管理器会防止
applet 驱动程序进行非法连接,所以不必遵循这些规则。但是,JDBC
驱动程序编写人员应注意:如果驱动程序是“成功的”,用户就可以将其安装到本地磁盘中。这种情况下,驱动程序就成为
Java 环境的可信任部分,且须确保访问 applet
时未滥用该驱动程序。因此,我们强调所有 JDBC
驱动程序编写人员都遵循基本安全规则。 </p>
<p><a name="20407"></a>连接打开时,这些规则即生效。此时驱动程序和虚拟机需要检查是否允许当前调用程序连接到所给数据库。打开连接后无需另行检查。
</p>
<p><a name="20408"></a> </p>
<h4>5.4.1 谨慎共享 TCP 连接</h4>
<p>如果 JDBC 驱动程序试图打开 TCP 连接,则 Java
安全管理器将自动检查该打开操作。安全管理器会检查当前调用堆栈是否有
applet。如果有,则将限制打开 applet
可以调用的计算机。因此,一般情况下 JDBC 驱动程序将把 TCP
的打开检查交由 Java 虚拟机负责。 </p>
<p><a name="20410"></a>但是,如果 JDBC
驱动程序要在多个不同数据库连接中共享 TCP
连接,则驱动程序将负责确保允许每个调用程序都可与目标数据库通讯。例如,如果为
applet A 打开到计算机 foobah 的 TCP 连接,则并不意味着应自动允许
applet B 共享该连接。applet B 可能并不具有访问计算机 foobah 的权限。 </p>
<p><a name="20411"></a>因此,在允许重用现有 TCP 连接以前,JDBC
驱动程序应通过安全管理器检查是否允许当前调用程序连接该计算机。可用如下代码段实现:
</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 检查所有本地文件访问</h4>
<p>如果 JDBC
驱动程序需要访问当前计算机上的本地数据,则必须确保其调用程序被允许打开目标文件。例如
</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>如果当前调用程序是一个无法访问给定文件的 applet,则
Security.checkRead 方法将抛出 java.lang.SecurityException。 </p>
<p><a name="25392"></a>与使用 TCP
连接类似,如果在多重调用线程中共享文件资源,且驱动程序是作为可信任代码运行的,则驱动程序只需考虑这些安全问题。
</p>
<p><a name="20431"></a> </p>
<h4>5.4.3 假设最坏的情况</h4>
<p>某些驱动程序可能使用本地方法以跨接低层数据库。这时,确定低层库所要打开的文件或网络连接将较为困难。
</p>
<p>上述环境下,除非驱动程序完全确信访问无害,否则驱动程序必须作出“最坏情况”的安全假设,同时应拒绝对下载的
applet 的所有数据库访问。</p>
<p><a name="20464"></a>例如,JDBC-ODBC 桥可能检查 ODBC
数据源名称的含义,且只允许 applet 使用那些引用机器上数据库的
ODBC 数据源名称,这些数据库允许 applet 打开连接(参见上文 <a
href="jdbc-spec.frame5.html#20408">5.4.1</a>)。但是,对于某些 ODBC
数据源名称,驱动程序可能无法确定目标数据库的主机名,因此会拒绝下载
applet 访问这些数据源。 </p>
<p><a name="20468"></a>为确定当前调用程序是否为可信任的应用程序或
applet(并可因此允许访问任意数据库),JDBC
驱动程序可以检查是否允许调用程序写入任意文件: </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">上一页</a> | <a
href="jdbc-spec.frame6.html">下一页</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>版权所有 © 1996, 1997 Sun Microsystems, Inc. 保留所有权利。</i></font> </a><!-- HTML generated by Suzette Pelouch on April 10, 1998 -->
</p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -