如何在没有PreparedStatements的情况下避免SQL注入

时间:2016-08-26 09:25:06

标签: java sql

在我的应用程序中,我使用了一个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格式发回匹配的数据。我服务维护者。这意味着我不了解底层数据库,因此无法连接到它以制作准备好的语句。

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

1 个答案:

答案 0 :(得分:0)

使用来自服务的where子句构建您的查询,如下所示。请注意,我替换了&#39;%&lt;用户输入&gt;%&#39; &#39;%?%&#39;

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

希望这有帮助!