安全表单插入数据库 php
Secure Form insert in database php
我已经阅读了很多关于如何安全地处理从表单中获取的输入并将它们插入数据库的信息,但我不清楚我是否正确地执行了这些操作。我试图避免所有可能的威胁,包括 SQL 注入,并且我正在将文件(图像)直接上传到数据库中。我想知道是否有人可以帮我看看我的代码。我正在使用 adodb 活动记录连接我的数据库,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');
}
我使用的表格非常标准,我根据需要建立了我想要的字段,仅此而已。
"controller" 进行一些检查,然后调用方法 "insertar",我在其中创建活动记录对象以在处理 post 输入后插入数据库。
如果您用于执行实际数据库查询的方法可以防止 SQL 注入,那么您不需要清理输入。没有坏处,但是多余。
我已经阅读了很多关于如何安全地处理从表单中获取的输入并将它们插入数据库的信息,但我不清楚我是否正确地执行了这些操作。我试图避免所有可能的威胁,包括 SQL 注入,并且我正在将文件(图像)直接上传到数据库中。我想知道是否有人可以帮我看看我的代码。我正在使用 adodb 活动记录连接我的数据库,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');
}
我使用的表格非常标准,我根据需要建立了我想要的字段,仅此而已。
"controller" 进行一些检查,然后调用方法 "insertar",我在其中创建活动记录对象以在处理 post 输入后插入数据库。
如果您用于执行实际数据库查询的方法可以防止 SQL 注入,那么您不需要清理输入。没有坏处,但是多余。