y Eduardo Roman * * @version $Id: autoForma.php,v 1.5 2007-01-30 22:49:08 ahuezo Exp $ * * $Log: autoForma.php,v $ * Revision 1.5 2007-01-30 22:49:08 ahuezo * cambios en operación * * Revision 1.4 2007-01-30 17:26:44 ahuezo * Se agrega validación para teléfono * * Revision 1.3 2007-01-29 23:58:42 ahuezo * Ajustes al manejo de rg_Bool y control de galleta independiente de la forma de envio * * Revision 1.2 2007-01-27 01:26:31 ahuezo * Se agregan librerias de gráfica de seguridad * Se agrega formato DIL * Se mejora el control de errores para que cada caption aparezca en rojo * Se menjora la seguridad incluyendo control de intentos * * Revision 1.2 2004/06/09 16:34:07 ahuezo * Desarrollo * * */ /** * Ruta Base * * Esto permite posicionar la aplicacion en cualquier directorio */ header("Content-Type: text/html; charset=ISO-8859-1"); session_start(); //=========================================================== include_once("../mysql.conf.php"); require_once "../lib/dbconnector.lib.class.php"; /* $db = new dbconnector(USR_DBHOST, TRUE, USR_DBUSER, USR_DBPASS, USR_DBNAME); $db->dbuse('ccalird'); if(existeVoto()){ header("Location: http://www.inali.gob.mx/elecciones_boletas/mensaje.html"); } function existeVoto(){ global $db; $id = intval($_REQUEST['rg_F_str_r_padron']); $res1 = $db->query("SELECT yaVoto from padron WHERE idp = $id limit 1"); if($res1[0]['yaVoto']==1) { return true; } else { return false; } } */ //=========================================================== //INICIO $base_path = dirname(__FILE__)."/"; $cfg=0; if(isset($_SESSION['rg_C_CFG'])) { // Hay cambio de configuraciónl, por lo que se limpia la sesión if(isset($_REQUEST['rg_C_CFG'])) { $cfg = intval($_REQUEST['rg_C_CFG']); } } $_SESSION['rg_C_CFG'] = $cfg; require $base_path."Config".$cfg.".php"; require_once $base_path."lib/xtpl.class.php"; require_once $base_path."lib/MIME.class.php"; require_once $base_path."lib/EmailValidation.class.php"; require_once $base_path."lib/CDefinicion.class.php"; // CONTROL DE INTENTOS if(!isset($_SESSION['rg_C_attempts'])) { $_SESSION['rg_C_attempts']=0; } else { $_SESSION['rg_C_attempts']; if($_SESSION['rg_C_attempts']>CONF_ATTEMPTS) die("Numero de intentos rebasado"); } // CONFIGURACION DE REGISTRO: if(!isset($_SESSION['rg_C_tpl'])) { if(!isset($_REQUEST['rg_C_tpl'])) { // Default $_REQUEST['rg_C_tpl']=CONF_HTML; } else { // El template que pidan $_SESSION['rg_C_tpl']=$_REQUEST['rg_C_tpl']; } } else { if(!isset($_REQUEST['rg_C_tpl'])) { // Se retoma el template anterior $_REQUEST['rg_C_tpl']=$_SESSION['rg_C_tpl']; } else { // El template que pidan $_SESSION['rg_C_tpl']=$_REQUEST['rg_C_tpl']; } } // CORREO DESTINO // Se pueden poner varios correos separados por comas $rg_C_to= CONF_EMAIL_TO; if(isset($_REQUEST['rg_C_to'])) $rg_C_to=$_REQUEST['rg_C_to']; // CORREO VIRTUAL DESDE DONDE SE ENVIA $rg_C_from= CONF_EMAIL_FROM; if(isset($_REQUEST['rg_C_from'])) $rg_C_from=$_REQUEST['rg_C_from']; // SUBJECT DEL CORREO $rg_C_subject= CONF_EMAIL_SUBJECT; if(isset($_REQUEST['rg_C_subject'])) $rg_C_subject=$_REQUEST['rg_C_subject']; //Correo para la validacion //$rg_C_usuario_local = CONF_USER_LOCAL_MAIL; //$rg_C_host_local = CONF_HOST_LOCAL_MAIL; //El nivel de validacion que tendra el correo electronico $rg_ctl_estricto = CONF_VAL_EMAIL_STRICT; $pS = new CDefinicion(PSDATA_DEF_CSV); // Se establece el template //echo "tpl:".$_REQUEST['rg_C_tpl']; $tpl = new XTemplate ($base_path."Html/".$_REQUEST['rg_C_tpl']); // Se instancia el objeto que valida el email y se ajustan ciertos parametros $validador= new email_validation_class; $validador->timeout=CONF_MAIL_TIMEOUT; $validador->localuser=CONF_USER_LOCAL_MAIL; $validador->localhost=CONF_HOST_LOCAL_MAIL; // Arreglo para identificar el campo que incurre en error $errFlag = array(); // Verificamos que no nos metan goool $ID='default'; $PAG_OK='Gracias.html'; if(isset($_REQUEST['rg_ctl_ID'])) $ID=$_REQUEST['rg_ctl_ID']; if(isset($_REQUEST['rg_ctl_PAG'])) $PAG_OK=$_REQUEST['rg_ctl_PAG']; if(isset($_REQUEST["CK_pr_gf".$ID]) && isset($_REQUEST["CK_ctl_on"])) { include($base_path."Html/$PAG_OK"); exit; } while(list($key, $val)=each($_REQUEST)) { //echo "key: $key, val: $val
"; // Validación de código de gráfica if(preg_match("/rg_F_captcha/",$key)) { if($_SESSION['~cl-captcha']!=$val) { $rg_ERROR[$key] = "No coinciden las letras del gráfico de seguridad"; $errFlag[$key] = 'Err'; // SE incrementa el número de intentos. // Cuando son mas de rg_C_attempts if($rg_C_attempts <= CONF_ATTEMPTS) $_SESSION['rg_C_attempts']++; } } // Validación de string if(preg_match("/rg_F_str_/",$key)) { $tmpval = str_replace(" ", "", $val); if($tmpval=="" && preg_match("/_r_/",$key)) {//Verifica si la cadena es requerida $rg_ERROR[$key] = "El campo \"".$pS->dataTitle[$key]."\" es obligatorio"; $errFlag[$key] = 'Err'; } if( preg_match("/_l(\d+)_/", $key, $lintN) ){//Verifica si pusimos un identificador de longitud if( strlen($tmpval) > $lintN[1] ){//Compara la longitud de la cadena con el rango que se puso $rg_ERROR[$key] = "El campo \"".$pS->dataTitle[$key]."\" excede el limite ($lintN[1])"; $errFlag[$key] = 'Err'; } } } // Validación de enteros if(preg_match("/rg_F_int_/",$key)) { $tmpval = str_replace(" ", "", $val); if($tmpval=="" && preg_match("/_r_/",$key)) {//Verifica si el entero es requerido $rg_ERROR[$key] = "El campo \"".$pS->dataTitle[$key]."\" es obligatorio"; $errFlag[$key] = 'Err'; } if(!ctype_digit($tmpval)) {//Verifica que realmente sea un entero $rg_ERROR[$key] = "El campo \"".$pS->dataTitle[$key]."\" debe ser numérico"; $errFlag[$key] = 'Err'; } if( preg_match("/_l(\d+)_(\d+)_/",$key, $larrNum) )//Verifica si tenemos un indicador de rango if( (intval($tmpval) < $larrNum[1]) || (intval($tmpval) > $larrNum[2]) ){//Si se sale del rango $rg_ERROR[$key] = "El campo \"".$pS->dataTitle[$key]."\" debe estar entre el rango de $larrNum[1] y $larrNum[2] "; $errFlag[$key] = 'Err'; } } // Validación de teléfonos if(preg_match("/rg_F_tel_/",$key)) { $tel = "([\(][0-9]{2,}[\)])?[\s]*(([0-9]{2,}[\-\s]*)*)+([\s]+ext[\s]+([0-9]+[,]?[\s]*)+)*"; $tmpval = str_replace(" ", "", $val); if($tmpval=="" && preg_match("/_r_/",$key)) {//Verifica si el telefono es requerido $rg_ERROR[$key] = "El campo \"".$pS->dataTitle[$key]."\" es obligatorio"; $errFlag[$key] = 'Err'; } //Verifica que se ajuste a un patrón de teléfono $match = preg_match("/^(".$tel."[;][\s]*)*(".$tel."[;]?)$/i", $val); if($match==0) { $rg_ERROR[$key] = "El campo \"".$pS->dataTitle[$key]."\" no parece un teléfono. Use este ejemplo: (999) 9999-9999"; $errFlag[$key] = 'Err'; } } // Validación de banderas o booleanos if(preg_match("/rg_F_bool_/",$key)) { if(!is_array($val)) { $tmpval = str_replace(" ", "", $val); if($tmpval) $numBools++; if($tmpval=="" && preg_match("/_r_/",$key)) { $rg_ERROR[$key] = "El campo \"".$pS->dataTitle[$key]."\" es obligatorio"; $errFlag[$key] = 'Err'; } } else { foreach($val as $akey=>$aval) { $tmpval = str_replace(" ", "", $aval); if($tmpval) $numBools++; if($tmpval=="" && preg_match("/_r_/",$key)) { $rg_ERROR[$key] = "El campo \"".$pS->dataTitle[$key]."\" es obligatorio"; $errFlag[$key] = 'Err'; } } } } // Validación de CP if(preg_match("/rg_F_cp_/",$key)) { $tmpval = str_replace(" ", "", $val); if($tmpval=="" && preg_match("/_r_/",$key)) { $rg_ERROR[$key] = "El campo \"".$pS->dataTitle[$key]."\" es obligatorio"; $errFlag[$key] = 'Err'; } if(!preg_match("/^([0-9]{5})/",$val)) { if(!is_int($tmpval)) { $rg_ERROR[$key] = "El campo \"".$pS->dataTitle[$key]."\" debe tener 5 números"; $errFlag[$key] = 'Err'; } } } // Validación de monetarios if(preg_match("/rg_F_money_/",$key)) { $tmpval = str_replace(" ", "", $val); if($tmpval=="" && preg_match("/_r_/",$key)) { $rg_ERROR[$key] = "El campo \"".$pS->dataTitle[$key]."\" es obligatorio"; $errFlag[$key] = 'Err'; } if($tmpval!="" && !preg_match("/^([0-9]+|\.[0-9]{2})/",$val)) { $rg_ERROR[$key] = "Llenar correctamente el campo \"".$pS->dataTitle[$key]."\" como monetario (números, puntos o comas)"; $errFlag[$key] = 'Err'; } } // Validación de fechas if(preg_match("/rg_F_date_/",$key)) { if(!preg_match("/^([0-9]{2})-(Ene|Feb|Mar|Abr|May|Jun|Jul|Ago|Sep|Oct|Nov|Dic)-([0-9]{4})/",$val)) { $rg_ERROR[$key] = "Llenar correctamente el campo de fecha (dd-Mes-aaaa)"; $errFlag[$key] = 'Err'; } /*if(!preg_match("/^(([0-9]+)|[(][0-9]*[)])(\-|\s)([0-9]+)/",$val)) { $rg_ERROR[$key] = "Llenar correctamente el Teléfono (números, espacios o guiones, Ejemplos: 5555-9999 o 55-55-99-99)"; $errFlag[$key] = 'Err'; }*/ if( ValidaTel($tmpval) < 0){ $rg_ERROR[$key]="Llenar correctamente el ".$pS->dataTitle[$key]."(números, espacios o guiones, Ejemplos: 5555-9999 o 55-55-99-99)"; $errFlag[$key] = 'Err'; } } // Validación de correo electrónico if(preg_match("/rg_F_email_|rg_conf_from|rg_conf_to/",$key)) { $tmpval = str_replace(" ", "", $val); if($tmpval=="" && preg_match("/_r_/",$key)) { $rg_ERROR[$key] = "El campo \"".$pS->dataTitle[$key]."\" es obligatorio"; $errFlag[$key] = 'Err'; } else{ $result = $validador->ValidateEmailBox($tmpval); //Obtenemos el resultado de evaluar el correo proporcionado //echo "$result and $rg_ctl_estricto


"; if($result <= 0){//Si el numero es Menor o igual a 0, significa que se sucito alguna clase de error if( -2 == $result){//Si devolvio -2 quiere decir que hubo un error de Sintaxis //echo "igual a -2 no se porque $result"; $rg_ERROR[$key] = "Llenar correctamente el correo electrónico (ejemplo: nombre@dominio.com)"; $errFlag[$key] = 'Err'; } else if( ( $result == -3 ) && ( $rg_ctl_estricto >= 1) ){//Evalua si devuelve -3, y que el flag de Estricto le permita ser valida $rg_ERROR[$key]="El dominio de correo que escribió no existe o no es valido"; $errFlag[$key] = 'Err'; } else if ($rg_ctl_estricto >= 2){//Unicamente verifica si esta el flag de todas las validaciones, y en ese caso cualquier valor que regrese quiere decir que el usuario no existe $rg_ERROR[$key]="El usuario de correo que escribio no existe o no es valido en ese dominio"; $errFlag[$key] = 'Err'; } }//end if <= 0 }//end else } // Validación de Paises if(preg_match("/rg_F_pais_/",$key)) { $tmpval = str_replace(" ", "", $val); if($tmpval=="" && preg_match("/_r_/",$key)) { $rg_ERROR[$key]="El campo \"".$pS->dataTitle[$key]."\" es obligatorio"; $errFlag[$key] = 'Err'; } if(!preg_match("/Afganistáî|Albania|Alemania|Andorra|Angola|Anguila|Antigua y Barbuda|Arabia SaudíüArgelia|Argentina|Armenia|Australia|Austria|Azerbaiyáî|Bahamas|Bahráén|Bangladesh|Barbados|Béìgica|Belice|Beníî|Bermudas|Bielorrusia|Birmania (actualmente Myanmar)|Bolivia|Bosnia y Herzegovina|Botsuana|Brasil|Brunéé|Bulgaria|Burkina Faso|Burundi|Butáî|Cabo Verde|Camboya|Camerúî|Canadáühad|Chequia|Chile|China|Chipre|Cisjordania y Franja de Gaza|Colombia|Comoras|Congo|Corea del Norte|Corea del Sur|Costa de Marfil|Costa Rica|Croacia|Cuba|Dinamarca|Dominica|Ecuador|Egipto|El Salvador|Emiratos Áòabes Unidos|Eritrea|Eslovaquia|Eslovenia|Españá|Estados Unidos|Estonia|Etiopía|Filipinas|Finlandia|Fiyi|Francia|Gabóî|Gambia|Georgia|Ghana|Granada|Grecia|Guadalupe|Guam|Guatemala|Guinea|Guinea-Bissau|Guinea Ecuatorial|Guyana|HaitíüHolanda (Paíóes Bajos)|Honduras|Hong Kong|Hungríá|India|Indonesia|Iráî|Iraq|Irlanda|Islandia|Islas Marshall|Islas Salomóî|Israel|Italia|Jamaica|Japóî|Jordania|Kazajistáî|Kenia|Kirguizistáî|Kiribati|Kuwait|Laos|Lesoto|Letonia|Líâano|Liberia|Libia|Liechtenstein|Lituania|Luxemburgo|Macedonia|Madagascar|Malasia|Malaui|Maldivas|MalíüMalta|Marruecos|Mauritania|Mauricio|Méøico|Micronesia|Moldavia|Móîaco|Mongolia|Montenegro|Mozambique|Myanmar|Namibia|Nauru|Nepal|Nueva Zelanda|Nicaragua|Níçer|Nigeria|Niue|Noruega|Omáî|Pakistáî|Palaos|Palestina|Panamáüapúá-Nueva Guinea|Paraguay|Perúüolonia|Portugal|Puerto Rico|Qatar|Reino Unido|Repúâlica Centroafricana|Repúâlica Democráôica del Congo|Repúâlica Dominicana|Rumania|Rusia|Ruanda|Sahara Occidental|Samoa|San Cristóâal y Nieves|San Marino|San Vicente y las Granadinas|Santa Lucíá|Santo Tomé y Príîcipe|Senegal|Serbia|Seychelles|Sierra Leona|Singapur|Siria|Somalíá|Sri Lanka|Sudáærica|Sudáî|Suecia|Suiza|Surinam|Suazilandia|Tailandia|Taiwáî|Tanzania|Tayikistáî|Timor Oriental|Togo|Tonga|Trinidad y Tobago|Túîez|Turkmenistáî|Turquíá|Tuvalu|Ucrania|Uganda|Uruguay|Uzbekistáî|Vanuatu|Ciudad del Vaticano|Venezuela|Vietnam|Yemen|Yibuti|Yugoslavia|Zambia|Zimbabue/i",$tmpval)) { $rg_ERROR[$key]="Llenar correctamente el Pais"; $errFlag[$key] = 'Err'; } } // Validación de estado if(preg_match("/rg_F_edo_/",$key)) { $tmpval = str_replace(" ", "", $val); if($tmpval=="" && preg_match("/_r_/",$key)) { $rg_ERROR[$key]="El campo \"".$pS->dataTitle[$key]."\" es obligatorio"; $errFlag[$key] = 'Err'; } if(!preg_match("/aguascalientes|bajacalifornia|bajacaliforniasur|campeche|coahuila|colima|chiapas|chihuahua|distritofederal|df|d\.f\.|durango|guanajuato|guerrero|hidalgo|jalisco|mexico|méxico|michoacan|morelos|nayarit|nuevoleon|oaxaca|puebla|queretaro|querétaro|quintanaroo|anluispotosi|sinaloa|sonora|tabasco|tamaulipas|tlaxcala|veracruz/i",$tmpval)) { $rg_ERROR[$key] = "Llenar correctamente el Estado"; $errFlag[$key] = 'Err'; } } //Filtro de campos de forma (Todo o nada) if(preg_match("/rg_ctl_all/",$key)||$rg_ctl_all) { $rg_ctl_all = TRUE; if(preg_match("/rg_F_/",$key)) { $rg_F = TRUE; if(!$val) { $rg_ERROR[$key]="Favor de llenar todos los datos para su pre-registro"; $errFlag[$key] = 'Err'; } } } //Filtro de campos de forma normal if(preg_match("/rg_ctl_noall/",$key)||$rg_ctl_all) { $rg_F = TRUE; } // Se verifica que la configuracion no este vacia o alterada en su caso. if(preg_match("/rg_C_/",$key)) { $rg_C = TRUE; if(!$val and $key != 'rg_C_CFG') { echo "Error de configuración"; exit; } } } // Validacion de booleanos o banderas //if($numBools < $_REQUEST['rg_C_minBool']) { // $rg_ERROR[$key]="Al menos debe seleccionar ".$_REQUEST['rg_C_minBool']." servicio/s"; // $errFlag[$key] = 'Err'; //} // En caso de existir un error rellenamos antes de verificar el envío de correo if(count($errFlag)>0) rellena(); // EVENTOS RESULTANTES DE LOS DATOS RECIBIDOS Y VALIDADOS if($rg_C && $rg_F) { //$content = arma_mensaje($_REQUEST['rg_C_cabecera'], $_REQUEST['rg_C_pie']); $content = arma_mensaje(); $mime = new MIME_mail($rg_C_from, $rg_C_to, $rg_C_subject); //if($attachment_flag) $mime->attach($content, "Articulo-".$id.".txt", "text/plain;\r\n\tname=Articulo-".$id.".txt", BASE64, ATTACH); $mime->attach($content, "datos-sistema-registro", "text/html", BASE64, INLINE); if($mime->send_mail()) { // ESTO ES PROVISIONAL EN LO QUE REVISO QUE HACER CON MÚLTIPLES ENVÍOS POR SESION @setcookie("CK_pr_gf".$ID,"1"); include($base_path."Html/$PAG_OK"); // ESTO ES PROVISIONAL EN LO QUE REVISO QUE HACER CON MÚLTIPLES ENVÍOS POR SESION //============================================================================ setYaVoto(); //============================================================================ $_SESSION['rg_C_attempts']=0; exit; } else { include($base_path."Html/Problemas.html"); // En este caso nos portamos misericordiosos y reseteamos los intentos. $_SESSION['rg_C_attempts']=0; exit; } } // Relleno por default rellena(); exit; function setYaVoto(){ global $db; $id = intval($_REQUEST['rg_F_str_r_padron']); $res1 = @$db->query("UPDATE padron SET yaVoto=1, marca= NOW(),rip='".getRealIp()."',rip2='".getIp()."' WHERE idp = $id limit 1"); } function getIp() { if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")){ $ip = getenv("HTTP_CLIENT_IP"); } else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")){ $ip = getenv("HTTP_X_FORWARDED_FOR"); } else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")){ $ip = getenv("REMOTE_ADDR"); } else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")){ $ip = $_SERVER['REMOTE_ADDR']; } else{ $ip = "unknown"; } return($ip); } function getRealIp(){ if( $_SERVER['HTTP_X_FORWARDED_FOR'] != '' ){ $client_ip=(!empty($_SERVER['REMOTE_ADDR']) )?$_SERVER['REMOTE_ADDR']:((!empty($_ENV['REMOTE_ADDR']))?$_ENV['REMOTE_ADDR']:"unknown" ); $entries = split('[, ]', $_SERVER['HTTP_X_FORWARDED_FOR']); reset($entries); while (list(, $entry) = each($entries)){ $entry = trim($entry); if (preg_match("/^([0-9]+.[0-9]+.[0-9]+.[0-9]+)/", $entry, $ip_list)){ // http://www.faqs.org/rfcs/rfc1918.html $private_ip = array('/^0./', '/^127.0.0.1/', '/^192.168..*/', '/^172.((1[6-9])|(2[0-9])|(3[0-1]))..*/', '/^10..*/'); $found_ip = preg_replace($private_ip, $client_ip, $ip_list[1]); if ($client_ip != $found_ip){ $client_ip = $found_ip; break; } } } } else{ $client_ip=(!empty($_SERVER['REMOTE_ADDR']))?$_SERVER['REMOTE_ADDR']:((!empty($_ENV['REMOTE_ADDR']))?$_ENV['REMOTE_ADDR']:"unknown" ); } return $client_ip; } function arma_mensaje() { global $errFlag; global $rg_ERROR; //echo "MTpl:".$_REQUEST['rg_C_Mtpl']; $tpl = new XTemplate ($base_path."Html/".$_REQUEST['rg_C_Mtpl']); reset($_REQUEST); while(list($key, $val)=each($_REQUEST)) { if(preg_match("/rg_F_bool_/",$key)) { if($val!="SI") { $_REQUEST[$key] = "No"; }else{ $_REQUEST[$key] = "Si"; } } } reset($_REQUEST); $tpl->assign("DATA", $_REQUEST); if(is_array($_REQUEST['rg_F_str_r_Scomision2'])){ foreach($_REQUEST['rg_F_str_r_Scomision2'] as $k=>$v){ $tpl->assign("__COORDINADOR__",$v); $tpl->parse("main.tematicos"); } } //$tpl->assign("rg_ERROR", $rg_ERROR); //$tpl->assign("ERRFLAG", $errFlag); $tpl->parse("main"); $content = $tpl->render("main"); return $content; } function rellena() { global $tpl; global $errFlag; global $rg_ERROR; reset($_REQUEST); //print_r($_REQUEST); while(list($key, $val)=each($_REQUEST)) { if(preg_match("/rg_F_bool_/",$key)) { if(!is_array($val)) { if($val!="SI") { $_REQUEST[$key] = ""; }else{ $_REQUEST[$key] = "CHECKED"; } } else { // OJO: Esta característica de devolver el radio button seleccionado lo dejamos //para futura implementación foreach($val as $akey=>$aval) { if($aval!="SI") { $_REQUEST[$key."[$akey]"] = ""; }else{ $_REQUEST[$key."[$akey]"] = "CHECKED"; } } } } } reset($_REQUEST); $tpl->assign("SECURITY_CODE",'Código de seguridad'); $tpl->assign("DATA", $_REQUEST); $tpl->assign("rg_ERROR", $rg_ERROR); $tpl->assign("ERRFLAG", $errFlag); $tpl->parse("main"); $tpl->out("main"); //echo "...

"; exit; } ?> )