繁体   English   中英

如何避免没有PreparedStatements的SQL注入

[英]How to avoid SQL injection without PreparedStatements

在我的应用程序中,我使用了XML Web服务,该服务使我可以基于WHERE子句查询数据。 我想实现搜索功能,并且用户输入应该进入WHERE子句。 该请求看起来像这样:

<Query>
    <Selection>
        <sqlwhere>
            id IN (
                SELECT something
                FROM some_table
                WHERE something_different LIKE '%<user input>%'
                ESCAPE '\'
            )
        </sqlwhere>
    </Selection>
</Query>

该服务将该部分包装到实际的SELECT语句中。 该服务可能使用Firebird或MS SQL Server数据库。

如何轻松逃脱用户输入? 是否足以逃脱撇号?

更新资料

也许我有点不清楚。 上面的部分发送到服务,并且服务以XML格式发送回匹配的数据。 不是服务维护者。 这意味着我不了解底层数据库,因此无法连接到该数据库以进行准备的语句。

由于性能问题,我也无法获取所有数据并在我的代码中对其进行过滤。 这是我可以(有效)与其交谈的唯一方法。

使用来自这样的服务的where子句来构建查询。 注意,我用'%?%'替换了'%<用户输入> %'

<Query>
    <Selection>
    <sqlwhere>
        id IN (
        SELECT something
        FROM some_table
        WHERE something_different LIKE '%?%'
        ESCAPE '\'
        )
    </sqlwhere>
    </Selection>
</Query>

然后,使用此SQL使用PreparedStatement并根据用户输入设置参数。

String sqlQuery = extractSQLFromService();//get the query and where clause here
PreparedStatement ps = connection.prepareStatment(sqlQuery);
ps.setString(1, userInput);
ps.execute();

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM