2016-02-18 92 views
0

我一直在阅读很多关于如何安全地处理从表单中取得的输入并将它们插入到数据库中的问题,但是如果我正确地做了正确的处理,我还不清楚。我试图避免所有可能的威胁,包括SQL注入,并将文件(图片)直接上传到数据库中。我想知道是否有人能帮我看看我的代码。我正在使用adodb活动记录来连接我的数据库和php。安全表单插入数据库php

function insertar($post){   
     try { 
      $solicitud = new solicitud(); 
      $solicitud->nombre = revisarInputTexto($post['nombre']." ".$post['apellido1']." ".$post['apellido2']); 
      $solicitud->residencia = revisarInputTexto($post['residencia']); 
      $solicitud->correo = revisarInputEmail($post['correo']); 
      $solicitud->genero = revisarInputTexto($post['genero']); 
      $solicitud->gradoacademicomaximo = revisarInputTexto($post['gradoacademico']); 
      $solicitud->experienciaprofesional = revisarInputTexto($post['experienciaprofesional']); 
      $solicitud->experienciadocente = revisarInputTexto($post['experienciadocente']); 
      $solicitud->unidadacademica = revisarInputTexto($post['unidad']); 

      if(isset($post['labora'])){ 
       $solicitud->laboradoucr = true; 
      }else{ 
       $solicitud->laboradoucr = false; 
      }  

      $solicitud->telefonos = revisarInputInt($post['telefono1'])."/".revisarInputInt($post['telefono2'])."/".revisarInputInt($post['telefono3']); 
      $solicitud->nacimiento = revisarInputInt($post['anno']); 

      $tmpName = $_FILES['cedula']['tmp_name']; 
      $size = $_FILES['cedula']['size']; 

      if(getimagesize($tmpName) && $size < 2048000){ 
       $fp  = fopen($tmpName, 'r'); 
       $content = fread($fp, filesize($tmpName)); 
       $content = addslashes($content); 
       fclose($fp);   
       $solicitud->fotoidentificacion = $content; 
      }else{ 
       return false; 
      } 

      $solicitud->save(); 
     } catch (ErrorException $e) {    
      return false; 
     } 
     return true; 
    } 

    function obtenerUnidades(){ 
     $unidades = new unidadacademica(); 
     $arreglo = $unidades->Find("1=1"); 
     return $arreglo; 
    } 

    function revisarInputTexto($datos){ 
     $datos = trim($datos); 
     $datos = filter_var($datos, FILTER_SANITIZE_STRING); 
     return $datos; 
    } 

    function revisarInputEmail($datos){ 
     $datos = trim($datos); 
     $datos = filter_var($datos, FILTER_SANITIZE_EMAIL); 
     return $datos; 
    } 

    function revisarInputInt($datos){ 
     $datos = trim($datos); 
     $datos = filter_var($datos, FILTER_SANITIZE_NUMBER_INT); 
     return $datos; 
    } 


    // Controlador 
    if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['accion'])){ 
      if (insertar($_POST)){ 
       $smarty->display('visitas-exito.tpl'); 
      } 
      else{ 
       $smarty->display('visitas-fallo.tpl'); 
      } 
    }else{ 
     $unidades = obtenerUnidades(); 
     $smarty->assign('unidades', $unidades); 
     $smarty->display('visitas-formulario.tpl'); 
    } 

我使用的表格非常标准,我根据需要建立了我想要的字段,这就是它。

“控制器”执行一些检查,然后调用方法“insertar”,在那里创建活动记录对象,以便在处理后输入后插入到数据库中。

+0

关键部分是你没有显示的代码,它插入到数据库中。请参阅http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php?rq=1 – Barmar

+0

如果您在ADO中使用准备好的查询,那可能会提供您所需的保护。 – Barmar

+0

@Barmar它在那里,“插入”的方法是这样做的 – Moko21

回答

1

如果您用于执行实际数据库查询的方法阻止SQL注入,那么您不需要清理输入。它没有任何伤害,但是它是多余的。