我正在建立一个动态网站,它将从Apache Tomcat界面查询MySQL数据库。虽然数据库使用加密密码存储所有用户信息,但我仍然需要在java代码中明确写入密码(root或admin帐户)来验证用户。我觉得这不是很安全。这样做的正确方法是什么?
谢谢!
答案 0 :(得分:1)
由于您正在使用像Tomcat这样的应用程序服务器/ servlet容器,因此可以将databsae连接详细信息用于服务器,只需从应用程序中获取连接。
在Tomcat中,您可以在context.xml文件中配置JDBC连接,您可以在其中设置连接的驱动程序,URL,用户和密码。您还可以为此连接配置引用名称。 EJ:
<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/javatest"/>
稍后,您在应用程序的web.xml配置文件中添加对此服务器资源的引用:
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<description>MySQL Test App</description>
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/TestDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
最后,您现在可以实例化将对象引用的资源的名称作为JNDI上下文:
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
Connection conn = ds.getConnection();
答案 1 :(得分:0)
您必须在某处提供密码才能连接到数据库,几乎所有应用程序都是如此。这就是您使用其他安全层来防止人们以某种方式发现密码时能够使用该密码的原因。
通常,数据库服务器受到保护,仅允许来自其驻留的本地计算机的连接,或者可能是其他计算机的有限白名单。如果您没有使用相同的密码进行其他任何操作,那么窃取它的任何人都不会比以前更有权访问您的数据库,因为他们需要在服务器上使用密码。
如果有人设法登录您的服务器并且可以编辑文件,那么密码已经无关紧要并且具有足够的权限,他们无论如何都不需要它。
正如AmazingDreams所说,您倾向于从配置文件中读取它,该配置文件提供了一个位置,可以在引导应用程序和设置数据库连接时引用该位置。
答案 2 :(得分:0)
正如其他人所说,它必须存储在某个地方,通常最好的位置是配置文件。也可以设置无密码的MySQL帐户(显然,这在共享服务器上不是一个好主意,或者如果您允许远程访问mysql,或者可以公开访问phpmyadmin等工具)。
您还应锁定用于网站的用户帐户的权限,并使用其他用户执行管理任务。例如。如果您的网站只需要从几个表中读取数据,则只授予对这些表的SELECT访问权限。通常,网站用户不需要访问DROP或EMPTY表,也不需要INSERT到事件日志类型表中。
答案 3 :(得分:0)
当我必须共享代码时,我也对此感到担忧。在php中,我使用一种简单的方法,即使用任何简单的函数(如base64)编码密码,并且在代码而不是实际密码中,我编写编码的密码并在某处调用解码函数。如果有人真的试图找出答案,那么安全性并不高,但足以避免每个偶然观察者看到你的密码。这是在PHP中。
在Java 中,您可以采取进一步的方法。
在您的代码中,您只需编写编码密码,并调用解码函数,如下所示:
public static final String PASSWD = DecodingHelper.decode ("THE_ENCODED_STRING");