2010-04-14 83 views
0

我試圖存儲String包含HTML使用Longtext數據類型的MySQL數據庫。但它總是說「你的SQL語法有錯誤」。我試圖存儲一個正常的String,它的工作原理。商店HTML到MySQL數據庫

更新

這是查詢:

st.executeUpdate("insert into website(URL,phishing,source_code,active) values('" + URL + "','" + phishingState + "','" + sourceCode + "','" + webSiteState + "');"); 

我使用Java。

+1

機會是你不逃避你的文本。你用什麼語言與mySQL交互? – timdev 2010-04-14 22:46:29

回答

1

您需要在將字符串插入數據庫之前轉義字符串。

1

很難說沒有看到查詢。你可以發佈嗎?

我假定有需要轉義的HTML字符串,也許你錯過了某些部分?

2

使用上要存儲的字符串mysql_real_escape_string功能嘗試。這是最簡單的方法。

8

SQL查詢中的字符串通常由單引號包圍。例如。

INSERT INTO tbl (html) VALUES ('html'); 

但是,如果HTML字符串包含一個singlequote中,也將打破SQL查詢:

INSERT INTO tbl (html) VALUES ('<form onsubmit="validate('foo', 'bar')">'); 

你已經看到它在語法高亮顯示,在SQL值結束前的foo和SQL解釋器無法理解其後的內容。 SQL語法錯誤!

但是,這不是唯一的,它也把開放SQL injectionsexamples here)。

在構建SQL查詢期間,您確實需要清理SQL 。如何做到這一點取決於你用來執行SQL的編程語言。如果是例如PHP,你需要mysql_real_escape_string()

$sql = "INSERT INTO tbl (html) VALUES ('" . mysql_real_escape_string($html) . "')"; 

在PHP的方法是使用prepared statements,它會處理SQL轉義爲您服務。

如果您使用的是Java(JDBC),那麼你需要PreparedStatement

String sql = "INSERT INTO tbl (html) VALUES (?)"; 
preparedStatement = connection.prepareStatement(sql); 
preparedStatement.setString(1, html); 

更新:事實證明,你實際上使用Java。您需要更改代碼,如下所示:

String sql = "INSERT INTO website (URL, phishing, source_code, active) VALUES (?, ?, ?, ?)"; 
preparedStatement = connection.prepareStatement(sql); 
preparedStatement.setString(1, URL); 
preparedStatement.setString(2, phishingState); 
preparedStatement.setString(3, sourceCode); 
preparedStatement.setString(4, webSiteState); 
preparedStatement.executeUpdate(); 

請不要忘記正確處理JDBC資源。你可能會發現this article對於如何以正確的方式來完成基本的JDBC工作很有幫助。希望這可以幫助。

+1

雖然使用準備好的語句可以防止你進行sql注入,但當你將它拉出並再次顯示時,切記要避開HTML!如果你不這樣做,你會很容易受到各種xss攻擊。 – nos 2010-04-14 23:19:17

+0

@nos:完全正確。然而,這是一個故事。看到編碼(變量名稱)到目前爲止,我期望它被用於完全不同的目的,雖然:) @ jouzef19:如果這個HTML來自*用戶輸入*,你是*永遠*將顯示在一個JSP頁面,然後使用['fn:escapeXml()'](http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/fn/escapeXml.fn.html)來清理它避免[XSS攻擊](http://en.wikipedia.org/wiki/Cross-site_scripting) - [這裏的例子](http://ha.ckers.org/xss.html)。 – BalusC 2010-04-14 23:22:09