2012-07-03 78 views
2

我目前正在創建基於jQuery validator plugin的表單驗證腳本。所以,簡單的配置很容易,如最小長度,最大長度,要求等。
之後,我決定檢查客戶端的用戶名/電子郵件的可用性,所以我不得不使用remote選項,這是我必須在創建規則數組時指定一個選項。所以,在創建規則時,我必須將數據發送到php腳本並檢查輸入字段的可用性。爲客戶端泄露網站的MySQL表名是否安全?

但是由於我要檢查多個輸入字段的可用性,我創建了一個函數(在客戶端)重用它用於每個字段,並且該函數需要輸入字段的ID和MySQL表的名字,把事情說清楚,這裏的功能:

注:
1.check_input是一個PHP腳本,將輸入字段的值和表覈對,它會返回一個JSON編碼的布爾值,如果表中沒有匹配,則爲true,否則爲false。

function check_input(input, table){ 

     $.ajax({ 
      type:"POST", 
      url:site_url+"site/check_input", 
      data:{ 
       input:input, 
       table:table, 
      } 


     }).done(function(resp){ 
      var is_unique = JSON.parse(resp); 
      return is_unique; 
     }); 
    } 

這個函數將通過設置remote選項
check_input($('#field').val(), 'table.column');被調用。因此,正如你所看到的,我必須從客戶端指定我的MySQL表,並且每個用戶(很好的&壞的)都可以看到這個,這是否被認爲是不安全或不好的做法?
如果不是,那麼檢查可用性的適當方法是什麼?

回答

8

這是糟糕的設計實踐,因爲您應該將數據庫架構與客戶端視圖代碼分離(如果要更改數據庫架構,該怎麼辦)。

這是不好的安全做法,因爲它看起來像你正在使用字符串來建立一個SQL查詢。如果您不瞭解SQL注入攻擊,請了解它們。這是一個經典案例。

把額外的工作,並創建一個合適的PHP API,不需要公開表名稱。

+0

謝謝,我想我會去做額外的工作,但是我沒有創建API的經驗,所以我想知道它是如何在理論上起作用的? – Abdulaziz

+2

您可以將列的名稱傳遞給您的PHP(它們不一定是實際的名稱),然後使用switch語句根據字符串的值而有所不同。 – Joe