<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Maestros del Web &#187; Cesar Manivesa</title>
	<atom:link href="http://www.maestrosdelweb.com/author/cesar-manivesa/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.maestrosdelweb.com</link>
	<description>Un espacio para los entusiastas del web</description>
	<pubDate>Mon, 13 Oct 2008 07:29:37 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.2</generator>
	<language>en</language>
			<item>
		<title>Instalación y administración de SQL Server 2000</title>
		<link>http://www.maestrosdelweb.com/editorial/sql2kinstal/</link>
		<comments>http://www.maestrosdelweb.com/editorial/sql2kinstal/#comments</comments>
		<pubDate>Wed, 24 Mar 2004 00:00:00 +0000</pubDate>
		<dc:creator>Cesar Manivesa</dc:creator>
		
		<category><![CDATA[Bases de Datos]]></category>

		<category><![CDATA[Editorial]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Durante la instalación y administración del SQL Server 2000 es necesario tener presente en todo momento la seguridad del servidor. Para ello una de las tareas más importantes es la creación y control de usuarios.
El SQL Server se instala en
  Windows 2000 como un servicio y por tanto es necesario asignar un usuario para
 [...]]]></description>
			<content:encoded><![CDATA[<p><span class="intro">Durante la instalación y administración del SQL Server 2000 es necesario tener presente en todo momento la seguridad del servidor. Para ello una de las tareas más importantes es la creación y control de usuarios.</span><span id="more-229"></span></p>
<p><img src="/images/editorial/sql2kinstal1.gif" width="89" height="128" class="lateral" alt="2K" />El SQL Server se instala en<br />
  Windows 2000 como un servicio y por tanto es necesario asignar un usuario para<br />
  que inicie ese servicio y para que el SQL Server trabaje en ese contexto de<br />
  seguridad. Este usuario que asignaremos a los servicios SQL Server y SQL Server<br />
  Agent (habitualmente se utiliza el mismo para los dos servicios) puede ser o<br />
  bien la cuenta local del sistema o una cuenta del dominio asignada por nosotros.</p>
<p>Por norma general escogeremos la segunda de las opciones y crearemos una cuenta<br />
  en el dominio especialmente dedicada a los servicios de SQL Server, porque s&oacute;lo<br />
  de esta manera el SQL Server podr&aacute; acceder a archivos de otros equipos,<br />
  planear trabajos entre varios servidores, realizar copias de seguridad en ubicaciones<br />
  de red, mandar notificaciones mediante email, hacer modificaciones en el registro&#8230;</p>
<p> La cuenta que vamos a crear en el dominio para el SQL Server deber&aacute; tener<br />
  las siguientes caracter&iacute;sticas:<br />
  &#8226;&nbsp;Miembro del grupo local administradores,</p>
<p>  &#8226;&nbsp;Activado el atributo &#8220;La contrase&ntilde;a no caduca nunca&#8221;,<br />
  &#8226;&nbsp;Permitido el inicio de sesi&oacute;n a todas las horas,<br />
  &#8226;&nbsp;Permitido iniciar sesi&oacute;n como servicio.</p>
<p>Adem&aacute;s   de esto necesitaremos una cuenta en el servidor de correo Exchange si queremos<br />
  que el SQL Server Agent pueda comunicarse con nosotros a trav&eacute;s del correo<br />
  para enviarnos avisos, notificaciones, alertas&#8230;</p>
<h3>Los usuarios:</h3>
<p> <img src="/images/editorial/sql2kinstal3.gif" width="68" height="100" class="lateral" alt="2k2" />En SQL Server 2000 los usuarios<br />
  pueden ser de dos tipos dependiendo del modelo de seguridad elegido. Usuarios<br />
  de <a href="http://www.maestrosdelweb.com/principiantes/historia-de-windows/">Windows</a>, creados en el dominio y administrados desde la herramienta &#8220;usuarios<br />
  y equipos del dominio&#8221;, y usuarios propios de SQL Server. Para utilizar<br />
  estos &uacute;ltimos usuarios es necesario configurar el servidor SQL en modo<br />
  de autentificaci&oacute;n mixto.</p>
<p> La mejor manera de gestionar la seguridad es utilizando usuarios de Windows<br />
  porque es la &uacute;nica manera de poder asignar directivas de seguridad a<br />
  las cuentas de los usuarios. As&iacute; podemos por ejemplo establecer caducidades<br />
  para las contrase&ntilde;as, establecer un m&iacute;nimo de longitud, detectar<br />
  intentos de acceso ilegales&#8230;</p>
<p>  Estos usuario que creamos en el dominio no tienen necesidad de ning&uacute;n<br />
  privilegio extra en el dominio (adem&aacute;s de ser usuarios del dominio) y<br />
  los permisos que tienen en el SQL Server se administran desde dentro del propio<br />
  SQL Server.</p>
<h3>El administrador:</h3>
<p> <img src="/images/editorial/sql2kinstal2.gif" width="50" height="102" class="lateral" alt="2K" />Para poder manejar todos estos<br />
  elementos de seguridad es necesaria la figura del administrador. <br />
  En el SQL Server se pueden definir f&aacute;cilmente uno o varios administradores<br />
  que lleven a cabo las tareas necesarias para el correcto funcionamiento del<br />
  servidor. Pero hay tareas de configuraci&oacute;n del servidor y de gesti&oacute;n<br />
  de usuarios que tienen que ser realizadas por un usuario que tenga ciertas caracter&iacute;sticas:</p>
<p>
  &#8226;&nbsp;Poder crear y modificar cuentas de usuarios,<br />
  &#8226;&nbsp;Tener acceso a las claves del registro del servidor donde este<br />
  instalado el SQL Server,<br />
  &#8226;&nbsp;Tener acceso total al sistema de archivos del equipo donde est&aacute;<br />
  instalado el SQL Server,<br />
  &#8226;&nbsp;Tener privilegios para poder iniciar y detener los servicios SQL<br />
  Server, SQL Server Agent, Servicio Microsoft Search,<br />
  &#8226;&nbsp;Poder acceder a los registros de equipos clientes (si se van a<br />
  utilizar controladores ODBC),</p>
<p>  &#8226;&nbsp;Poder leer y buscar a trav&eacute;s del visor de sucesos del servidor,<br />
  &#8226;&nbsp;Poder utilizar el monitor del sistema y crear registros de log<br />
  de cualquier tipo de contador,<br />
  &#8226;&nbsp;Instalar y reparar el software del SQL Server,<br />
  &#8226;&nbsp;Realizar copias de seguridad en dispositivos externos.</p>
<p>Por<br />
  tanto deber&iacute;amos crear una cuenta espec&iacute;fica para la administraci&oacute;n<br />
  de SQL Server que tuviera todos estos privilegios. Lo m&aacute;s sencillo y<br />
  seguro ser&aacute; crear un usuario perteneciente al grupo de Administradores<br />
  del Dominio encargado de realizar estas tareas. En su defecto basta con crear<br />
  un usuario normal y asignarle estos derechos y permisos (o asignar dichos derechos<br />
  y permisos a un usuario ya existente)</p>
<p>Por<br />
  supuesto que en un entorno donde haya problemas de seguridad se puede &#8220;hilar<br />
  m&aacute;s fino&#8221; y asignar permisos y derechos m&aacute;s restrictivos<br />
  a todas estas cuentas de las que hemos hablado.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.maestrosdelweb.com/editorial/sql2kinstal/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Inyección de código SQL</title>
		<link>http://www.maestrosdelweb.com/editorial/inyecsql/</link>
		<comments>http://www.maestrosdelweb.com/editorial/inyecsql/#comments</comments>
		<pubDate>Wed, 10 Mar 2004 00:00:00 +0000</pubDate>
		<dc:creator>Cesar Manivesa</dc:creator>
		
		<category><![CDATA[Bases de Datos]]></category>

		<category><![CDATA[Editorial]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[La inyección SQL consiste en la modificación del comportamiento de nuestras consultas mediante la introducción de parámetros no deseados en los campos a los que tiene acceso el usuario.

  Este tipo de errores puede permitir a usuarios malintencionados acceder a datos
  a los que de otro modo no tendr&#237;an acceso y, en el [...]]]></description>
			<content:encoded><![CDATA[<p><span class="intro">La inyección SQL consiste en la modificación del comportamiento de nuestras consultas mediante la introducción de parámetros no deseados en los campos a los que tiene acceso el usuario.</span><span id="more-228"></span></p>
<p><img src="/images/editorial/inyecsql1.gif" width="150" height="73"  class="lateral" alt="SQL" /><br />
  Este tipo de errores puede permitir a usuarios malintencionados acceder a datos<br />
  a los que de otro modo no tendr&iacute;an acceso y, en el peor de los casos,<br />
  modificar el comportamiento de nuestras aplicaciones.</p>
<p> Vamos a ver con un ejemplo que significa eso<br />
  de <em><strong>&#8220;Inyecci&oacute;n de c&oacute;digo&#8221;</strong></em><strong><em>:</em></strong><br />
  <br />
  Supongamos que tenemos una aplicaci&oacute;n Web (realizada en ASP por sencillez)<br />
  en la que el acceso a ciertas secciones est&aacute; restringido. Para restringir<br />
  ese acceso creamos una tabla de usuarios y contrase&ntilde;as y s&oacute;lo<br />
  los usuarios que se validen contra esa tabla podr&aacute;n acceder a esos contenidos.<br />
  Una manera de que los usuarios se validen ser&aacute; colocar un par de cuadros<br />
  de texto en nuestra p&aacute;gina Web (por ejemplo txtUsuario y txtPassword)<br />
  donde puedan introducir su nombre y su contrase&ntilde;a y enviar ese par usuario/contrase&ntilde;a<br />
  a la base de datos para comprobar si es v&aacute;lido. </p>
<p> Primero creamos la tabla que vamos a usar<br />
  y la rellenamos con datos:</p>
<div class="codigo">
<pre>use web-- Nuestra base de datos se llama webgo-- Creamos una tabla para almacenar los pares usuario/contrase&ntilde;acreate table usuarios (Usuario varchar (50) not null primary key,
Password varchar (50))go-- Introducimos un par de datos de pruebainsert into usuarios (Usuario, Password) values ('Admin', '1234')insert into usuarios (Usuario, Password) values ('Usuario', 'abcd')
</pre>
</div>
<p>Ahora veamos el c&oacute;digo de las p&aacute;ginas<br />
  que forman parte del proceso de login.</p>
<div class="codigo">
<pre>index.htm&lt;form action=&quot;login.asp&quot; method=&quot;post&quot;&gt;Nombre: &lt;input type=&quot;text&quot; name=&quot;txtUsuario&quot;&gt;&lt;br&gt;Password: &lt;input type=&quot;password&quot; name=&quot;txtPassword&quot;&gt;&lt;br&gt;&lt;input type=&quot;submit&quot;&gt;&lt;/form&gt;
</pre>
</div>
<p>Esta primera página es sencilla. Simplemente<br />
  los dos cuadros de texto mencionados que enviarán los datos a la página de login.</p>
<div class="codigo">
<pre>Login.asp&lt;%Dim Usuario, Password, RS, SSQLUsuario = Request.Form(&quot;txtUsuario&quot;)Password = Request.Form(&quot;txtPassword&quot;)SSQL = &quot;SELECT count(*) FROM Usuarios WHERE Usuario = '&quot; &amp;
Usuario &amp;&quot;' AND password='&quot; &amp; Password &amp; &quot;'&quot;Set RS = Server.CreateObject(&quot;ADODB.Recordset&quot;)RS.Open SSQL, &quot;Cadena de conexion&quot;If (RS.EOF) ThenResponse.Write &quot;Acceso denegado.&quot;ElseResponse.Write &quot;Te has identificado como &quot; &amp; RS(&quot;Usuario&quot;)End IfSet RS = Nothing%&gt;</pre>
</div>
<p>Y en esta segunda p&aacute;gina creamos din&aacute;micamente<br />
  una sentencia SQL que enviamos a la base de datos para la validaci&oacute;n.<br />
  <br />
  Si el usuario escribe Admin y 1234 la sentencia creada ser&aacute;:</p>
<div class="codigo">
<pre>&#8220;SELECT Count(*) FROM Usuarios WHERE Usuario=&#8217;Admin&#8217; AND
Password=&#8217;1234&#8217;&#8221;</pre>
</div>
<p> Y como esta sentencia nos devuelve un registro,<br />
  dejaremos que el usuario entre en la Web. Si el usuario escribe por ejemplo<br />
  &#8216;Admin&#8217; y de contrase&ntilde;a cualquier otra cosa, la sentencia no nos devolver&aacute;&nbsp;registros<br />
  y no permitiremos entrar a esa persona.</p>
<p> Pero &iquest;qu&eacute; ocurre si el usuario<br />
  escribe &#8216; or &#8216;1&#8242;=&#8217;1 como usuario y lo mismo de contrase&ntilde;a?</p>
<p> En este caso la variable Consulta contendr&aacute;<br />
  la cadena:</p>
<div class="codigo">
<pre>&quot;SELECT Count(*) FROM Usuarios WHERE Usuario = '' or '1'='1' AND
password = '' or '1'='1'&quot;</pre>
</div>
<p>Y obviamente esta sentencia nos devuelve registros<br />
  con lo que el usuario entrar&aacute; en nuestra Web sin tener permiso. </p>
<p> Pero esto no es lo peor. Lo peor ser&aacute;<br />
  que el usuario utilice estos trucos de inyecci&oacute;n de SQL para ejecutar<br />
  c&oacute;digo arbitrario en nuestro servidor. Sentencias DDL, cambiar permisos,<br />
  utilizar procedimientos almacenados y un largo etc&eacute;tera. Qu&eacute; ocurrir&iacute;a<br />
  si alguien escribiese de contrase&ntilde;a cosas como:</p>
<div class="codigo">
<pre>' exec master..xp_cmdshell 'net user test /ADD' &#8211;</pre>
</div>
<h3>Como evitarlo:</h3>
<p>Y ahora lo m&aacute;s importante, &iquest;qu&eacute;<br />
  podemos hacer para evitar estos errores?<br />
  Pues hay varios sistemas para evitarlo. Por ejemplo podemos filtrar las entradas<br />
  de los usuarios reemplazando la aparici&oacute;n de &#8216; por &#8216;&#8217;<br />
  (dos comillas simples) e incluso evitando que los usuarios puedan pasar caracteres<br />
  como \ / &#8220; &#8216; o cualquier otro que se nos ocurra que puede causar<br />
  problemas. Estos filtros pueden ser tan sencillos como utilizar la sentencia<br />
  replace de Visual Basic:</p>
<div class="codigo">
<pre>SSQL= &quot;SELECT count(*) FROM Usuarios WHERE Usuario = '&quot; &amp; ReplacetxtUsuario.Text, &quot;'&quot;, &quot;''&quot;) &amp; &quot;' AND password='&quot; &amp; Replace(txtPassword.Text, &quot;'&quot;, &quot;''&quot;) &amp; &quot;'&quot;</pre>
</div>
<p>Otro factor importante en cuanto a la seguridad<br />
  es limitar al m&aacute;ximo los permisos del usuario que ejecuta estas sentencias<br />
  para evitar posibles problemas. Por ejemplo utilizando un usuario distinto para<br />
  las sentencias SELECT, DELETE, UPDATE y asegur&aacute;ndonos que cada ejecuci&oacute;n<br />
  de una sentencia ejecute una sentencia del tipo permitido.</p>
<p> Por supuesto utilizar el usuario &#8216;sa&#8217;<br />
  o uno que pertenezca al rol &#8216;db_owner&#8217; para ejecutar las sentencias<br />
  de uso habitual de la base de datos deber&iacute;a quedar descartado.</p>
<p>  Una soluci&oacute;n definitiva ser&iacute;a trabajar con procedimientos almacenados.<br />
  El modo en el que se pasan los par&aacute;metros a los procedimientos almacenados<br />
  evita que la inyecci&oacute;n SQL pueda ser usada. Por ejemplo utilizando el<br />
  siguiente procedimiento almacenado:</p>
<div class="codigo">
<pre>CREATE Procedure Validar @usuario varchar(50), @password varchar(50)
ASIf (SELECT Count(*) FROM Usuarios WHERE Usuario=@Usuario and Password=@password)&gt;0Return 1Return 0</pre>
</div>
<p>Tambi&eacute;n deber&iacute;amos validar los<br />
  datos que introduce el usuario teniendo en cuenta por ejemplo la longitud de<br />
  los campos y el tipo de datos aceptados. Esto lo podemos hacer en el cliente<br />
  con los RegularExpressionValidator o con los CustomValidators del VB.NET. De<br />
  todos modos si la seguridad es importante todas estas validaciones hay que repetirlas<br />
  en el servidor.</p>
<p> Por ultimo, y ya que estamos pensando en entornos<br />
  Web, podemos programar en ASP.NET y utilizar siempre que sea posible las clases<br />
  System.Web.Security.FormsAuthentication para que los usuarios entren en nuestras<br />
  aplicaciones Web.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.maestrosdelweb.com/editorial/inyecsql/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
