gpt4 book ai didi

javascript - 预防变量的预准备语句/sql 注入(inject)

转载 作者:行者123 更新时间:2023-12-02 11:52:24 24 4
gpt4 key购买 nike

我读到,准备语句是避免 SQL 注入(inject)数据库的好方法。问题是客户想要一个安静的可变 UI他首先选择一个表,然后选择一些由列和文本组成的约束。所以基本上(天真的)最终产品将如下所示:

Select * from %TABLENAME% where %ATTRIBUTENAME% = %VALUE%

现在的问题是如何确保其安全?

当然,我可以构建一个准备语句解决方案,在其中提前为所有表创建语句,但这对我来说听起来是一个非常愚蠢的想法,因为维护它的工作量会很大(客户有安静的几张 table )。知道如何以尽可能通用的安全方式解决这个问题吗?

最佳答案

您应该将示例更改为

select * from %TABLENAME% where %ATTRIBUTENAME% = ?

这样至少VALUE不能用于SQL注入(inject)。然后,您可以根据数据库中的已知表和列验证 TABLENAMEATTRIBUTENAME

参见DatabaseMetaData.getColumns(...)您可以在运行时的验证中使用它。或者,您可能会保留一个在构建时生成的静态文件,其中包含有效的表/列。

您可以在构建时为每个表/列组合生成一个Enum吗?我知道jOOQ这种从数据库模式生成构建时 Java 代码的方式吗...也许它可以提供帮助?

例如

public enum TableColumn {
CUSTOMER_NAME("customer", "name"), CUSTOMER_ID("customer", "id"),
ORDER_ID("order", "id"), // etc etc

String table;
String column;

public TableColumn(String table, String column) {
// set values
}
}

public List<Row> doSelect(TableColumn tc, Object value) {
String sql = String.format("select * from %s where %s = ?", tc.table, tc.column);
Connection con = getConnection();
try {
PreparedStatement ps = con.prepareStatement(sql);
ps.setObject(1, value);
...

关于javascript - 预防变量的预准备语句/sql 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47792783/

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