2010-10-05 86 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