我在我的應用程序這種形式的幾種功能:使用CallableStatements中的枚舉作爲一個白名單針對SQL注入
public long generatedCatId(String name,int age, CallableStatement statement) throws SQLException
{
statement.setString(1,name);
statement.setInt(2,age);
statement.registerOutParameter(3, Types.NUMERIC);
statement.execute();
return statement.getLong(3);
}
我想這樣做是有一個包含所有允許CallableStatement
對象爲Enum
創建一個白名單,這樣我就可以在枚舉中的一組值上做一個簡單的包含。我遇到的問題是,如果沒有Connection
對象,我無法創建CallableStatement
對象。有沒有辦法解決這個限制?我不想傳遞連接對象,也不想重複編譯Statement
,因爲這將作爲自動化過程的一部分,每天運行數十億次。最後我確實不會使用任何ORM工具。
UPDATE
任意語句的例子,我會跑:
CallableStatement statement = conn.prepareCallable("{Call insert_new_cat(?,?,?)}";
SQL: insert into cat(id,name,age)
values(cat_sequence.nextval,name,age)
returning id;
CallableStatement statement = conn.prepareCallable("{Call update_cat(?,?)}";
SQL: update cat
set age = age
where id = id;
第二次更新
似乎有左右我在做什麼了一些混亂。程序的流程如下:
進程A調用上面聲明的函數,提供編譯語句。示例如下:
Connection conn = DriverManager.getConnection("foo");
CallableStatement statement = conn.prepareCall("insert_new_cat");
for(Cat currentCat : CatList)
{
generateCatId(currentCat.name(),currentCat.age(), statement);
}
conn.commit();
請注意以上是一個提交和一個編譯或準備語句。我希望該語句成爲枚舉或其他最終數據結構的一部分,然後我可以在generateCatId
函數中對其進行比較。
你可以舉兩個或兩個以上'允許'的例子嗎? – epoch 2012-08-16 13:40:50
爲什麼不使用查詢字符串作爲白名單並在使用預處理語句之後?我不認爲你可以避免使用連接 – 2012-08-16 13:45:37
@epoch在那裏添加了一些任意的語句來顯示我在做什麼。 – Woot4Moo 2012-08-16 13:48:37