miércoles, 21 de diciembre de 2011

Tags especiales en ASP.NET

Voy a hacer un resumen de las etiquetas o tags especiales que usa ASP.NET para hacer "scripting"

<%  %>  Bloques de código incrustado
http://msdn.microsoft.com/es-es/library/ms178135.aspx

Como indica su definición, sirven para incrustar bloques de código.

<%@ Page Language="C#"%>
<html>
<body>
    <%string[] semana = { "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo" };%>     <ul>
        <%foreach (var s in semana)
        {
            Response.Write("<li>"+s+"</li>");
        }
        %>
    </ul>
</body>
</html>


<%= %> Response.Write
http://msdn.microsoft.com/es-es/library/6dwsdcf5.aspx

Esta etiqueta sustituye al Response.Write

<%@ Page Language="C#"%>
<html>
<body>
    <% string nombre="Pepe";%>
    <span>Hola, <%=nombre%></span>
</body>
</html>


<%# %> Expresión de datos enlazados
http://msdn.microsoft.com/es-es/library/bda9bbfx.aspx

Esta etiqueta crea un enlace a un origen de datos.

<%@ Page Language="C#"%>
<html>
<body>
    <script language="C#" runat="server">
        void BtnClick(Object sender, EventArgs e) {
          Page.DataBind();
        }
    </script>

    <form runat="server">
        <label>Nombre:</label>
        <asp:TextBox runat="server" id="Nombre"></asp:TextBox>
        <br />
        <asp:button Text="Saluda!!!" OnClick="BtnClick" runat="server"/>      
        <br />
        Hola, <%#Nombre.Text%>         <br />
        Hola, <%#DataBinder.Eval(Nombre,"Text")%>         <br />
        Hola, <%#DataBinder.GetPropertyValue(Nombre,"Text")%>     </form>
</body>
</html>



<%$ %> Expresión de ASP.NET
http://msdn.microsoft.com/es-es/library/d5bd1tad.aspx

Evalúa expresiones basadas en cadenas de conexión, configuración de aplicación, recursos,...

Para este ejemplo, he añadido un recurso global y he añadido una cadena


 Nuestro Web.Config tiene las siguientes entradas:

   <connectionStrings>
    <add name="NorthwindConnectionString"
        connectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
        providerName="System.Data.SqlClient" />
  </connectionStrings>

  <appSettings>
    <add key="Clave1" value="Valor1"/>
  </appSettings>


Nuestra página ASP.NET:


El recurso almacenado es: <asp:Label id="label1" runat="server" Text="<%$Resources:Resource, TextoAlmacenado1 %>"/>     
<br />
El valor almacenado en el AppSettings del Web.config es: <asp:Label id="label2" runat="server" Text="<%$AppSettings:Clave1 %>"/>
<br />
<asp:SqlDataSource ID="SqlDataSource1" Runat="server"
    SelectCommand="SELECT * FROM [Employees]"
    ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>">
    </asp:SqlDataSource>


<%@ %> Directivas de plantilla de texto
http://msdn.microsoft.com/es-es/library/xz702w3e.aspx

Se usan en las directivas de configuración de páginas, controles, etc.

<%@ Page Title="Hello, world" Language="C#"%>

<%-- --%> Comentarios de servidor
http://msdn.microsoft.com/es-es/library/4acf8afk.aspx


Son los comentarios de ASP.NET



<%: %> HtmlEncoding
http://weblogs.asp.net/scottgu/archive/2010/04/06/new-lt-gt-syntax-for-html-encoding-output-in-asp-net-4-and-asp-net-mvc-2.aspx

Este tag sólo está disponible a partir de ASP.NET 4.0

Es el equivalente a Server.HtmlEncode, función usada para evitar ataques de inyección de scripts.

En el ejemplo siguiente, vemos que <%=cadena%> muestra "texto", mientras que <%:cadena%> muestra "<b>Texto<b>"




<%@ Page Language="C#"%>
<html>
<body>
    <%string cadena = "<b>Texto</b>";%>
    <%=cadena%>
    <br />
    <%:cadena%>
</body>
</html>

miércoles, 14 de diciembre de 2011

Liberar el puerto 80 en Windows 7

Me acaba de pasar que, a la hora de depurar un proyecto, el Visual Studio me obsequie con este mensajito:

No se puede iniciar el servidor de desarrollo de Visual Studio.
El puerto 80 está en uso.


El problema es que hay algún servicio que está ocupando el puerto 80, y el servidor de desarrollo de VS "Cassini" no se puede arrancar.

Una solución es cambiar el puerto en el servidor de desarrollo.
En el proyecto, botón derecho, propiedades, y le cambiamos el puerto




Si no queremos cambiar el puerto, otra solución es encontrar el servicio que lo ocupa.
Para ello, abrimos la consola (cmd) y ejecutamos "netstat -ab"


Allí vemos que el TCP 80 lo tiene ocupado un servicio del que no tenemos más información.
Así que nos toca ir a los servicios que pudieran ser sospechosos de estar ocupando el puerto 80, pararlos y probar el "netstat -ab" hasta que el puerto 80 quede liberado.

Para parar los servicios, escribid "services.msc" en el botón "inicio -> buscar programas y archivos"

Los servicios que son candidatos a ocupar el puerto 80 son:
"Servicio Agente de implementación web" (lo instala el Web Deploy 2.0)
"SQL Server Reporting Services (MSSQLSERVER)"
"SQL Server Integration Services 10.0"
 "BrandCache"

Internet Information Server y el Apache o XAMPP también se cogen el puerto 80 por defecto.

La solución correcta es, una vez detectado el programa que lo ocupa, cambiarlo en su configuración a otro puerto en vez de ir parando servicios.

viernes, 2 de diciembre de 2011

Error en el DNS-323: Acceso denegado




Tengo un NAS D-Link DNS-323.

 En él confío todos mis documentos, fotos, programas, etc.

Tiene 2 discos duros y se puede configurar para usarlos por separado, linealmente, Raid0 o Raid1 (en espejo).

Ya empezaba a confiar plenamente en él cuando, de repente un día, al acceder a una carpeta, aparece un mensaje de error:"ACCESO DENEGADO".

Recorro todo el disco y veo que hay algunos archivos y carpetas con ese problema. No puede verlos, ni copiarlos, ni moverlos...

Un sudor frío recorre mi cuerpo cuando veo carpetas de fotos de momentos importantes con ese problema.


WTF?  (¿Pero qué narices le pasa?)

El DNS-323 lleva internamente Linux, y expone un servidor samba a la red.
Parece que el Windows Vista y Windows 7, al haber aumentado los niveles de seguridad, ha perdido alguna compatibilidad con Samba, en el modo Share.

He recopilado los siguientes enlaces que hablan del tema.

http://www.sevenforums.com/network-sharing/3737-samba-network-share-issue-windows-7-a-3.html

http://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-rg-es-4/s1-samba-security-modes.html

http://superuser.com/questions/115337/windows-7-connecting-to-samba-shares

http://www.arkko.com/linux/vistanas.html

Como solución, casi todos hablan de rebajar el nivel de seguridad de Windows7 y ponerlo a la altura de Samba, o cambiar el modo de seguridad de Share a User


Opté por otra línea de trabajo; y así poder saber recuperar los documentos (que es realmente lo que me interesa) : Poder dar permisos a los ficheros.

Aprovechando que el firmware del dns-323 puede ejecutar scripts, instalamos un software llamado fun_plug que nos monta un linux con su servicio Telnet arrancado.


En este enlace se explica de forma extensa los pasos a seguir.
http://nas-tweaks.net/40/installation-of-the-fonz-funplug-0-5-for-ch3snas-ch3mnas-dns-323-and-many-more/

Los pasos a seguir son:
  • Nos descargamos los ficheros fun_plug y fun_plug.tgz de aquí.
  • Lo copiamos al raíz del DNS-323
  • Reiniciamos.
A partir de ahora, tendremos el telnet activado.
También tendremos una carpeta "ffp" que es el sistema de ficheros que ha creado.

Por línea de comando, podemos hacer "telnet 192.168.2.X" (ojo, poned la IP vuestra :))

Para aplicar contraseña, seguiremos los siguientes pasos dentro del telnet:

pwconv
passwd
usermod -s /ffp/bin/sh root

pwck
grpck

login

Comprobamos que funciona todo bien.

Ahora guardamos el password con el comando
store-passwd.sh

Con estos pasos, tenemos acceso al NAS a través de un telnet protegido por contraseña.

Ahora queda localizar las carpetas y ver qué permisos tienen los archivos.

Con ls -l tenemos una vista a los permisos de los ficheros.
El disco se monta en /mnt/HD_a2















Los casos de ficheros que daban problemas tenían permisos rwx --- --- y usuario nobody.

(El usuario Nobody es equivalente al usuario anónimo).

Sin meternos en tema de usuarios, grupos y demás, nos situamos en el directorio de archivos que queramos cambiar y ejecutaremos:

chmod 777 *

Si queremos cambiar los permisos en los subdirectorios:

chmod -R 777 *

En este caso, podemos ver que los permisos cambian a rwx rwx rwx, y ya son accesibles desde Windows.

Esto es todo; espero que os sea de utilidad.