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)
进行调用。
不幸的是,将'item'的值更改为表单中的其他内容非常容易,然后将该值发送到外部站点。
据我所知,在离开我的网站之前无法检查表单。
function simple_form_validate()
并提交永远不会被调用。
我该怎样防止这种情况?将操作设置为内部函数,然后在验证后提交?我该怎么做呢?
不幸的是,设置
$form['item'] = array('#type' => 'value', '#value' => 'some_value');
不起作用?外部网站未收到“item”的值。
有什么建议吗?
答案 0 :(得分:1)
它是/或。这与Drupal无关,但与HTTP POST的性质有关。
要么使用#type =>值,Drupal会通过会话在Drupal内部的表单外维护其存储空间, 或者您发布到外部,在这种情况下内部会话存储无法帮助。
Form API中的Drupals安全系统依赖于Drupal“知道”确切形式本身的事实,因此可以通过将它们与原始形式进行比较来避免错误的值。 外部站点对原始表单一无所知,因此对如何验证它一无所知。
您需要在POST(该外部站点)的接收方末端执行验证,其他任何内容都不安全(足够)。
该验证可以是在远程站点上运行的本地脚本,只需针对白名单或正则表达式进行验证。 或者,该远程站点可以请求(例如通过HTTP-SOAP或XMLRPC)原始Drupal站点上的表单,但这将很难实现。
第三种选择,而最简单的恕我直言,是让Drupal在本地处理整个表单,如果经过验证,则在提交钩子中处理它。在那里,您可以以安全的方式将值发布到远程站点,或者您可以简单地将其粘贴到数据库或该远程站点的某个假脱机系统中。在任何情况下:在提交钩子中,在Drupal验证表单后,将其推送到远程站点。