gpt4 book ai didi

java - SQL关键字黑名单过滤数据

转载 作者:行者123 更新时间:2023-11-29 03:39:44 26 4
gpt4 key购买 nike

我试图在将数据插入数据库(POSTGRESQL)之前验证数据。使用 Apache Commons Validator 可以轻松验证与电子邮件、邮政编码等对应的数据。但是在名字的情况下,我使用了这个:

^[a-zA-Z][ a-zA-Z]{1-30}$

这可以防止将任何特殊字符添加为名称,但无法防止用户将 DROP 或 GRANT 添加为名称。当我使用 PreparedStatement 时,我认为这不会成为问题,但现在要求 SQL 关键字不应该进入数据库,因为它可能导致 Second订购 SQL 注入(inject)。

我考虑过将所有 SQL 关键字列入黑名单(当然,这将阻止 Huge Grant 登录我们的站点。:P)但似乎有 >64 个关键字。这(针对 SQL 关键字的黑名单过滤数据)防止二阶 SQL 注入(inject) 的正确方法吗?我有哪些选择?

我正在使用这段代码:

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();
}
}

最佳答案

Is this a proper approach for this kind of a situation?

没有。

当您通过连接字符串来组装 SQL 查询时,就会发生 SQL 注入(inject)。

防止 SQL 注入(inject)的“最佳实践”方法是使用 PreparedStatement使用具有参数占位符的常量 SQL 查询。然后使用准备好的语句 set 方法为每个占位符参数设置值。这种方法将保证任何包含 SQL 关键字的“讨厌的”字符串参数都将被解释为文字字符串。


更新 - 始终如一地使用 PreparedStatements 也应该可以防止二阶攻击......假设您指的是这样的东西:

http://download.oracle.com/oll/tutorials/SQLInjection/html/lesson1/les01_tm_attacks2.htm

您只需要确保您没有使用任何可能被污染的内容构建 SQL 查询字符串。如果您使用占位符处理任何可能被污染的数据,那么数据来自何处并不重要。

(将 SQL 关键字列入黑名单将有助于防止垃圾进入数据库。但正如您所提到的,它可能会损坏合法数据并影响系统的可用性。我不会这样做。最好是依靠良好的程序员纪律......和彻底的代码审查。)

关于java - SQL关键字黑名单过滤数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13738141/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com