SQL SELECT-only查询文本验证

问题描述:

我有一个文本是一个SQL查询。该文本只能包含select语句(它必须始终以“select”开头)。SQL SELECT-only查询文本验证

该文本不应该以任何方式改变数据库。我如何验证它(以确保它不会影响我的数据库并仅从中获取数据)?

我使用Java和mySQL。

谢谢。

+0

最简单的方法是使用[startsWith(str)](http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#startsWith(java.lang.String) )String类的方法。 – 2012-01-13 09:04:46

+0

考虑我可以嵌套选择。 – Sergiu 2012-01-13 09:05:31

+0

它将检查字符串是否以特定前缀开头。所以我认为如果你只是想检查查询是否以'选择'字开头,那么子选择不会成为问题。 – 2012-01-13 09:08:05

您可以使用正则表达式来执行此操作。

String yourQuery = "SELECT"; 
if(Pattern.compile("SELECT .*").matcher(yourQuery).find()) 
{ 
// do stuff 
} 
+0

如果我做了'SELECT'blah'; DELETE FROM ...'? :D – gustavohenke 2013-09-02 12:34:17

你应该考虑建立一个新的用户和GRANT只有SELECT特权吧。那么你将不必担心解析sql查询并检查它们是否可以改变你的数据库。另一方面,如果查询以select开头,我不认为它可以改变你的数据库,因为选择不能包含嵌套的更新或删除。

+0

好处 - 你不应该在一方面允许泛型语句,然后必须以编程方式检查安全约束 - 正如dogbane所说的那样,通过授予数据库用户的权利来保护你的语句。如果你真的想检查你的通用语句,我会建议解析所有你不想允许的关键字。 – 2012-01-13 09:31:17