2013-01-20 61 views
0

我一直在琢磨一個涉及到將一些變量寫入mysql數據庫的個人項目,其中一些(名字,姓氏,電子郵件)被提交,而且我正在編寫自己的程序衛生字符串。我正在考慮做類似寫入數據庫之前,在java(jsp)中正確保存數據?

string allowed="@_=-ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"; 
string userEntered = [form submitted] // just skipping all the backstory there 
for(int i=0; i<userEntered.length; i++){ 
    if(allowed.contains(userEnetered[i]){ 
     //continue processing 
    } 
    else{ 
     //flush data and deny 
    } 
} 

會這樣嗎?還是還有其他我忘記的考慮事項?

感謝您的幫助。

+1

查找「佔位符」。 *不*創建您自己的「消毒」功能。 (業務規則是另一回事;應該定義/應用這些規則。) – 2013-01-20 07:00:39

+1

在任何情況下,正則表達式都是描述/處理這條規則的更簡潔的方式:但是上面的規則會讓有些人不快樂作爲他們的名字將不符合。 – 2013-01-20 07:02:20

回答

0

如果你打算寫在JSP東西的數據庫,可以肯定,你不應該使用這種類型的SQL查詢:

String sql = "Select * from tblUsers where Username = '" + usern + " and password = '" + pwd + "'"; 

如果使用上面的方法,你很容易受到SQL注入式攻擊。相反,嘗試用準備好的發言,他們會逃避單引號charachters,使它不可能做到的SQL注入攻擊,就像這樣:

String securesql = "Select * from tblUsers where Username = ? and Password = ?"; 
PreparedStatement prepstat = conn.prepareStatement(securesql); 
prepstat.setString(1, usern); 
prepstat.setString(2, pwd); 

此外,我建議你使用SQL存儲過程和函數嘗試。例如,登錄時創建一個存儲過程,該存儲過程將執行查詢並使用您擁有的參數進行調用。

在傳遞到preparedStatement之前,您甚至可以對字符串進行操作(如示例代碼)。

+0

我總是使用預先準備好的語句,而我的實際想法是在將數據推送到我的實時數據之前對數據進行測試,作爲測試惡意目的的額外步驟。 –

0

如果您擔心跨站點腳本攻擊,最簡單的第一步就是在用戶輸入的數據在頁面上重新顯示時將其轉義,而不是在將其保存到數據庫之前進行清理。您可以使用JSTL escapeXml EL函數來執行此操作。您只需將jstl.jar放入WEB-INF/lib中,然後執行如下操作:

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> 

<input name="firstName" value="${fn:escapeXml(user.firstName)}"> 

這是一個好的開始。如果您在其他上下文中顯示用戶輸入的數據,則需要根據上下文對其進行適當的轉義。查看OWASP cross-site scripting cheat sheet for good examples

如果您遇到在顯示不足之前轉義用戶輸入的數據的情況,請使用帶有使用白名單輸入驗證示例的OWASP input validation cheat sheet is a good resource

相關問題