Protección contra ataques en tabla de enlaces para películas

  • Autor Autor Juanjo87
  • Fecha de inicio Fecha de inicio
Oh! me as roto el corazon con esto: Te doy la ultima mano, perdón, ya seria mucho trabajo hacertelo..:sorrow::sorrow: La verdad que no se como podria agradecerte tanto esfuerzo y entiendo que no dispongas de tiempo para hacerle el trabajo a otro pero por favor, aunque no me escribas mas código no me dejes solo ahora. no se a que te refieres que la edición me la dejas ami.

Tal cual esta ahora mismo con lo que me as pasado, desde la zona administracion, puedo editar perfectamente el contenido asi que supongo que a eso no te refieres, podrias decirme que le falta por hacer? no que me escribas el codigo de lo que falta si no que me especifiques un poco mas para poder buscar en google y no dejarlo a medias pues practicamente el trabajo es tuyo y yo no tengo conocimientos para acabarlo.

Hola Juanjofurtado. Por lo que veo, en una lectura rápida, el usuario Wetsa te lo ha dejado a huevo. Sólo tienes que tomar el primer código que tu publicastes y ver las modificaciones que wetsa ha hecho, e ir colocándolas en su sitio. Seguramente te fallará alguna cosa,.. normal.. Wetsa no puede probar el código por lo que puede haber algún error, pero me atrevo a decir que su código es un 99% correcto.

No creo que se pueda recibir más ayuda en un foro de la que ya te han aportado. Si tu no eres capaz de seguir con el ejemplo, deberías buscar a un profesional, alguien que pueda montar un entorno de pruebas o acceder a tu servidor y probar que todo funcione. Personalmente, yo no habría enfocado esta funcionalidad como un tema de wordpress, creo que lo mejor habría sido montar un plugin que así podrías reutilizar con otros temas.

En serio.. mira tu código original con calma, mira los cambios que te han propuesto y verás como no es tan confuso.
 
El código que a creado hasta el momento, wetsa, funciona perfectamente, solo tendría que modificar el function y estaría listo, ximebcn, pero funciona mejor que lo que yo tenia, wetsa esta haciendo un gran trabajo y eso no lo dudo.

Pero pienso, que si todo el que entienda, aportase algo, pensad que el código podría servir para cualquier persona como yo que lo necesite, Y quiera aprender, por que al fin y al cabo, se trata de poder aprender. Para que quiero que me lleven si no me muestran el camino para después volver....

Lo que pasa, que si un usuario se esta iniciando en el tema de programación, para mi seria mucho mas fácil y me demoraría mucho menos tiempo, comparar entre dos ejemplos funcionales y así poder entenderlos para poder modificar, que ponerme a investigar por mi cuenta dando palos de ciego.

No pretendo ofender a nadie, pero quiero que se entienda mi postura, y que no todo el que entra aquí, entra para que le den todo echo, yo personalmente llevo mucho tiempo luchando con la dichosa tabla de enlaces, y wetsa, le a echo unas modificaciones que según usted, ximebcn, cualquiera con un mínimo de conocimientos podría hacerlos, pero para mi le a dado la vuelta al código. Ya era un logro para mi el haber conseguido el código que tenia y haberlo modificado y adaptado a mis necesidades, pero estaba lleno de errores que wetsa muy amablemente me a solucionado y me esta ayudando a corregir.

Lo que pienso es que hacen falta mas usuarios como el para que aprendan usuarios como yo.
 
Bueno, paso lo que me parece:

Cambie el postmeta autoinctement agregandole "_" delante para que WP no se meta en este meta. jaja. Bueno, el header.php solo eso, queda:

PHP:
$nombre_servidor = array('1.png', '2.png', '3.png');
$tipo_audio = array('Spain.png','Portugal.png','Argentina.png'); // aqui el idioma del audio
$tipo_calidad = array('calidad1','calidad2','calidad3'); // la calidad del video
        
$enlace_roto = array('ok', 'caido'); // esto es para informar si el enlace esta ok o caido, pueden poner lo que quieran
//en todas pueden poner todas las opciones que quieran.

$add_to_ID = $_POST['seccion'];
	if ( ! is_numeric( $add_to_ID ) )
		die("Wrong ID!");
	$add_to_ID = abs(intval($add_to_ID));
	if ( ! $add_to_ID )
		die("Wrong ID!");
	global $enlace_roto;
	if (in_array($_POST['roto'],$enlace_roto)){
		$existing_list = get_post_meta($post->ID,"peliculas_data",true);
		if (isset($existing_list[$add_to_ID])){ //Verificar que el $add_to_ID exista
		$existing_list[$add_to_ID]['roto'] = $_POST['roto'];
		update_post_meta($post->ID,'peliculas_data',$existing_list);
		}
	}else{
		die("roto no definido");
	}
}

if ( !empty( $_POST['servidor']) and !empty( $_POST['enlace'])) {
	$current_user = wp_get_current_user();
	if ( is_user_logged_in() ) {
		$add_to_ID = get_post_meta($post->ID,"_linksAutoincrement",true);
		if ( empty( $add_to_ID ) )
			$add_to_ID = 0;
		$add_to_ID = $add_to_ID + 1;
		
		$existing_list = get_post_meta($post->ID,"peliculas_data",true); 
		if (empty($existing_list))
			$existing_list = array();
		$existing_list[$add_to_ID]['servidor'] = $_POST['servidor']; 
		$existing_list[$add_to_ID]['audio'] = $_POST['audio']; 
		$existing_list[$add_to_ID]['calidad'] = $_POST['calidad']; 
		$existing_list[$add_to_ID]['roto'] = $_POST['estado']; 
		$existing_list[$add_to_ID]['enlace'] = $_POST['enlace'];
    
		$existing_list[$add_to_ID]['user'] = $current_user->user_login;
		if (validarLink($existing_list[$add_to_ID])==false){
			die("Un campo no esta entre los permitidos");
		}
		if (filter_var($_POST['enlace'], FILTER_VALIDATE_URL) !== false){
			update_post_meta($post->ID,'peliculas_data',$existing_list); 
			update_post_meta($post->ID,'_linksAutoincrement', $add_to_ID);
		}else{
			die("enlace no valido!");
		}
	}else{
		die("No estas logueado!");
	}
}

O sea, del ultimo que puse solo cambie "linksAutoincrement" por "_linksAutoincrement".

El functions.php, si hay varias modificaciones, te invito a pasarle un diff luego si quieres ver las diferencias (https://www.diffnow.com/):

PHP:
function Print_peliculas_fileds($cnt, $p = null){
    global $nombre_servidor;
    global $tipo_audio;
    global $tipo_calidad;
    global $enlace_roto;
    
    if ($p === null) {
        $enlace = $user = $servidor = $audio = $calidad = $roto = '';
    } else {
        $servidor         = $p['servidor'];
        $nombre_servidors = $p['nombre_servidors'];
        $audio            = $p['audio'];
        $calidad          = $p['calidad'];
        $enlace           = $p['enlace'];
        $user             = $p['user'];
        $roto             = $p['roto'];
    }
    $retu = '<p style="margin-bottom: 22px;">';
    $retu .= '<label>Servidor</label> ';
    $retu .= '<select name="peliculas_data[' . $cnt . '][servidor]" id="servidor"> ';
    foreach ($nombre_servidor as $nombre_servidores) {
        if ($nombre_servidores == $servidor) {
            $retu .= '<option value="' . $servidor . '"  selected="slelected"  >' . $servidor . '</option>';
        } else {
            $retu .= '<option value="' . $nombre_servidores . '">' . $nombre_servidores . '</option>';
        }
    }
    $retu .= '</select>';
    $retu .= '<label>Audio :</label> ';
    $retu .= '<select name="peliculas_data[' . $cnt . '][audio]" id="audio"> ';
    foreach ($tipo_audio as $tipo_audios) {
        if ($tipo_audios == $audio) {
            $retu .= '<option value="' . $audio . '"  selected="slelected"  >' . $audio . '</option>';
        } else {
            $retu .= '<option value="' . $tipo_audios . '">' . $tipo_audios . '</option>';
        }
    }
    $retu .= '</select>';
    $retu .= '    <label>Calidad :</label>';
    $retu .= '<select name="peliculas_data[' . $cnt . '][calidad]" id="audio"> ';
    foreach ($tipo_calidad as $tipo_calidades) {
        if ($tipo_calidades == $calidad) {
            $retu .= '<option value="' . $calidad . '"  selected="slelected"  >' . $calidad . '</option>';
        } else {
            $retu .= '<option value="' . $tipo_calidades . '">' . $tipo_calidades . '</option>';
        }
    }
    $retu .= '</select>';
    $retu .= '    <label>Enlace Roto :</label>';
    $retu .= '<select name="peliculas_data[' . $cnt . '][roto]" id="audio"> ';
    foreach ($enlace_roto as $enlace_rotos) {
        if ($enlace_rotos == $roto) {
            $retu .= '<option value="' . $roto . '"  selected="slelected"  >' . $roto . '</option>';
        } else {
            $retu .= '<option value="' . $enlace_rotos . '">' . $enlace_rotos . '</option>';
        }
    }
    $retu .= '</select>';
    $retu .= '</br>';
    $retu .= '     <label>Enlace :</label>';
    $retu .= '</br>';
    $retu .= '     <input type="text" style="width: 80%;" name="peliculas_data[' . $cnt . '][enlace]" value="' . htmlentities($enlace, ENT_QUOTES) . '"/>';
    $retu .= '</br>';
    $retu .= '     <label>Usuario :</label>';
    $retu .= '</br>';
    $retu .= '     <input type="text" style="width: 80%;" name="peliculas_data[' . $cnt . '][user]" value="' . htmlentities($user, ENT_QUOTES) . '"/>';
    $retu .= '     <input type="hidden" name="peliculas_data[' . $cnt . '][new]" value="0"/>';
    $retu .= '     <input type="hidden" name="peliculas_data[' . $cnt . '][removed]" class="removeinput" value="0"/>';
    $retu .= '     <input type="hidden" name="peliculas_data[' . $cnt . '][idlink]" value="' . $cnt . '"/>';
    $retu .= '</br>';
    $retu .= '</br>';
    $retu .= '  <span style="border-radius: 3px; cursor: pointer; background: #f7f7f7; box-shadow: 0 1px 0 #ccc;border: solid 1px #ccc; padding: 5px;"class="remove">Eliminar</span>';
    $retu .= '</p>';
    return $retu;
}

//add custom field - peliculas
add_action("add_meta_boxes", "object_init");

function object_init(){
    add_meta_box("peliculas_meta_id", "Peliculas:", "peliculas_meta", "pelicula", "normal", "low");
}

function peliculas_meta(){
    global $nombre_servidor;
    global $tipo_audio;
    global $tipo_calidad;
    global $enlace_roto;
    global $post;
    $data = get_post_meta($post->ID, "peliculas_data", true);
    echo '<div id="peliculas_items">';
    if (!empty($data)) {
        foreach((array)$data as $c => $p ){  
            if (isset($p['calidad']) || isset($p['audio']) || isset($p['servidor']) || isset($p['enlace']) || isset($p['user']) || isset($p['roto'])){
                echo Print_peliculas_fileds($c, $p);
            }
        }
    }
    echo '</div>';
?>
        <span id="here"></span>
        <span class="add"><?php
    echo __('Nueva Pelicula');
    
	$add_to_ID = get_post_meta($post->ID,"_linksAutoincrement",true);
	if ( empty( $add_to_ID ) )
		$add_to_ID = 0;
	$add_to_ID = $add_to_ID + 1;
?></span>
        <script>
            var $ =jQuery.noConflict();
                $(document).ready(function() {
                var count = <?php echo $add_to_ID;?>;
                $(".add").click(function() {
                    count = count + 1;
                    $('#peliculas_items').append('<p style="margin-bottom: 22px;"><label>Servidor</label><select name="peliculas_data[' + count + '][servidor] id="servidor"><?php
    foreach ($nombre_servidor as $nombre_servidores) {
        echo '<option value="' . $nombre_servidores . '">' . $nombre_servidores . '</option>';
    }
?></select><label>Audio</label><select name="peliculas_data[' + count + '][audio] id="audio"><?php
    foreach ($tipo_audio as $tipo_audios) {
        echo '<option value="' . $tipo_audios . '">' . $tipo_audios . '</option>';
    }
?></select><label>Calidad</label><select name="peliculas_data[' + count + '][calidad] id="calidad"><?php
    foreach ($tipo_calidad as $tipo_calidades) {
        echo '<option value="' . $tipo_calidades . '">' . $tipo_calidades . '</option>';
    }
?></select><label>Enlace roto:</label><select name="peliculas_data[' + count + '][roto] id="roto"><?php
    foreach ($enlace_roto as $enlace_rotos) {
        echo '<option value="' . $enlace_rotos . '">' . $enlace_rotos . '</option>';
    }
?></select></br><label>enlace :</label><br><input type="text" style="width: 80%;" name="peliculas_data[' + count + '][enlace]" value=""/><br>    <label>usuario:</label><br><input type="text" style="width: 80%;" name="peliculas_data[' + count + '][user]" value=""/><br> <input type="hidden" name="peliculas_data[' + count + '][new]" value="1"/>  <input type="hidden" name="peliculas_data[' + count + '][removed]" class="removeinput" value="0"/>  <input type="hidden" name="peliculas_data[' + count + '][idlink]" value="' + count + '"/>  <span class="remove">Remove</span></p>');
                   return false;
                });
                $(".remove").live('click', function() {
                    $(this).parent().find(".removeinput").val("1").parent().hide();
                });
            });
        </script>
        <style>#peliculas_items {list-style: none;}</style>
    <?php
}

//Save product peliculas
add_action('save_post', 'guardar_peliculas');

function guardar_peliculas($post_id){
    global $post;
    // to prevent metadata or custom fields from disappearing... 
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
        return $post_id;
    // OK, we're authenticated: we need to find and save the data
    if (isset($_POST['peliculas_data'])) {
        $data = $_POST['peliculas_data']; 
        
	$existing_list = get_post_meta($post->ID,"peliculas_data",true); 
	if (empty($existing_list))
		$existing_list = array();
	
	$add_to_ID = get_post_meta($post->ID,"_linksAutoincrement",true);
	if ( empty( $add_to_ID ) )
		$add_to_ID = 0;
		
	foreach((array)$data as $p ){ //proceso cada link de la peticion editando el array de links de la base de datos por si alguien agrego un link mientras editaba
		if ( ! is_numeric( $p["idlink"] ) )
			die("Wrong ID!");
		$p["idlink"] = abs(intval($p["idlink"]));
		if ( ! $p["idlink"])
			die("Wrong ID!");
		if ($p["new"]=="1"){ //link nuevo
			if ($p["removed"]=="0"){ //si la agrego y elimino en la misma edicion no se hace nada
				$add_to_ID = $add_to_ID + 1;
				if (isset($existing_list[$add_to_ID]))
					die("Ya existe el ID: ".$add_to_ID);
				unset($p["removed"]);
				unset($p["new"]);
				unset($p["idlink"]);
				if (validarLink($p)==false)
					die("Un campo no esta entre los permitidos");
				if (filter_var($p['enlace'], FILTER_VALIDATE_URL) !== false){
					$existing_list[$add_to_ID] = $p;
				}else{
					die("enlace no valido: " . htmlspecialchars($p['enlace']));
				}
			}
		}else if ($p["removed"]=="1"){ //link removido
			if (isset($existing_list[$p["idlink"]]))
				unset($existing_list[$p["idlink"]]); //elimino el link (no re-indexa)
		}else if (isset($existing_list[$p["idlink"]])){
			unset($p["removed"]);
			unset($p["new"]);
			$id = $p["idlink"];
			unset($p["idlink"]);
			if (validarLink($p)==false)
				die("Un campo no esta entre los permitidos");
			if (filter_var($p['enlace'], FILTER_VALIDATE_URL) !== false){
				$existing_list[$id] = $p;
			}else{
				die("enlace no valido: " . htmlspecialchars($p['enlace']));
			}
		}
	}
	update_post_meta($post_id, 'peliculas_data', $existing_list);
	update_post_meta($post->ID, '_linksAutoincrement', $add_to_ID);
    }
}


function validarLink($p){
    global $nombre_servidor;
    global $tipo_audio;
    global $tipo_calidad;
    global $enlace_roto;
    if (in_array($p['servidor'],$nombre_servidor)){
        if (in_array($p['audio'],$tipo_audio)){
            if (in_array($p['calidad'],$tipo_calidad)){
                if (in_array($p['roto'],$enlace_roto)){
                    return true;
                }
            }
        }
    }
    return false;
}

Basicamente salve la inyeccion por url, y cambie la forma de guardar/editar. Agregue tres inputs invisibles a cada link solo en la edicion:
- "new" : este input sera 1 si es un link nuevo
- "remove" : este input sera uno si se borro de la lista (no lo borro con js como estaba sino que hago el input "1" y lo dejo de mostrar)
- "linkid": el id del link
echale un vistazo a la funcion guardar_peliculas para ver el funcionamiento.

Esto salva que si tu estas editando, y alguien aporta un link, al guardar el post el link aportado no se sobreescriba, PERO no te va a salvar de el cambio de estado de link a roto. Es decir, si estas editando y alguien pone que un link esta roto, al guardar tu sobreescribes el link y con ello la denuncia de link roto.

Con estas modificaciones vas a tener que empezar de nuevo, es decir borrar todos los links que tengas, no es ortodoxo pero se podría hacer con un php en la raiz de WP:

PHP:
require_once('wp-config.php');
include('wp-load.php');
$args = array( 'posts_per_page' => -1, 'paged' => 1 );
$wp_query = new WP_Query($args);
while ( have_posts() ) : the_post();
	delete_post_meta($post->ID, 'peliculas_data');
	delete_post_meta($post->ID, 'linksAutoincrement');
endwhile;
echo "OK";
 
wetsa perfecto a ver que tal

- - - Actualizado - - -

vale pues ya lo tengo funcionando ahora no me deja meter cualquier cosa en el campo de enlace que es lo que se pretendia asi que genial, tambien se ve el codigo mucho mejor, mas limpio. El problema de los errores que me manda sql inyection test me siguen apareciendo los mismo, como entonces evito el ataque sql?
 
wetsa perfecto a ver que tal

- - - Actualizado - - -

vale pues ya lo tengo funcionando ahora no me deja meter cualquier cosa en el campo de enlace que es lo que se pretendia asi que genial, tambien se ve el codigo mucho mejor, mas limpio. El problema de los errores que me manda sql inyection test me siguen apareciendo los mismo, como entonces evito el ataque sql?

Como yo lo veo no hay forma de una inyeccion SQL. Estas seguro que estas testiando los formularios que estamos tratando?
 
Si los errores aparecen en servidor, audio, calidad, estado, updateuser, enlace y en algunos que no tienen nombre "unnamed field"

Voy a poner lo que me tira el sql inyect me

Insertar CODE, HTML o PHP:
servidor
Submitted Form State:

    unnamed field:
    audio: Spain.png
    unnamed field:
    calidad: calidad1
    unnamed field:
    estado: ok
    unnamed field:
    updateuser: Aportar
    enlace: 

Results:
Server Status Code: 404 Not Found
Tested value: 1 AND 1=1
Server Status Code: 404 Not Found
Tested value: 1'1
Server Status Code: 404 Not Found
Tested value: 1 AND USER_NAME() = 'dbo'
Server Status Code: 404 Not Found
Tested value: 1 EXEC XP_
Server Status Code: 404 Not Found
Tested value: 1' AND 1=(SELECT COUNT(*) FROM tablenames); --
Server Status Code: 404 Not Found
Tested value: '; DESC users; --
Server Status Code: 404 Not Found
Tested value: 1'1
Server Status Code: 404 Not Found
Tested value: 1 OR 1=1
Server Status Code: 404 Not Found
Tested value: 1' OR '1'='1
This field passed 7731 tests. To see all the passed results, go to Tools->SQL Inject Me->Options and click 'Show passed results in final report' and rerun this test.



unnamed field
Submitted Form State:

    servidor: 1.png
    audio: Spain.png
    unnamed field:
    calidad: calidad1
    unnamed field:
    estado: ok
    unnamed field:
    updateuser: Aportar
    enlace: 

Results:
Server Status Code: 404 Not Found
Tested value: 1 AND USER_NAME() = 'dbo'
Server Status Code: 404 Not Found
Tested value: 1'1
Server Status Code: 404 Not Found
Tested value: '; DESC users; --
Server Status Code: 404 Not Found
Tested value: 1 AND 1=1
Server Status Code: 404 Not Found
Tested value: 1 OR 1=1
Server Status Code: 404 Not Found
Tested value: 1'1
Server Status Code: 404 Not Found
Tested value: 1' AND 1=(SELECT COUNT(*) FROM tablenames); --
Server Status Code: 404 Not Found
Tested value: 1 EXEC XP_
Server Status Code: 404 Not Found
Tested value: 1' OR '1'='1
This field passed 7731 tests. To see all the passed results, go to Tools->SQL Inject Me->Options and click 'Show passed results in final report' and rerun this test.




audio
Submitted Form State:

    servidor: 1.png
    unnamed field:
    unnamed field:
    calidad: calidad1
    unnamed field:
    estado: ok
    unnamed field:
    updateuser: Aportar
    enlace: 

Results:
Server Status Code: 404 Not Found
Tested value: 1'1
Server Status Code: 404 Not Found
Tested value: 1 AND USER_NAME() = 'dbo'
Server Status Code: 404 Not Found
Tested value: 1' AND 1=(SELECT COUNT(*) FROM tablenames); --
Server Status Code: 404 Not Found
Tested value: 1 EXEC XP_
Server Status Code: 404 Not Found
Tested value: 1 AND 1=1
Server Status Code: 404 Not Found
Tested value: '; DESC users; --
Server Status Code: 404 Not Found
Tested value: 1'1
Server Status Code: 404 Not Found
Tested value: 1' OR '1'='1
Server Status Code: 404 Not Found
Tested value: 1 OR 1=1
This field passed 7731 tests. To see all the passed results, go to Tools->SQL Inject Me->Options and click 'Show passed results in final report' and rerun this test.




unnamed field
Submitted Form State:

    servidor: 1.png
    unnamed field:
    audio: Spain.png
    calidad: calidad1
    unnamed field:
    estado: ok
    unnamed field:
    updateuser: Aportar
    enlace: 

Results:
Server Status Code: 404 Not Found
Tested value: 1 AND USER_NAME() = 'dbo'
Server Status Code: 404 Not Found
Tested value: 1'1
Server Status Code: 404 Not Found
Tested value: '; DESC users; --
Server Status Code: 404 Not Found
Tested value: 1' AND 1=(SELECT COUNT(*) FROM tablenames); --
Server Status Code: 404 Not Found
Tested value: 1 AND 1=1
Server Status Code: 404 Not Found
Tested value: 1'1
Server Status Code: 404 Not Found
Tested value: 1 EXEC XP_
Server Status Code: 404 Not Found
Tested value: 1' OR '1'='1
Server Status Code: 404 Not Found
Tested value: 1 OR 1=1
This field passed 7731 tests. To see all the passed results, go to Tools->SQL Inject Me->Options and click 'Show passed results in final report' and rerun this test.




calidad
Submitted Form State:

    servidor: 1.png
    unnamed field:
    audio: Spain.png
    unnamed field:
    unnamed field:
    estado: ok
    unnamed field:
    updateuser: Aportar
    enlace: 

Results:
Server Status Code: 404 Not Found
Tested value: 1'1
Server Status Code: 404 Not Found
Tested value: '; DESC users; --
Server Status Code: 404 Not Found
Tested value: 1 AND USER_NAME() = 'dbo'
Server Status Code: 404 Not Found
Tested value: 1' AND 1=(SELECT COUNT(*) FROM tablenames); --
Server Status Code: 404 Not Found
Tested value: 1 EXEC XP_
Server Status Code: 404 Not Found
Tested value: 1'1
Server Status Code: 404 Not Found
Tested value: 1' OR '1'='1
Server Status Code: 404 Not Found
Tested value: 1 AND 1=1
Server Status Code: 404 Not Found
Tested value: 1 OR 1=1
This field passed 7731 tests. To see all the passed results, go to Tools->SQL Inject Me->Options and click 'Show passed results in final report' and rerun this test.




unnamed field
Submitted Form State:

    servidor: 1.png
    unnamed field:
    audio: Spain.png
    unnamed field:
    calidad: calidad1
    estado: ok
    unnamed field:
    updateuser: Aportar
    enlace: 

Results:
Server Status Code: 404 Not Found
Tested value: 1'1
Server Status Code: 404 Not Found
Tested value: 1 AND USER_NAME() = 'dbo'
Server Status Code: 404 Not Found
Tested value: '; DESC users; --
Server Status Code: 404 Not Found
Tested value: 1' AND 1=(SELECT COUNT(*) FROM tablenames); --
Server Status Code: 404 Not Found
Tested value: 1 AND 1=1
Server Status Code: 404 Not Found
Tested value: 1 EXEC XP_
Server Status Code: 404 Not Found
Tested value: 1'1
Server Status Code: 404 Not Found
Tested value: 1' OR '1'='1
Server Status Code: 404 Not Found
Tested value: 1 OR 1=1
This field passed 7731 tests. To see all the passed results, go to Tools->SQL Inject Me->Options and click 'Show passed results in final report' and rerun this test.




estado
Submitted Form State:

    servidor: 1.png
    unnamed field:
    audio: Spain.png
    unnamed field:
    calidad: calidad1
    unnamed field:
    unnamed field:
    updateuser: Aportar
    enlace: 

Results:
Server Status Code: 404 Not Found
Tested value: 1'1
Server Status Code: 404 Not Found
Tested value: 1 AND USER_NAME() = 'dbo'
Server Status Code: 404 Not Found
Tested value: '; DESC users; --
Server Status Code: 404 Not Found
Tested value: 1' AND 1=(SELECT COUNT(*) FROM tablenames); --
Server Status Code: 404 Not Found
Tested value: 1 EXEC XP_
Server Status Code: 404 Not Found
Tested value: 1 AND 1=1
Server Status Code: 404 Not Found
Tested value: 1'1
Server Status Code: 404 Not Found
Tested value: 1' OR '1'='1
Server Status Code: 404 Not Found
Tested value: 1 OR 1=1
This field passed 7731 tests. To see all the passed results, go to Tools->SQL Inject Me->Options and click 'Show passed results in final report' and rerun this test.




unnamed field
Submitted Form State:

    servidor: 1.png
    unnamed field:
    audio: Spain.png
    unnamed field:
    calidad: calidad1
    unnamed field:
    estado: ok
    updateuser: Aportar
    enlace: 

Results:
Server Status Code: 404 Not Found
Tested value: 1'1
Server Status Code: 404 Not Found
Tested value: '; DESC users; --
Server Status Code: 404 Not Found
Tested value: 1 AND USER_NAME() = 'dbo'
Server Status Code: 404 Not Found
Tested value: 1' AND 1=(SELECT COUNT(*) FROM tablenames); --
Server Status Code: 404 Not Found
Tested value: 1 AND 1=1
Server Status Code: 404 Not Found
Tested value: 1 EXEC XP_
Server Status Code: 404 Not Found
Tested value: 1'1
Server Status Code: 404 Not Found
Tested value: 1' OR '1'='1
Server Status Code: 404 Not Found
Tested value: 1 OR 1=1
This field passed 7731 tests. To see all the passed results, go to Tools->SQL Inject Me->Options and click 'Show passed results in final report' and rerun this test.




updateuser
Submitted Form State:

    servidor: 1.png
    unnamed field:
    audio: Spain.png
    unnamed field:
    calidad: calidad1
    unnamed field:
    estado: ok
    unnamed field:
    enlace: 

Results:
Server Status Code: 404 Not Found
Tested value: 1'1
Server Status Code: 404 Not Found
Tested value: '; DESC users; --
Server Status Code: 404 Not Found
Tested value: 1 AND USER_NAME() = 'dbo'
Server Status Code: 404 Not Found
Tested value: 1' AND 1=(SELECT COUNT(*) FROM tablenames); --
Server Status Code: 404 Not Found
Tested value: 1 AND 1=1
Server Status Code: 404 Not Found
Tested value: 1 EXEC XP_
Server Status Code: 404 Not Found
Tested value: 1'1
Server Status Code: 404 Not Found
Tested value: 1' OR '1'='1
Server Status Code: 404 Not Found
Tested value: 1 OR 1=1
This field passed 7731 tests. To see all the passed results, go to Tools->SQL Inject Me->Options and click 'Show passed results in final report' and rerun this test.




enlace
Submitted Form State:

    servidor: 1.png
    unnamed field:
    audio: Spain.png
    unnamed field:
    calidad: calidad1
    unnamed field:
    estado: ok
    unnamed field:
    updateuser: Aportar

Results:
Server Status Code: 404 Not Found
Tested value: 1'1
Server Status Code: 404 Not Found
Tested value: '; DESC users; --
Server Status Code: 404 Not Found
Tested value: 1 AND USER_NAME() = 'dbo'
Server Status Code: 404 Not Found
Tested value: 1' AND 1=(SELECT COUNT(*) FROM tablenames); --
Server Status Code: 404 Not Found
Tested value: 1 AND 1=1
Server Status Code: 404 Not Found
Tested value: 1 EXEC XP_
Server Status Code: 404 Not Found
Tested value: 1'1
Server Status Code: 404 Not Found
Tested value: 1 OR 1=1
Server Status Code: 404 Not Found
Tested value: 1' OR '1'='1
This field passed 7731 tests. To see all the passed results, go to Tools->SQL Inject Me->Options and click 'Show passed results in final report' and rerun this test.
 
Última edición:
Agregue todo el código en una instalación que tengo de WP y corri con "SQL inyect me" el botón "Test all forms with alls attacks" y obtuve todo verde, ningún error: https://jsfiddle.net/p01bn1LL/

Para lo del mail sacaría el select, quedando la parte de mostrar:
PHP:
<?php
    $data = get_post_meta($post->ID,"peliculas_data",true);
    global $enlace_roto;
?>
    <div class="links_servs">
    <table>
    <tbody>
    <tr>
        <th>SERVIDOR</th>
        <th>AUDIO</th>
        <th>CALIDAD</th>
        <th>VER ONLINE</th>
        <th>¿ENLACE ROTO?</th>
        <th>USUARIO</th>
    </tr>
    <?php     
    if (count($data) > 0){
        foreach((array)$data as $cnt => $p ){
            if (isset($p['calidad']) || isset($p['audio'])|| isset($p['servidor'])|| isset($p['enlace'])|| isset($p['roto'])|| isset($p['user'])){
            ?>
                <tr>
                    <td class="server" > <img src="wp-content/themes/Mogambo/images/foto-<?php echo $p['servidor']; ?>"></img>   </td>
                    <td class="idioma"><img src="wp-content/themes/Mogambo/images/flag/<?php echo $p['audio']; ?>"></img></td>
                    <td class="calidad"><?php echo $p['calidad']; ?></td>
                    <td><a href="<?php echo htmlentities($p['enlace'], ENT_QUOTES);?>" class="url_download" target="_blank">Reproducir</a></td>
                    <td>
                        <form method="post" id="adduser" action="<?php the_permalink(); ?>">
                            <p class="form-submit">
                                <input name="updateuser" type="submit" id="updateuser" class="submit button" value="Actualizar" />
                                <input name="seccion" type="hidden" id="action" value="<?php echo $cnt; ?>" />
                            </p>
                        <td class="user"><?php echo htmlspecialchars($p['user']); ?></td>
                        </form>
                    </td>
                </tr>
            <?php
            }
        }
    }
    ?>

y en el header.php, remplazaría lo de "if ( !empty($_POST['seccion']) )" por algo así:

PHP:
if (  !empty($_POST['seccion']) ) {
	$add_to_ID = $_POST['seccion'];
	if ( ! is_numeric( $add_to_ID ) )
		die("Wrong ID!");
	$add_to_ID = abs(intval($add_to_ID));
	if ( ! $add_to_ID )
		die("Wrong ID!");
	$existing_list = get_post_meta($post->ID,"peliculas_data",true);
	if (isset($existing_list[$add_to_ID])){ //Verificar que el $add_to_ID exista
		$current_user = wp_get_current_user();
		$denunciante = "Anonimo";
		if ( is_user_logged_in() )
			$denunciante = $current_user->user_login;
		$p = $existing_list[$add_to_ID];
		$html = 'Enlace roto: '.htmlspecialchars($p['enlace']).'<br>\n';
		$html .= 'Denunaciado por: '.$denunciante.'<br>\n';
		$html .= 'Denunaciado con IP: '.$_SERVER['HTTP_CLIENT_IP'].'<br>\n';
		$html .= 'Link del post: '.get_permalink($post->ID).'<br>\n';
		$headers = array('Content-Type: text/html; charset=UTF-8');
		wp_mail( 'tumail@gmail.com', 'Link roto', $html, $headers);
		die("Se a registrado que el link para revision.");
	}else{
		die("El enlace ya no existe!");
	}
}
 
Última edición:
No, nada que ver con msDropDown, déjalo que no hay problemas, solo procesa en el cliente valores definidos por ti en php. Te recomiendo estudiar y entender los problemas de inyección.
Solo busca si msDropDown tiene documentación y como hacer para que no sea editable (por elegancia, no es que sea editable lo hace menos seguro, cualquier persona con mínimo conocimiento puede enviar el valor que quiera en cada campo, sea select o input). No hay forma de hacer un select con imágenes simplemente con HTML(por lo menos crossbrowser), asique si no dependes de msDropDown, dependes de otra librería.
 
no he tenido mucho tiempo para contestar y como me dijo que no me preocupase por la seguridad de msDropDown que simplemente seria por estética, decide dejarlo para la ultimo y sigo con el tema de seguridad que es lo que me importa realmente de esto y es que me di cuenta que claro, el usuario puede aportar enlaces y eso me asusta. Que pasaria si un usuario decide subir enlaces pornos o repetir enlaces a su web o publicidad o...o....o....puede aportar realmente lo que quiera y eso no me parece del todo correcto.
Entonces he estado buscando la forma de validar una direccion y encuentro codigos de como verificar una direccion especifica como por ejemplo:

PHP:
$website = test_input($_POST["website"]);
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) {
  $websiteErr = "Invalid URL"; 
}

O este:

PHP:
<?php
//El fichero que quieres comprobar
$url='http://www.fotoefectos.com/mrbean.jpg';
$contents = file_get_contents("$url");

if (strlen($contents))
{
echo "si"; // Si que existe
}
else
{
echo "no"; // No existe!!
}
?>

Pero yo necesito que se compruebe que las direcciones que introduzcan en "enlace" llevan a los servidores que yo elija por ejemplo una lista donde pueda definir ciertos servidores, streamcloud, powvideo,nowvideo.... y no pueda introducir una direccion que no aparezca en la lista como google.es o http://forobeta.com/ :witless: por ejemplo, obligandoles a escribir el nombre de algun servidor(palabra clave) en el input "enlace" y a su vez cumpruebe que la direccion existe y el enlace no esta repetido ( no se si me explico con claridad) el caso es que no soy capaz de conseguir ni siquiera acercarme a la informacion que busco

EDITO*
No se si lo que quiero hacer, como lo he expuesto, seria de la forma correcta, pero empiezo a dudarlo pues lo unico que encuentro es para validar una dirección o una cadena, aun que no termino de enterarme
 
Última edición:
No se si se esta distorsionando el hilo.

Puedes cambiar en el header la linea para validar el url

PHP:
        if (filter_var($_POST['enlace'], FILTER_VALIDATE_URL) !== false){

remplazandola por ejemplo por:

PHP:
        if (validateUrl($_POST['enlace']){

Y definiendo la funcion validateUrl, algo asi:

PHP:
function validateUrl($toadd){
	$regexUrls = Array('uptobox'=>Array('@^https?://(www\\.)?uptobox.com/[/\\w]*@i','@^https?://(www\\.)?uptostream.com/[/\\w]*@i'), 'mediafire'=>Array('@^https?://(www\\.)?mediafire.com/[\\W\\w]*@i') );
	if (filter_var($toadd, FILTER_VALIDATE_URL) !== false){
		if (isset($regexUrls[$_POST['servidor']])){
			foreach ($regexUrls[$_POST['servidor']] as $pattern){
				if (preg_match($pattern, $toadd)===1){
					return true;
				}
			}
		}
	}
	return false;
}

Siendo $regexUrls un array de arrays con las expresiones regulares para validar un link, siendo la key el servidor. En este ejemplo para uptobox puse dos expresiones aceptando también un link de uptostream como valido.

$regexUrls = Array('uptobox'=>Array('@^https?://(www\\.)?uptobox.com/[/\\w]*@i','@^https?://(www\\.)?uptostream.com/[/\\w]*@i'), 'mediafire'=>Array('@^https?://(www\\.)?mediafire.com/[\\W\\w]*@i') );

Lo de msDropdown, viendo su código, que puedas escribir no es para editar sino un filtro para la lista, para deshabilitarlo debes pasarle enableAutoFilter:false cuando lo inicias, algo así:

$("select").msDropdown({enableAutoFilter:false});
 
Gracias de nuevo wetsa, no se que aria sin ti, de verdad.
Espero no estar distorsionándolo, al fin y al cabo es una función mas para el código de este hilo. Lo que si pienso es que un hilo como este debería de estar siempre entre los primeros, pues contiene muchísima información útil y que escasea por la red, si no miren las visitas del hilo, no se del tiempo que dispones wetsa pero de aquí sacamos un tutorial ajajaj.

Voy a probar lo que me comentas y comento.

un abrazo

- - - Actualizado - - -

pues estoy probando y algo no funciona bien

en la linea
PHP:
if (validateUrl($_POST['enlace'],){

si la remplazo tal cual me da error

quedando asi, tira bien, no da error

PHP:
if (validateUrl($_POST['enlace'], FILTER_VALIDATE_URL) !== false){

pero no se si es la forma correcta, pues intento añadir un enlace de este tipo:
Insertar CODE, HTML o PHP:
http://videomega.tv/?ref=uC0asCY6h1
y me dice que no es valido. e agregado antes de introducir el enlace, en la funcion lo siguiente:

PHP:
'videomega'=>Array('@^http?://(www\\.)?videomega.tv/[\\W\\w]*@i')

cual es el problema?

EDITO*

pienso que lo correcto seria, que el usuario al seleccionar una imagen del servidor, automáticamente en el input tenga acceso a subir enlaces solo de ese servidor, asi de paso la imagen siempre estaría asociada al servidor y la dirección que tendría que introducir el usuario seria por ejemplo:
Insertar CODE, HTML o PHP:
?ref=uC0asCY6h1
añadiéndose al enlace automáticamente
Insertar CODE, HTML o PHP:
http://videomega.tv/
al seleccionar la imagen del servidor. Que se compruebe si esa direccion existe y se suba, no se si me explico bien
 
Última edición:
fijate que cuando puse:

PHP:
 if (validateUrl($_POST['enlace']){

me falto crrar un parentesis:

PHP:
 if (validateUrl($_POST['enlace'])){

Lo de video mega esta correcta, quedaría:

PHP:
$regexUrls = Array('uptobox'=>Array('@^https?://(www\\.)?uptobox.com/[/\\w]*@i','@^https?://(www\\.)?uptostream.com/[/\\w]*@i'), 'mediafire'=>Array('@^https?://(www\\.)?mediafire.com/[\\W\\w]*@i'),'videomega'=>Array('@^http?://(www\\.)?videomega.tv/[\\W\\w]*@i') );
 
EDITO * iba a añadir información y sin querer e borrado el comentario pero bueno no importa, acabo de probar y no me deja subir el enlace, me dice que el enlace no es valido
Insertar CODE, HTML o PHP:
http://videomega.tv/?ref=uC0asCY6h1

tampoco puedo
Insertar CODE, HTML o PHP:
http://streamcloud.eu/g994pe17mfrn/The.Hateful.Eight.2015.DVDScr.XVID.AC3.HQ.Hive-CM8.mp4.html
la verdad que no consigo subir ningún enlace
 
Última edición:
Prueba creando un php para testear, por ejemplo probar.php:
PHP:
<?php 

$_POST['servidor'] = $_GET['servidor'];

if (validateUrl($_GET['url'])){
	die('Link correcto!');
}else{
	die('Link incorrecto )=');
}

function validateUrl($toadd){
	$regexUrls = Array('uptobox'=>Array('@^https?://(www\\.)?uptobox\\.com/[/\\w]*@i','@^https?://(www\\.)?uptostream\\.com/[/\\w]*@i'), 'mediafire'=>Array('@^https?://(www\\.)?mediafire\\.com/[\\W\\w]*@i'),'videomega'=>Array('@^http?://(www\\.)?videomega\\.tv/[\\W\\w]*@i'),'streamcloud'=>Array('@^http?://(www\\.)?streamcloud\\.eu/[\\W\\w]*@i') );
	if (filter_var($toadd, FILTER_VALIDATE_URL) !== false){
		if (isset($regexUrls[$_POST['servidor']])){
			foreach ($regexUrls[$_POST['servidor']] as $pattern){
				if (preg_match($pattern, $toadd)===1){
					return true;
				}
			}
		}
	}else{
		die("url no valida");
	}
	return false;
}
?>


Y luego pruebas:

http://localhost/probar.php?servidor=videomega&url=http://videomega.tv/?ref=uC0asCY6h1
http://localhost/probar.php?servidor=streamcloud&url=http://streamcloud.eu/g994pe17mfrn/The.Hateful.Eight.2015.DVDScr.XVID.AC3.HQ.Hive-CM8.mp4.html

A mi me funciona sin problemas, uso hhvm pero no creo que influya.
 
Atrás
Arriba