如何避免SQL注入没有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();

希望这对你有帮助!

相关内容

  • 没有找到相关文章

最新更新