我正在尝试在将数据插入数据库(POSTGRESQL)之前验证数据。使用 Apache Commons Validator 可以轻松验证与电子邮件、邮政编码等对应的数据。但在名称的情况下,我使用了这个:
^[a-zA-Z][ a-zA-Z]{1-30}$
这可以防止将任何特殊字符添加为名称,但无法防止用户添加DROP or GRANT
为名称。在我使用时PreparedStatement
,我认为这不会成为问题,但现在要求 SQL 关键字不应进入数据库,因为它可能导致二阶 SQL 注入。
我曾想过将所有 SQL 关键字列入黑名单(当然,这会阻止 Huge Grant 登录我们的网站。:P)但似乎有超过 64 个关键字。这(SQL 关键字的黑名单过滤数据)是防止二阶 SQL 注入的正确方法吗?我有哪些选择?
我正在使用这段代码:
String sql="INSERT INTO users (username, password, name) VALUES (?,?,?);";
try{
conn=SomeStaticClass.createConnection();
ps=conn.prepareStatement(sql);
ps.setString(1, dataBean.getUsername());
ps.setString(2, dataBean.getPassword());
ps.setString(3, dataBean.getName());
ps.execute();
}catch(SQLException e){
e.printStackTrace()
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(ps!=null){
ps.close();
}
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}