2016-02-18 90 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注入,那麼您不需要清理輸入。它沒有任何傷害,但是它是多餘的。