我有一个查询在哪里的条件,订单和限制。我正在使用预先准备的语句来设置地点条件和限制。目前,我使用字符串追加的顺序导致SQL注入漏洞。
如果我喜欢这样的话,我就不能使用set字符串来命令这个order by ? ? SQL功能。
示例查询:
SELECT siteid, technology, address, state, status FROM archive LEFT OUTER
JOIN mappings ON siteid = child_site_id order by siteid asc limit ? offset ?
SELECT siteid, technology, address, state, status FROM archive LEFT OUTER
JOIN mappings ON siteid = child_site_id order by siteid asc limit 10 offset 0任何其他方法我都可以这样做,以避免SQL注入。
发布于 2018-01-29 15:25:06
做这样的事情并将其连接起来:
List<String> allowedSortableColumns = Arrays.asList(new String[]{"siteid", "technology", "address"})
if(! allowedSortableColumns.contains(sortByColumn)){
throw new RuntimeException("Cannot sort by: " + sortByColumn);
}
// Continue here and it's safe to concatenate sortByColumn...你可以做消毒和其他事情,但这在你的情况下是可行的。
发布于 2018-11-16 08:28:45
PreparedStatement SetMethods仅适用于数据库表列值( SELECT和DELETE SQL语句的WHERE子句值,以及UPDATE和INSERT语句的要更新或插入的列值)。
因此,这意味着不能通过?的问号符号( java.sql.PreparedStatement )来参数化通常的SQL部件,如列名、表模式、表名、按顺序、按组、分页(限制、偏移、先取等)。
直接将用户输入的值追加到查询中将导致安全性缺陷,唯一的解决办法是检查有效值列表中的输入值,用于这些部分。
例如,您期望的表名是什么?对于特定表应该使用什么模式?在特定表中存在哪些列?页号是整数吗?限值是整数吗?ORDER BY子句的列名后的值应该仅为ASC或DESC &没有其他的等等。
您可以在系统中动态填充这些有效值或硬代码。
如果传递无效值,则要么不执行查询(&将其作为错误记录),要么用有用的默认值替换无效值,然后执行查询。
发布于 2018-01-29 15:35:32
您应该使用可能列的白名单:
String[] cols = {"siteid", "technology", "address", "state", "status"};然后在引用用户的列时使用索引:
int colFromUser = Integer.parseInt(request.getParameter("sortCol"));并在将列名追加到order by列表之前验证索引:
if(colFromUser < 0 || colFromUser >= cols.length) {
throw new IllegalArgumentException("Invalid column");
}
String col = cols[colFromUser];
query.append(col);虽然如果是我的话,我会用像Hibernate准则这样的工具来做这个工作:
标准c2 = session.createCriteria(Supplier.class);c2.addOrder(Order.desc("name"));
https://stackoverflow.com/questions/48504315
复制相似问题