金麟岂是池中物,一遇风云便化龙
Posts tagged sql
小心Derby的ResultSet陷阱
Nov 9th
Derby作为一个纯Java实现的嵌入式DB一直很受Java社区的欢迎,在我们的项目中也用到了。但昨天晚上遇到的一个问题让我对Derby相当失望——Derby实现的ResultSet会将列名中的表名抹掉
具体代码:
SQL:
SELECT staff.staffid FROM staff WHERE ...
JDBC:
ResultSet rs = stmt.executeQuery(...); if(rs.next()){ String id = rs.getString("staff.id"); }
运行时抛出异常:
Caused by: java.sql.SQLException: 列“staff.staffid”未找到。 at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source) at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source) at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source) at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source) at org.apache.derby.impl.jdbc.EmbedConnection.newSQLException(Unknown Source) at org.apache.derby.impl.jdbc.ConnectionChild.newSQLException(Unknown Source) at org.apache.derby.impl.jdbc.EmbedResultSet.findColumnName(Unknown Source) at org.apache.derby.impl.jdbc.EmbedResultSet.getString(Unknown Source)
如果将select语句中的“staff.staffid”改成“staffid”则不会抛出上述异常。在项目中为了保持数量庞大的SQL语句的正确性和可维护性,一般会将表名、列名定义为常量。这样对于Derby数据库就需要一套特殊的、不带表名的列名常量,给代码维护带来很大的麻烦。不知道Sun将Derby这样实现的原因是什么,这个功能点的实现也不是很麻烦,打算去提交bug
Hacker
Jul 19th
引子
由于CSDN blog恶劣的服务质量,今后可能会在MSN上写一点技术性的文章,大家不要抱怨啊。
下午实验室停电,于是翻看那本《深入浅出Hibernate》,里面讲HQL时提到了一种名为“SQL Injection”的攻击方式,很简单的思想,利用数据库编程时的小漏洞,但一旦成功,后果相当之严重。看完后抱着试一试的心情用SQLI攻击了几个网站,未果。当试到学校教务处的管理网站时,竟然顺利地用管理员帐户登录了,反倒有些不知所措
。但本着技术型黑客的宗旨,只是在网站里到处浏览了一下,未做任何修改性操作。注销后还给“真正”的网管写了一封信告知系统有漏洞。希望他能及时做出反应,因为管理员帐号的权限很高,一旦被hack造成的后果会很严重。









