<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=Curso_POO_PHP_Cross-Site_Scripting</id>
	<title>Curso POO PHP Cross-Site Scripting - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=Curso_POO_PHP_Cross-Site_Scripting"/>
	<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=Curso_POO_PHP_Cross-Site_Scripting&amp;action=history"/>
	<updated>2026-10-22T06:43:00Z</updated>
	<subtitle>Historial de revisiones de esta página en la wiki</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://manuais.iessanclemente.net/index.php?title=Curso_POO_PHP_Cross-Site_Scripting&amp;diff=36487&amp;oldid=prev</id>
		<title>Vlourido: /* Contido pasado como valor a unha variable dun linguaxe de script */</title>
		<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=Curso_POO_PHP_Cross-Site_Scripting&amp;diff=36487&amp;oldid=prev"/>
		<updated>2013-07-20T17:48:19Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Contido pasado como valor a unha variable dun linguaxe de script&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Cross-Site Scripting (XSS) ==&lt;br /&gt;
&lt;br /&gt;
Unha páxina ou sitio web vulnerable a un ataque XSS permite ao atacante introducir e executar na páxina o seu propio código en linguaxe de script (xeralmente Javascript).&lt;br /&gt;
&lt;br /&gt;
Por exemplo, se no noso blogue deixamos aos usuarios introducir comentarios ás novas, e non comprobamos o seu contido, algún podería introducir a seguinte cadea de texto como comentario:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;window.location = &amp;quot;http://www.google.es&amp;quot;;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isto non supón un problema á hora de almacenarse na base de datos, como sucedía coas inxeccións SQL. O problema ven cando amosamos esa información en pantalla, por exemplo cada vez que alguén visita a noticia que publicamos no noso blogue. Nese caso publicarase o comentario malicioso, executarase o código javascript e o navegador redireccionará ao usuario a outra páxina.&lt;br /&gt;
&lt;br /&gt;
A solución ao problema é revisar e modificar os contidos de orixe alleo (por exemplo os que proveñen de información almacenada nunha base de datos, ou os introducidos polos usuarios) que se publican no sitio web, principalmente nas seguintes ubicacións:&lt;br /&gt;
&lt;br /&gt;
* Como parte do corpo da páxina web.&lt;br /&gt;
* Como valor dun atributo dun elemento HTML.&lt;br /&gt;
* Como parte dunha folla de estilos.&lt;br /&gt;
* Como parte dunha URL (nos enlaces ou nas redireccións).&lt;br /&gt;
* Como parte dun código en linguaxe de script xerado dinámicamente.&lt;br /&gt;
&lt;br /&gt;
Imos ver como protexer o noso código fronte as principais vulnerabilidades XSS.&lt;br /&gt;
&lt;br /&gt;
=== Contido publicado no corpo dunha páxina web ===&lt;br /&gt;
&lt;br /&gt;
Neste caso temos que vixiar a presenza no texto de etiquetas HTML como por exemplo &amp;quot;&amp;lt;script&amp;gt;&amp;quot;. Temos varias alternativas en función do que procuremos:&lt;br /&gt;
&lt;br /&gt;
* Eliminar completamente as etiquetas HTML presentes no texto. Neste caso podemos empregar a función &amp;#039;&amp;#039;&amp;#039;[http://es1.php.net/manual/es/function.strip-tags.php strip_tags]&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$saida = strip_tags($texto);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:É posible indicar como parámetro algunhas etiquetas que queremos que se poidan empregar. Por exemplo, poderíamos deixar poñer enlaces como parte dos comentarios dun blogue.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$saida = strip_tags($texto, &amp;quot;&amp;lt;a&amp;gt;&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:É importante suliñar que a función strip_tags non comproba a validez do código HTML que procesa, polo que o texto obtido pode ter etiquetas sin pechar ou mal anidadas.&lt;br /&gt;
&lt;br /&gt;
* Converter as etiquetas presentes no texto ás súas respectivas entidades HTML, para que poidan visualizarse correctamente pero non formen parte da estrutura da páxina. Para isto podemos empregar as funcións &amp;#039;&amp;#039;&amp;#039;[http://es1.php.net/manual/es/function.htmlentities.php htmlentities]&amp;#039;&amp;#039;&amp;#039; ou &amp;#039;&amp;#039;&amp;#039;[http://es1.php.net/manual/es/function.htmlspecialchars.php htmlspecialchars]&amp;#039;&amp;#039;&amp;#039;, dependende de se queremos converter a entidades todos os caracteres posibles ou soamente os máis significativos preservando o resto.&lt;br /&gt;
&lt;br /&gt;
: htmlspecialchars traduce en entidades soamente os caracteres &amp;#039;&amp;#039;&amp;#039;&amp;amp;amp;&amp;#039;&amp;#039;&amp;#039; (&amp;amp;amp;amp;), &amp;#039;&amp;#039;&amp;#039;&amp;amp;apos;&amp;#039;&amp;#039;&amp;#039; (&amp;amp;amp;apos;), &amp;#039;&amp;#039;&amp;#039;&amp;amp;quot;&amp;#039;&amp;#039;&amp;#039; (&amp;amp;amp;quot;), &amp;#039;&amp;#039;&amp;#039;&amp;amp;lt;&amp;#039;&amp;#039;&amp;#039; (&amp;amp;amp;lt;) e &amp;#039;&amp;#039;&amp;#039;&amp;amp;gt;&amp;#039;&amp;#039;&amp;#039; (&amp;amp;amp;gt;).&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$saida = htmlentities($texto);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tamén é posible empregar a libraría &amp;#039;&amp;#039;&amp;#039;[http://htmlpurifier.org/ HTML Purifier]&amp;#039;&amp;#039;&amp;#039;, que entre outras melloras aporta a verificación da validez do código HTML e a comprobación dos atributos.&lt;br /&gt;
&lt;br /&gt;
=== Contido publicado como parte dunha URL ===&lt;br /&gt;
&lt;br /&gt;
As veces é necesario empregar contido de orixe alleo como parte dunha URL. Por exemplo, se queremos facer unha busca en Google dun termo introducido polo usuario como &amp;quot;PHP&amp;quot;, podemos facelo coa URL &amp;#039;&amp;#039;&amp;lt;nowiki&amp;gt;&amp;quot;http://www.google.es/search?q=PHP&amp;quot;&amp;lt;/nowiki&amp;gt;&amp;#039;&amp;#039;. Isto é:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$url = &amp;quot;http://www.google.es/search?q=&amp;quot; . $_REQUEST[&amp;quot;termo_busca&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para asegurar que a URL é válida e se axusta aos nosos requerimentos, debemos filtrar a cadea engadida para transformar caracteres como os espazos ou as barras empregando a notación do símbolo de porcentaxe seguido de dous díxitos hexadecimais. En PHP a función &amp;#039;&amp;#039;&amp;#039;[http://es1.php.net/manual/es/function.rawurlencode.php rawurlencode]&amp;#039;&amp;#039;&amp;#039; encárgase da devandita transformación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$url = &amp;quot;http://www.google.es/search?q=&amp;quot; . rawurlencode($_REQUEST[&amp;quot;termo_busca&amp;quot;]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Outra función semellante é &amp;#039;&amp;#039;&amp;#039;[http://es1.php.net/manual/es/function.urlencode.php urlencode]&amp;#039;&amp;#039;&amp;#039;, na que soamente cambia a transformación dos espazos con respecto á función anterior. En rawurlencode os espazos tranfórmanse en %20, seguindo as normas da RFC3986. En urlencode, que se mantén por razóns históricas e de compatibilidade con sistemas antigos, os espazos tranfórmanse no caracter &amp;quot;+&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Contido pasado como valor a unha variable dun linguaxe de script ===&lt;br /&gt;
&lt;br /&gt;
En ocasións necesitamos insertar código na páxina web que se envía ao navegador. Por exemplo, se queremos engadir algún tipo de validación no lado cliente antes de enviar un formulario, poderíamos engadir un atributo á etiqueta &amp;quot;&amp;lt;form&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form onsubmit=&amp;quot;return validar(this);&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se imos xerar de forma dinámica parte do código Javascript que se envíe ao cliente, deberemos comprobar previamente a súa seguridade. Por exemplo, cando facemos algo como:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;x=&amp;#039;&amp;lt;?php echo $x; ?&amp;gt;&amp;#039;;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E a variable $x vale algo como &amp;#039;&amp;#039;&amp;#039;&amp;lt;nowiki&amp;gt;&amp;#039;,window.location = &amp;quot;http://www.google.es&amp;quot;,//&amp;lt;/nowiki&amp;gt;&amp;#039;&amp;#039;&amp;#039;, o resultado é a redirección do navegador a outra páxina.&lt;br /&gt;
&lt;br /&gt;
Nestes casos a mellor solución é empregar codificación JSON (JavaScript Object Notation) para o valor da variable, botando mán da función &amp;#039;&amp;#039;&amp;#039;[http://es1.php.net/manual/es/function.json-encode.php json_encode]&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;x=&amp;#039;&amp;lt;?php echo json_encode($x); ?&amp;gt;&amp;#039;;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[Usuario:Vlourido|Víctor Lourido]] 12:42 19 jul 2013 (CEST)&lt;/div&gt;</summary>
		<author><name>Vlourido</name></author>
	</entry>
</feed>