2016-08-26 67 views
0

在我的应用程序中,我使用了一个XML Web服务,它允许我根据WHERE子句查询数据。我想实现搜索功能,用户输入应该进入WHERE子句。该请求是这样的:如何在没有PreparedStatements的情况下避免SQL注入

<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格式发送匹配的数据。我是而不是服务维护者。这意味着我不知道底层数据库,因此无法连接到它来准备语句。

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

+2

为什么人们仍然试图想出自己的方式来防止sql注入?坚持基于参数的查询标准。 – Takarii

+0

@Takarii你甚至读过这个问题吗? – stevecross

+2

我做过了,但我仍不明白为什么要这样做。如果输入没有被消毒,那么它仍然存在风险 – Takarii

回答

0

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

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

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

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

希望这有助于!

+0

不是''部分实际数据?这不会有效地提供'?'作为价值吗? – Takarii

+0

我没有连接到数据库,我不知道服务如何使用我提交的WHERE条款。 – stevecross

+0

我以为你正在使用xml服务,所以你将使用这个XML的** < sqlwhere > **值来编写你的查询。 – anacron

相关问题