簡體   English   中英

如何在cartodb數據庫中的javascript / jquery中生成的查詢中轉義SQL查詢的單引號?

[英]How do I escape SQL query's single quotes for query generated in javascript/jquery in cartodb database?

我使用javascript / jquery生成一個SQL查詢。 我有一個sql查詢我正在javascript / jquery腳本中生成和使用。

像這樣的東西:

var storeName;
var query = "SELECT * FROM stores where storeName = '" + storeName + "';";

(當用戶從​​html中選擇時, storeName是通過jquery生成的)

因此當storeName類似於“Jackson Deli”時 ,查詢運行得很好。

但是,當storeName“傑克遜的熟食店”時,它不起作用,似乎是因為傑克遜的撇號被視為結束語。 我知道如果我對查詢進行硬編碼,我可以通過加倍來引用它...所以

SELECT * FROM stores where storeName = 'Jackson''s Deli'; 

應該管用。 但我不是硬編碼查詢。 相反,它是由用戶輸入生成的,名稱中可能有也可能沒有撇號。 在這種情況下,我該如何逃避'這個角色? 我需要它在Javascript / jquery中工作。

我是否需要編寫一個if語句來查找'storeName並用''替換它'' 或者還有另一種方法可以解決這個問題嗎?

編輯:哎喲! 通常,是的,我意識到在客戶端生成查詢的危險。
所以這里有更多的背景。 我正在使用cartodb並關注他們的文檔。 這里有一個例子來自他們的回購做類似我正在談論的事情(他們也有其他例子):

https://github.com/CartoDB/cartodb.js/blob/develop/examples/layer_selector.html

您無法在cartodb中運行允許您以任何方式修改數據的查詢 - 您只能運行允許您檢索數據的查詢。 所以我還在考慮逃避這個引用角色的最佳方法是什么。

不要在客戶端生成SQL ...永遠

話雖這么說,如果您打算使用動態查詢,最好轉義用戶輸入並將其綁定到服務器端的預准備語句。

如果您發布有關哪個數據庫(MySQL,Postgres等)以及您用於服務器處理的語言的更多詳細信息,您將獲得更好的答案。

是的......我完全清楚這不回答這個問題。 但是,沒有人應該以這種方式創建代碼。

編輯:強調警告更大。

我看到其他人已經回答,但我想從幾個角度來處理這個問題。

你問的問題很好。 您認識到SQL不適用於單引號。 你意識到需要逃避某些事情。 這些是一些很好的起點,可以幫助您以安全和可維護的方式構建軟件。

  1. 永遠不要直接執行客戶端代碼/內容 - 從客戶端生成SQL或任何類型的代碼/指令(javascript,字節碼,編譯代碼)總是一個糟糕的主意,因為它打破了一些關鍵概念。

    • 它很難維護,因為你無法完全控制輸入。 當然你可以逃避SQL,但這並不能解決你沒有考慮其他角色的奇怪案例。
    • 這是不安全的 -你的變量,輸入,CGI參數,可以文件內容,數據庫字段,其值來自上述名單,或者只是從一個遠程系統附帶任何東西,遠程用戶永遠不能被信任的關系。 始終檢查,清理和驗證輸入。 我可以打開您的頁面的源代碼,查看您添加單引號檢查的位置並更改它,然后執行代碼以刪除您的記錄,如果某些存儲過程可用則通過電子郵件發送,在SQL后端運行代碼,刪除數據庫(假設查詢在適當的權限下運行。)
    • 它混合/模糊了客戶端輸入/顯示和業務邏輯之間的界限。 研究MVC,n層開發和其他概念,介紹將業務邏輯與顯示/輸入分離的概念。 這不僅對於可伸縮性和性能至關重要,而且還可以減少此類問題的變化,從而導致嚴重的安全漏洞。
  2. 從壞人的角度來看待你的軟件開發 - 而不是“如何逃避這個字符串以使其發揮作用”。 嘗試“如何繞過此頁面上的轉義,以允許我刪除記錄,查看我應該做的事情等。

  3. 不要因為方法錯誤而感到難過 ,要從中吸取教訓。 我看到很多關於你永遠不應該這樣做的評論(而且他們是對的)但是我們很多人都很難學到這一課。 我們嘲笑Little Bobby Tables,因為我們都寫過或者不得不支持執行此操作的代碼。 關鍵是要理解為什么這是一個壞主意的基礎,然后在設計軟件時使用它。 歡迎來到學校的艱難時刻。 我們都是畢業生,謝天謝地,你可以從我們的評論中學習,而不是當有人修飾,腐蝕,刪除或滲透你的數據庫和應用程序時。

為了讓您開始這個旅程,我建議您閱讀以下內容: SQL注入說明

並作為額外的獎勵XSS例如逃避源自外部系統或人的OUTPUT。 例如,包含Hi!!! <script>alert('Thanks to this site not escaping this output I get to run this code under your login. Thanks for the 4000 crates of free tshirts you just ordered for me');</script> how are you???的評論條目Hi!!! <script>alert('Thanks to this site not escaping this output I get to run this code under your login. Thanks for the 4000 crates of free tshirts you just ordered for me');</script> how are you??? Hi!!! <script>alert('Thanks to this site not escaping this output I get to run this code under your login. Thanks for the 4000 crates of free tshirts you just ordered for me');</script> how are you??? 所以當你輸出它時你會得到

Comments:Hi!!! <script>alert('Thanks to this site not escaping this output I get to run this code under your login.  Thanks for the 4000 crates of free tshirts you just ordered for me');</script> how are you???

哪個是“有效”HTML,瀏覽器會執行它。

最后的想法 - 采用座右銘信任但驗證 ,你會沒事的

僅供參考,CartoDB不允許您執行更改表中某些內容的查詢,它是只讀的。

首先將數據發送到服務器,然后使用addslashes()命令轉義需要轉義的所有字符(假設您使用的是PHP)。

在PHP上的addslashes()命令

完成簡化字符后,您可以使用API​​和API密鑰將數據發送到cartoDB。

cartoDB確實通過其SQL API提供插入/更新/刪除任務。 看到這個鏈接:

http://developers.cartodb.com/documentation/sql-api.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM