2010-10-05 88 views
0
function simple_form($form_state) { 
    $form['item'] = array('#type' => 'hidden', '#value' => 'some_value'); 
    $form['#action'] = 'http://external-website.com/'; 
    $form['submit'] = array(
    '#type' => 'submit', 
); 
    return $form; 
} 

簡單的Drupal表單,用drupal_get_form(simple_form)調用。Drupal - 保護表單數據免遭篡改

不幸的是,將'item'的值更改爲表單中的其他內容並將該值發送到外部網站非常簡單。

據我所知,在離開我的網站之前沒有辦法檢查表單。

function simple_form_validate()並提交從未得到調用。

我該如何預防?將操作設置爲內部函數,然後在驗證後提交它?我會怎麼做呢?

不幸的是,設置

$form['item'] = array('#type' => 'value', '#value' => 'some_value'); 

不起作用?外部網站沒有收到'item'的值。

有什麼建議嗎?

回答

1

它是/或。這與Drupal無關,但與HTTP POST的性質無關。

要麼使用#type =>值,並且Drupal通過會話維護其在Drupal內部窗體之外的存儲, 或者您發佈到外部,在這種情況下,內部會話存儲無法提供幫助。

表單API中的Drupals安全系統依賴於事實上Drupal「知道」自己的確切形式,因此可以通過將它們與原始形式進行比較來避免不正確的值。 外部網站對原始表單一無所知,因此對如何驗證它一無所知。

您將需要在POST(外部站點)的接收器的末端執行驗證,否則其他任何內容都不會安全(足夠)。

驗證可能是遠程站點上運行的本地腳本,只需對白名單或正則表達式進行驗證即可。 或者,該遠程站點可以請求(例如通過HTTP-SOAP或XMLRPC)原始Drupal站點上的表單,但這將很難實現。

第三個替代方案,恕我直言,最簡單的辦法就是讓Drupal在本地處理整個表單,並且如果通過驗證在提交鉤子中處理它。在那裏,您可以以安全的方式將值發佈到遠程站點,或者您可以簡單地將其粘貼到數據庫或該遠程站點的某個後臺系統中。無論如何:在提交鉤子中,在Drupal驗證了表單之後,將其推送到遠程站點。

+0

我很清楚_submit和_validate不會被調用;)我只想過濾這些答案,然後人們回覆「使用_validate並提交函數!!」。感謝您的回覆。我認爲它會歸結爲什麼。任何關於如何在_submit()中生成表單的建議?使用cURL發佈它? – 2010-10-06 09:13:08

+0

如何在_submit中處理完全取決於接收站點的能力:直接在其(SQL)數據庫中?注入一個線軸系統? XMLRPC?肥皂? REST類型的? JSON? – berkes 2010-10-06 14:10:41