2009-12-22 82 views
1

谁对CI的工作你的任何一个人都知道它使用的URL的分段的方法,如:笨网址

index.php/controller/function/params 

让我们假设我已经制定了以下网址提交联系我们表格信息:

index.php/contact/submit_contact 

现在有一件事情看起来不对。如果一个坏小子看到我的联系人 我们的页面的源代码并查看表单的action属性会怎么样?他可以直接复制并粘贴到浏览器的地址栏中,我的表单将以空值提交。

他可以做的另一件不好的事情,很可能会做的是CSFR跨站点伪造。

如何避免此问题。

注意:我知道我需要验证我的表单对空值,而不是提交它,如果字段为空,但我正在寻找一个更好的通用解决方案,以解决这个问题。

+0

你知道,这可能会发生在*所有*你的形式。查看动作属性的价值并不神奇。 CI在这里没有什么不同,例如'/ submit.cgi'。 – Boldewyn 2009-12-23 09:33:04

回答

11

这个问题没有更好的解决方案。你建立的每一个网页应该假设来自用户的所有输入都是敌对的,并且相应地处理它。

在这种情况下正确的做法是尝试验证表单,当您发现有一些不正确或不可接受的值时,重新输出带有错误信息的表单,指出问题并允许用户修复它在重新提交之前。代码点火器有一整个Form Validation module致力于这个确切的过程。

即使您使用Javascript来验证表单并阻止其提交,如果它不正确,您仍然需要在服务器端重复验证,因为任何人都可以在提交表单中填充不良值之前关闭Javascript 。

1

CodeIgniter表单验证的东西很容易使用,并自动处理最常见的情况。

+0

表单验证不会阻止此操作。 – 2009-12-23 09:20:38

+1

不是吗?为什么不?说明... – 2009-12-23 09:24:13

1

这里有zombat与代码示例解决方案的一些阐述。

我通常将表单发布到同一个控制器/方法。然后我让$ this-> form_validation-> run()处理所有肮脏的工作。如果$ _POST数据存在,验证器会检查规则。如果它通过,我将它们重定向到一个成功页面,否则会在重新填写的表单中显示验证错误。

class Contact extends CI_Controller { 

    function __construct() { 
     parent::__construct(); 
    } 

    function index() { 
     /* 
      the foreach() line makes each field visible 
      to form_validation so we can reliably 
      repopulate (using set_value, set_checkbox, 
      etc) fields that have no validation rules 

      example: since 'phone' has no rules, we would 
      not be able to repopulate that field if 
      validation failed 
     */ 
     foreach ($_POST as $key => $value) $this->form_validation->set_rules($key, '', ''); 
     $this->form_validation->set_rules('first_name', 'First Name', 'required|min_length[2]'); 
     $this->form_validation->set_rules('last_name', 'Last Name', 'required|min_length[2]'); 
     $this->form_validation->set_rules('email', 'Email Address', 'required|strtolower|valid_email'); 
     if ($this->form_validation->run() == FALSE) { 
      $this->load->view('contact_form'); 
     } else { 
      /* 
       save form data, email it, etc 
       then redirect the user so they 
       cannot re-submit the same data 
      */ 
      redirect('contact/success'); 
     } 
    } 

    function success() { 
     $this->load->view('contact_success'); 
    } 

} 

示例HTML应用程序/视图/ contact_form.php

<form method="post" action="<?php echo current_url(); ?>"> 
    <table> 
     <tr> 
      <td>First Name</td> 
      <td><?php echo form_input('first_name', set_value('first_name')); ?> 
      <?php echo form_error('first_name'); ?></td> 
     </tr> 
     <tr> 
      <td>Last Name</td> 
      <td><?php echo form_input('last_name', set_value('last_name')); ?> 
      <?php echo form_error('last_name'); ?></td> 
     </tr> 
     <tr> 
      <td>Email Address</td> 
      <td><?php echo form_input('email', set_value('email')); ?> 
      <?php echo form_error('email'); ?></td> 
     </tr> 
     <tr> 
      <td>Phone Number</td> 
      <td><?php echo form_input('phone', set_value('phone')); ?> 
      <?php echo form_error('phone'); ?></td> 
     </tr> 
     <tr> 
      <td>&nbsp;</td> 
      <td><button type="submit">Send Message</button></td> 
     </tr> 
    </table> 
</form> 

我绝对没有对CSFR或XSS忧虑做这种方式。

注意:与任何公开访问的表单一样,总会有垃圾提交(从机器人和试图招揽业务的真人)。如果您遇到很多问题,请相应地对您的验证规则进行微调。