<?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"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MXStudio &#187; Usabilidade</title>
	<atom:link href="http://www.mxstudio.com.br/categoria/usabilidade/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.mxstudio.com.br</link>
	<description>Macromedia e Adobe - Artigos, colunas, tutorias e muito mais...</description>
	<lastBuildDate>Sun, 29 Jan 2012 11:31:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>ASP &#8211; Calendário de eventos</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/dreamweaver/asp-calendario-de-eventos/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/dreamweaver/asp-calendario-de-eventos/#comments</comments>
		<pubDate>Fri, 23 Dec 2011 23:05:03 +0000</pubDate>
		<dc:creator>X@nBuRzUm</dc:creator>
				<category><![CDATA[ASP.net]]></category>
		<category><![CDATA[Dreamweaver]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Usabilidade]]></category>

		<guid isPermaLink="false">http://www.mxstudio.com.br/?p=7873</guid>
		<description><![CDATA[Um aplicativo de calendário grande, com eventos atuais que foram adicionados e editados por utilizadores registados. Vamos começar por obter o seu código e nomear a página, calendar.asp. Nós estamos simplesmente usando seu código como um ponto genérico de partida. Você  , precisa de um lugar para armazenar os seus eventos. Eu criei um banco [...]]]></description>
			<content:encoded><![CDATA[<p>Um aplicativo de calendário grande, com eventos atuais que foram adicionados e editados por utilizadores registados. Vamos começar por obter o seu código e nomear a página, calendar.asp. Nós estamos simplesmente usando seu código como um ponto genérico de partida.<br />
Você  , precisa de um lugar para armazenar os seus eventos. Eu criei um banco de dados de acesso chamado &#8220;usuários&#8221;. Eu, então, criou uma tabela dentro desse banco de dados chamado &#8221; users &#8220;. A tabela calendar tem os seguintes campos:</p>
<div>
<table border="1" cellspacing="1" cellpadding="0">
<tbody>
<tr>
<td colspan="2"><strong>Calendar</strong></td>
</tr>
<tr>
<td>ID</td>
<td>Auto Number (Primary Key)</td>
</tr>
<tr>
<td>Subject</td>
<td>Texto</td>
</tr>
<tr>
<td>Message</td>
<td>Memo</td>
</tr>
<tr>
<td>Day</td>
<td>Numero</td>
</tr>
<tr>
<td>Month</td>
<td>Numero</td>
</tr>
<tr>
<td>Year</td>
<td>Numero</td>
</tr>
<tr>
<td>AddedBy</td>
<td>Texto</td>
</tr>
<tr>
<td>DateAdded</td>
<td>Data</td>
</tr>
</tbody>
</table>
</div>
<p>Todos os registros são bastante auto-explicativo com exceção do campo ID. Vamos usá-lo para apresentar o evento desejado.<br />
Uma vez que o banco de dados é feita, você precisa para criar suas páginas ASP. Neste exemplo, vamos usar quatro páginas; calendar.asp, display_event.asp, add_event.asp e edit_event.asp. Você poderia provavelmente começar afastado com apenas duas páginas, mas para a facilidade de uso, vamos criar quatro.<br />
Vamos começar com a página calendar.asp.</p>
<p>&lt;&#8211;#include file=&#8221;adovbs.inc&#8221;&#8211;&gt;</p>
<p>Dim DB_CONNECTIONSTRING</p>
<p>Dim objRecordset</p>
<p>DB_CONNECTIONSTRING = &#8220;DRIVER={Microsoft Access Driver (*.mdb)};DBQ=&#8221; &amp; _</p>
<p>Server.Mappath(&#8220;users.mdb&#8221;) &amp; &#8220;;&#8221;</p>
<p>Set objRecordset = Server.CreateObject(&#8220;ADODB.Recordset&#8221;)</p>
<p>objRecordset.Open &#8220;calendar&#8221;, DB_CONNECTIONSTRING, adOpenStatic, adLockPessimistic, adCmdTable</p>
<p>Essa parte do código que escreve os dias do calendário e inserir os assuntos de nosso banco de dados com um link para a página display_event.asp. Isso dará a usuários a clicar em algo para veiw todo o evento.</p>
<p>If Not objRecordset.BOF Then</p>
<p>&#8216;&#8211; Mover para o primeiro registro</p>
<p>objRecordset.MoveFirst</p>
<p>Do Until objRecordset.EOF</p>
<p>If objRecordset.Fields(&#8220;Year&#8221;) = Year(dDate) Then</p>
<p>If objRecordset.Fields(&#8220;Month&#8221;) = Month(dDate) Then</p>
<p>If objRecordset.Fields(&#8220;Day&#8221;) = iCurrent Then</p>
<p>&#8216;&#8211; Se tudo coincide com o dia atual, em seguida, exibir<br />
&#8216;o sujeito com o ID coresponding &#8211;</p>
<p>Response.Write(&#8220;&lt;br&gt;&lt;font size=2&gt;&lt;a href=&#8221; &amp; _</p>
<p>Chr(34) &amp; &#8220;display_event.asp?ID=&#8221; &amp; _</p>
<p>objRecordset.Fields(&#8220;ID&#8221;) &amp; Chr(34) &amp; &#8220;&gt;&#8221; &amp; _</p>
<p>objRecordset.Fields(&#8220;Subject&#8221;) &amp; _</p>
<p>&#8220;&lt;/a&gt;&lt;/font&gt;&lt;br&gt;&#8221;)</p>
<p>End If</p>
<p>End If</p>
<p>End If</p>
<p>&#8216;&#8211; Se nada corresponde, passar para o próximo registro e<br />
&#8216;começar tudo de novo &#8211;</p>
<p>objRecordset.MoveNext</p>
<p>Loop</p>
<p>End If</p>
<p>Temos agora apresentado o tema do evento correto com o ID de evento anexado na URL como uma seqüência de consulta (ex. display_event.asp? ID = 10). Quando o usuário clica sobre o tema do evento, passamos o ID de evento para a página display_event.asp.<br />
Que nos leva à página do evento. Você precisa primeiro se conectar ao banco de dados (o mesmo que acima). Então você precisa para obter o ID de eventos a partir da seqüência de consulta e percorrer o banco de dados até encontrarmos o evento:</p>
<p>EventToShow = CInt(Request.QueryString(&#8220;ID&#8221;))</p>
<p>If Not objRecordset.EOF Then</p>
<p>objRecordset.MoveFirst</p>
<p>Do Until objRecordset.Fields(&#8220;ID&#8221;) = EventToShow</p>
<p>objRecordset.MoveNext</p>
<p>Loop</p>
<p>End If</p>
<p>Em seguida, deseja correlacionar o evento exibido com uma variável de sessão para editar e exibir o evento::</p>
<p>Session(&#8220;EventToEdit&#8221;) = EventToShow</p>
<p>Date:</p>
<p>&lt;%</p>
<p>Response.Write objRecordset.Fields(&#8220;Month&#8221;) &amp; &#8220;/&#8221; &amp; _</p>
<p>objRecordset.Fields(&#8220;Day&#8221;) &amp; &#8220;/&#8221; &amp; _</p>
<p>objRecordset.Fields(&#8220;Year&#8221;)</p>
<p>%&gt;</p>
<p>Subject:</p>
<p>&lt;%</p>
<p>Response.Write objRecordset.Fields(&#8220;Subject&#8221;)</p>
<p>%&gt;</p>
<p>Message: &lt;%= objRecordset.Fields(&#8220;Message&#8221;) %&gt;</p>
<p>Added By:</p>
<p>&lt;%</p>
<p>Response.Write objRecordset.Fields(&#8220;AddedBy&#8221;) &amp; _</p>
<p>&#8221; on &#8221; &amp; objRecordset.Fields(&#8220;DateAdded&#8221;)</p>
<p>%&gt;</p>
<p>Não se esqueça de limpar a sua conexão com o banco:</p>
<p>objRecordset.Close<br />
Set objRecordset = Nothing</p>
<p>As próximas duas páginas (edit_event.asp &amp; add_event.asp) são muito semelhantes. A única exceção é que com o evento de edição, queremos mostrar o evento existente dentro do formulário. Como mencionei anteriormente, você poderia provavelmente começar com a combinação destas duas páginas. A única coisa que você precisa manter em mente é com a manipulação do recorset. Na página de atualização, precisamos usar objRecordset.Update, enquanto na página add_event.asp, você vai querer usar objRecordset.AddNew.<br />
Em ambos os casos, precisamos conectar ao banco de dados de entrada e os dados do formulário para os campos, semelhante ao abaixo:</p>
<p>objRecordset.Fields(&#8220;Subject&#8221;) = Request.Form(&#8220;txtSubject&#8221;)<br />
objRecordset.Fields(&#8220;Message&#8221;) = Request.Form(&#8220;Message&#8221;)<br />
objRecordset.Fields(&#8220;Day&#8221;) = Request.Form(&#8220;txtDay&#8221;)<br />
objRecordset.Fields(&#8220;Month&#8221;) = Request.Form(&#8220;txtMonth&#8221;)<br />
objRecordset.Fields(&#8220;Year&#8221;) = Request.Form(&#8220;txtYear&#8221;)<br />
objRecordset.Fields(&#8220;AddedBy&#8221;) = Request.Form(&#8220;txtAddedBy&#8221;)<br />
objRecordset.Fields(&#8220;DateAdded&#8221;) = Now()</p>
<p>Há obviamente muito mais que você pode fazer com este exemplo, mas isso vai lhe proporcionar um bom ponto de partida. Você pode querer só permitem aos usuários editar / excluir eventos que eles postaram (este é onde o campo AddedBy vem no lugar). Você também pode querer inserir um tempo para o evento. Você poderia código de evento de cor os dias que têm eventos postados.Abaixo todos os códigos das págins.</p>
<p>add_event.asp</p>
<p>&lt;%@ LANGUAGE=VBSCRIPT %&gt;</p>
<p>&lt;%Option Explicit%&gt;</p>
<p>&lt;%</p>
<p>Dim DB_CONNECTIONSTRING</p>
<p>Dim objRecordset</p>
<p>Dim Added</p>
<p>%&gt;</p>
<p>&lt;!&#8211;#include file=&#8221;adovbs.inc&#8221;&#8211;&gt;</p>
<p>&lt;%</p>
<p>DB_CONNECTIONSTRING = &#8220;DRIVER={Microsoft Access Driver (*.mdb)};DBQ=&#8221; &amp; Server.Mappath(&#8220;users.mdb&#8221;) &amp; &#8220;;&#8221;</p>
<p>Set objRecordset = Server.CreateObject(&#8220;ADODB.Recordset&#8221;)</p>
<p>objRecordset.Open &#8220;calendar&#8221;, DB_CONNECTIONSTRING, adOpenStatic, adLockPessimistic, adCmdTable</p>
<p>If Request.Form(&#8220;btnAdd&#8221;) = &#8220;Add Event&#8221; Then</p>
<p>objRecordset.AddNew</p>
<p>&#8216;&#8211; Adiciona records no database do form &#8211;</p>
<p>objRecordset.Fields(&#8220;Subject&#8221;) = Request.Form(&#8220;txtSubject&#8221;)</p>
<p>objRecordset.Fields(&#8220;Message&#8221;) = Request.Form(&#8220;Message&#8221;)</p>
<p>objRecordset.Fields(&#8220;Day&#8221;) = Request.Form(&#8220;selDay&#8221;)</p>
<p>objRecordset.Fields(&#8220;Month&#8221;) = Request.Form(&#8220;selMonth&#8221;)</p>
<p>objRecordset.Fields(&#8220;Year&#8221;) = Request.Form(&#8220;selYear&#8221;)</p>
<p>objRecordset.Fields(&#8220;AddedBy&#8221;) = Request.Form(&#8220;txtAddedBy&#8221;)</p>
<p>objRecordset.Fields(&#8220;DateAdded&#8221;) = Now()</p>
<p>objRecordset.Update</p>
<p>Added = &#8220;True&#8221;</p>
<p>End If</p>
<p>objRecordset.Close</p>
<p>Set objRecordset = Nothing</p>
<p>If Added = &#8220;True&#8221; Then</p>
<p>Response.Redirect(&#8220;calendar.asp&#8221;)</p>
<p>End If</p>
<p>%&gt;</p>
<p>&lt;html&gt;</p>
<p>&lt;center&gt;</p>
<p>&lt;form method=&#8221;post&#8221; action=&#8221;add_event.asp&#8221;&gt;</p>
<p>&lt;table border=&#8221;0&#8243; cellpadding=&#8221;0&#8243; cellspacing=&#8221;0&#8243;&gt;</p>
<p>&lt;tr&gt;</p>
<p>&lt;td&gt;Dia:</p>
<p>&lt;select name=&#8221;selDay&#8221;&gt;</p>
<p>&lt;option value=&#8221;1&#8243;&gt;1&lt;/option&gt;</p>
<p>&lt;option value=&#8221;2&#8243;&gt;2&lt;/option&gt;</p>
<p>&lt;option value=&#8221;3&#8243;&gt;3&lt;/option&gt;</p>
<p>&lt;option value=&#8221;4&#8243;&gt;4&lt;/option&gt;</p>
<p>&lt;option value=&#8221;5&#8243;&gt;5&lt;/option&gt;</p>
<p>&lt;option value=&#8221;6&#8243;&gt;6&lt;/option&gt;</p>
<p>&lt;option value=&#8221;7&#8243;&gt;7&lt;/option&gt;</p>
<p>&lt;option value=&#8221;8&#8243;&gt;8&lt;/option&gt;</p>
<p>&lt;option value=&#8221;9&#8243;&gt;9&lt;/option&gt;</p>
<p>&lt;option value=&#8221;10&#8243;&gt;10&lt;/option&gt;</p>
<p>&lt;option value=&#8221;11&#8243;&gt;11&lt;/option&gt;</p>
<p>&lt;option value=&#8221;12&#8243;&gt;12&lt;/option&gt;</p>
<p>&lt;option value=&#8221;13&#8243;&gt;13&lt;/option&gt;</p>
<p>&lt;option value=&#8221;14&#8243;&gt;14&lt;/option&gt;</p>
<p>&lt;option value=&#8221;15&#8243;&gt;15&lt;/option&gt;</p>
<p>&lt;option value=&#8221;16&#8243;&gt;16&lt;/option&gt;</p>
<p>&lt;option value=&#8221;17&#8243;&gt;17&lt;/option&gt;</p>
<p>&lt;option value=&#8221;18&#8243;&gt;18&lt;/option&gt;</p>
<p>&lt;option value=&#8221;19&#8243;&gt;19&lt;/option&gt;</p>
<p>&lt;option value=&#8221;20&#8243;&gt;20&lt;/option&gt;</p>
<p>&lt;option value=&#8221;21&#8243;&gt;21&lt;/option&gt;</p>
<p>&lt;option value=&#8221;22&#8243;&gt;22&lt;/option&gt;</p>
<p>&lt;option value=&#8221;23&#8243;&gt;23&lt;/option&gt;</p>
<p>&lt;option value=&#8221;24&#8243;&gt;24&lt;/option&gt;</p>
<p>&lt;option value=&#8221;25&#8243;&gt;25&lt;/option&gt;</p>
<p>&lt;option value=&#8221;26&#8243;&gt;26&lt;/option&gt;</p>
<p>&lt;option value=&#8221;27&#8243;&gt;27&lt;/option&gt;</p>
<p>&lt;option value=&#8221;28&#8243;&gt;28&lt;/option&gt;</p>
<p>&lt;option value=&#8221;29&#8243;&gt;29&lt;/option&gt;</p>
<p>&lt;option value=&#8221;30&#8243;&gt;30&lt;/option&gt;</p>
<p>&lt;option value=&#8221;31&#8243;&gt;31&lt;/option&gt;</p>
<p>&lt;/select&gt;&lt;/td&gt;</p>
<p>&lt;td&gt;Mês:</p>
<p>&lt;select name=&#8221;selMonth&#8221;&gt;</p>
<p>&lt;OPTION VALUE=&#8221;1&#8243;&gt;Janeiro&lt;/option&gt;</p>
<p>&lt;OPTION VALUE=&#8221;2&#8243;&gt;Fevereiro&lt;/option&gt;</p>
<p>&lt;OPTION VALUE=&#8221;3&#8243;&gt;Março&lt;/option&gt;</p>
<p>&lt;OPTION VALUE=&#8221;4&#8243;&gt;Abril&lt;/option&gt;</p>
<p>&lt;OPTION VALUE=&#8221;5&#8243;&gt;Maio&lt;/option&gt;</p>
<p>&lt;OPTION VALUE=&#8221;6&#8243;&gt;Junho&lt;/option&gt;</p>
<p>&lt;OPTION VALUE=&#8221;7&#8243;&gt;Julho&lt;/option&gt;</p>
<p>&lt;OPTION VALUE=&#8221;8&#8243;&gt;Agosto&lt;/option&gt;</p>
<p>&lt;OPTION VALUE=&#8221;9&#8243;&gt;Setembro&lt;/option&gt;</p>
<p>&lt;OPTION VALUE=&#8221;10&#8243;&gt;Outubro&lt;/option&gt;</p>
<p>&lt;OPTION VALUE=&#8221;11&#8243;&gt;Novembro&lt;/option&gt;</p>
<p>&lt;OPTION VALUE=&#8221;12&#8243;&gt;Dezembro&lt;/option&gt;</p>
<p>&lt;/select&gt;&lt;/td&gt;</p>
<p>&lt;td&gt;Ano:</p>
<p>&lt;select name=&#8221;selYear&#8221;&gt;</p>
<p>&lt;option value=&#8221;1999&#8243;&gt;1999&lt;/option&gt;</p>
<p>&lt;option value=&#8221;2000&#8243;&gt;2000&lt;/option&gt;</p>
<p>&lt;option value=&#8221;2001&#8243;&gt;2001&lt;/option&gt;</p>
<p>&lt;option value=&#8221;2002&#8243;&gt;2002&lt;/option&gt;</p>
<p>&lt;option value=&#8221;2003&#8243;&gt;2003&lt;/option&gt;</p>
<p>&lt;option value=&#8221;2004&#8243;&gt;2004&lt;/option&gt;</p>
<p>&lt;/select&gt;&lt;/td&gt;</p>
<p>&lt;/tr&gt;</p>
<p>&lt;tr&gt;</p>
<p>&lt;td colspan=&#8221;3&#8243;&gt;&amp;nbsp;&lt;/td&gt;</p>
<p>&lt;/tr&gt;</p>
<p>&lt;tr&gt;</p>
<p>&lt;td colspan=&#8221;3&#8243; align=&#8221;center&#8221;&gt;Assunto:</p>
<p>&lt;input type=&#8221;text&#8221; name=&#8221;txtSubject&#8221; size=&#8221;35&#8243;&gt;&lt;/td&gt;</p>
<p>&lt;/tr&gt;</p>
<p>&lt;tr&gt;</p>
<p>&lt;td colspan=&#8221;3&#8243;&gt;&amp;nbsp;&lt;/td&gt;</p>
<p>&lt;/tr&gt;</p>
<p>&lt;tr&gt;</p>
<p>&lt;td colspan=&#8221;3&#8243; align=&#8221;center&#8221;&gt;&lt;textarea name=&#8221;Message&#8221; cols=&#8221;40&#8243; rows=&#8221;10&#8243;&gt;&lt;/textarea&gt;&lt;/td&gt;</p>
<p>&lt;/tr&gt;</p>
<p>&lt;tr&gt;</p>
<p>&lt;td colspan=&#8221;3&#8243;&gt;&amp;nbsp;&lt;/td&gt;</p>
<p>&lt;/tr&gt;</p>
<p>&lt;tr&gt;</p>
<p>&lt;td colspan=&#8221;3&#8243; align=&#8221;center&#8221;&gt;Adicionado por:</p>
<p>&lt;input type=&#8221;text&#8221; name=&#8221;txtAddedBy&#8221; size=&#8221;35&#8243; value=&#8221;&lt;%= Session(&#8220;FirstName&#8221;) &amp; &#8221; &#8221; &amp; Session(&#8220;LastName&#8221;)%&gt;&#8221;&gt;&lt;/td&gt;</p>
<p>&lt;/tr&gt;</p>
<p>&lt;/table&gt;</p>
<p>&lt;p&gt;</p>
<p>&lt;input type=&#8221;submit&#8221; name=&#8221;btnAdd&#8221; value=&#8221;Adiciona&#8221;&gt;&amp;nbsp;&amp;nbsp;&lt;input type=&#8221;Reset&#8221; name=&#8221;btnReset&#8221; value=&#8221;Limpar&#8221;&gt;</p>
<p>&lt;/form&gt;</p>
<p>&lt;/center&gt;</p>
<p>&lt;/body&gt;</p>
<p>&lt;/html&gt;</p>
<p>Aqui a página calendar.asp</p>
<p>&lt;%@ LANGUAGE=VBSCRIPT %&gt;</p>
<p>&lt;%Option Explicit%&gt;</p>
<p>&lt;!&#8211;#include file=&#8221;adovbs.inc&#8221;&#8211;&gt;</p>
<p>&lt;%</p>
<p>If Request.Form(&#8220;AddEvent&#8221;) = &#8220;Add Event&#8221; Then</p>
<p>Response.Redirect(&#8220;add_event.asp&#8221;)</p>
<p>End If</p>
<p>If Request.Form(&#8220;EditEvent&#8221;) = &#8220;Edit Event&#8221; Then</p>
<p>Response.Redirect(&#8220;edit_event.asp&#8221;)</p>
<p>End If</p>
<p>Dim DB_CONNECTIONSTRING</p>
<p>Dim objRecordset</p>
<p>DB_CONNECTIONSTRING = &#8220;DRIVER={Microsoft Access Driver (*.mdb)};DBQ=&#8221; &amp; Server.Mappath(&#8220;users.mdb&#8221;) &amp; &#8220;;&#8221;</p>
<p>Set objRecordset = Server.CreateObject(&#8220;ADODB.Recordset&#8221;)</p>
<p>objRecordset.Open &#8220;calendar&#8221;, DB_CONNECTIONSTRING, adOpenStatic, adLockPessimistic, adCmdTable</p>
<p>%&gt;</p>
<p>&lt;%</p>
<p>Function GetDaysInMonth(iMonth, iYear)</p>
<p>Select Case iMonth</p>
<p>Case 1, 3, 5, 7, 8, 10, 12</p>
<p>GetDaysInMonth = 31</p>
<p>Case 4, 6, 9, 11</p>
<p>GetDaysInMonth = 30</p>
<p>Case 2</p>
<p>If IsDate(&#8220;February 29, &#8221; &amp; iYear) Then</p>
<p>GetDaysInMonth = 29</p>
<p>Else</p>
<p>GetDaysInMonth = 28</p>
<p>End If</p>
<p>End Select</p>
<p>End Function</p>
<p>Function GetWeekdayMonthStartsOn(iMonth, iYear)</p>
<p>GetWeekdayMonthStartsOn = WeekDay(CDate(iMonth &amp; &#8220;/1/&#8221; &amp; iYear))</p>
<p>End Function</p>
<p>Function SubtractOneMonth(dDate)</p>
<p>Dim iDay, iMonth, iYear</p>
<p>iDay = Day(dDate)</p>
<p>iMonth = Month(dDate)</p>
<p>iYear = Year(dDate)</p>
<p>If iMonth = 1 Then</p>
<p>iMonth = 12</p>
<p>iYear = iYear &#8211; 1</p>
<p>Else</p>
<p>iMonth = iMonth &#8211; 1</p>
<p>End If</p>
<p>If iDay &gt; GetDaysInMonth(iMonth, iYear) Then iDay = GetDaysInMonth(iMonth, iYear)</p>
<p>SubtractOneMonth = CDate(iMonth &amp; &#8220;-&#8221; &amp; iDay &amp; &#8220;-&#8221; &amp; iYear)</p>
<p>End Function</p>
<p>Function AddOneMonth(dDate)</p>
<p>Dim iDay, iMonth, iYear</p>
<p>iDay = Day(dDate)</p>
<p>iMonth = Month(dDate)</p>
<p>iYear = Year(dDate)</p>
<p>If iMonth = 12 Then</p>
<p>iMonth = 1</p>
<p>iYear = iYear + 1</p>
<p>Else</p>
<p>iMonth = iMonth + 1</p>
<p>End If</p>
<p>If iDay &gt; GetDaysInMonth(iMonth, iYear) Then iDay = GetDaysInMonth(iMonth, iYear)</p>
<p>AddOneMonth = CDate(iMonth &amp; &#8220;-&#8221; &amp; iDay &amp; &#8220;-&#8221; &amp; iYear)</p>
<p>End Function</p>
<p>Dim dDate     &#8216; Data estamos exibindo calendário para</p>
<p>Dim iDIM      &#8216; Dias no mês</p>
<p>Dim iDOW      &#8216; Dia da semana que começa no mês</p>
<p>Dim iCurrent  &#8216; Variável que usamos para segurar dia atual do mês como nós escrevemos tabela</p>
<p>Dim iPosition &#8216; Variável que usamos para manter a posição atual na tabela</p>
<p>If IsDate(Request.QueryString(&#8220;date&#8221;)) Then</p>
<p>dDate = CDate(Request.QueryString(&#8220;date&#8221;))</p>
<p>Else</p>
<p>If IsDate(Request.QueryString(&#8220;month&#8221;) &amp; &#8220;-&#8221; &amp; Request.QueryString(&#8220;day&#8221;) &amp; &#8220;-&#8221; &amp; Request.QueryString(&#8220;year&#8221;)) Then</p>
<p>dDate = CDate(Request.QueryString(&#8220;month&#8221;) &amp; &#8220;-&#8221; &amp; Request.QueryString(&#8220;day&#8221;) &amp; &#8220;-&#8221; &amp; Request.QueryString(&#8220;year&#8221;))</p>
<p>Else</p>
<p>dDate = Date()</p>
<p>If Request.QueryString.Count &lt;&gt; 0 Then</p>
<p>Response.Write &#8220;a data que você escolheu não era uma data válida. O calendário foi definido para a data de hoje.&lt;BR&gt;&lt;BR&gt;&#8221;</p>
<p>End If</p>
<p>End If</p>
<p>End If</p>
<p>iDIM = GetDaysInMonth(Month(dDate), Year(dDate))</p>
<p>iDOW = GetWeekdayMonthStartsOn(Month(dDate), Year(dDate))</p>
<p>%&gt;</p>
<p>&lt;html&gt;</p>
<p>&lt;center&gt;</p>
<p>&lt;table border=&#8221;1&#8243; cellspacing=&#8221;0&#8243; cellpadding=&#8221;1&#8243;&gt;</p>
<p>&lt;tr&gt;</p>
<p>&lt;td bgcolor=&#8221;blue&#8221; align=&#8221;center&#8221; colspan=&#8221;7&#8243;&gt;</p>
<p>&lt;table width=&#8221;100%&#8221; border=&#8221;0&#8243; cellspacing=&#8221;0&#8243; cellpadding=&#8221;0&#8243;&gt;</p>
<p>&lt;tr&gt;</p>
<p>&lt;td align=&#8221;right&#8221;&gt;&lt;b&gt;&lt;A HREF=&#8221;calendar.asp?date=&lt;%= SubtractOneMonth(dDate) %&gt;&#8221; style=&#8221;color: #FFFFFF&#8221;&gt;&amp;lt;&#8211;&lt;/A&gt;&lt;/b&gt;&lt;/TD&gt;</p>
<p>&lt;td align=&#8221;center&#8221;&gt;&lt;font color=&#8221;#FFFFFF&#8221;&gt;&lt;B&gt;&lt;%= MonthName(Month(dDate)) &amp; &#8220;  &#8221; &amp; Year(dDate) %&gt;&lt;/B&gt;&lt;/font&gt;&lt;/TD&gt;</p>
<p>&lt;td align=&#8221;left&#8221;&gt;&lt;b&gt;&lt;A HREF=&#8221;calendar.asp?date=&lt;%= AddOneMonth(dDate) %&gt;&#8221; style=&#8221;color: #FFFFFF&#8221;&gt;&#8211;&amp;gt;&lt;/A&gt;&lt;/b&gt;&lt;/TD&gt;</p>
<p>&lt;td align=&#8221;right&#8221; valign=&#8221;top&#8221;&gt;&lt;a href=&#8221;http://www.4guysfromrolla.com&#8221;&gt;&lt;img src=&#8221;close.gif&#8221; border=&#8221;0&#8243;&gt;&lt;/a&gt;&lt;/td&gt;</p>
<p>&lt;/tr&gt;</p>
<p>&lt;/TABLE&gt;</p>
<p>&lt;/td&gt;</p>
<p>&lt;/tr&gt;</p>
<p>&lt;tr bgcolor=&#8221;blue&#8221;&gt;</p>
<p>&lt;td ALIGN=&#8221;center&#8221; width=&#8221;80&#8243;&gt;&lt;B&gt;&lt;font color=&#8221;#FFFFFF&#8221;&gt;Dom&lt;/font&gt;&lt;/B&gt;&lt;/TD&gt;</p>
<p>&lt;td ALIGN=&#8221;center&#8221; width=&#8221;80&#8243;&gt;&lt;B&gt;&lt;font color=&#8221;#FFFFFF&#8221;&gt;Seg&lt;/font&gt;&lt;/B&gt;&lt;/TD&gt;</p>
<p>&lt;td ALIGN=&#8221;center&#8221; width=&#8221;80&#8243;&gt;&lt;B&gt;&lt;font color=&#8221;#FFFFFF&#8221;&gt;Ter&lt;/font&gt;&lt;/B&gt;&lt;/TD&gt;</p>
<p>&lt;td ALIGN=&#8221;center&#8221; width=&#8221;80&#8243;&gt;&lt;B&gt;&lt;font color=&#8221;#FFFFFF&#8221;&gt;Qua&lt;/font&gt;&lt;/B&gt;&lt;/TD&gt;</p>
<p>&lt;td ALIGN=&#8221;center&#8221; width=&#8221;80&#8243;&gt;&lt;B&gt;&lt;font color=&#8221;#FFFFFF&#8221;&gt;Qui&lt;/font&gt;&lt;/B&gt;&lt;/TD&gt;</p>
<p>&lt;td ALIGN=&#8221;center&#8221; width=&#8221;80&#8243;&gt;&lt;B&gt;&lt;font color=&#8221;#FFFFFF&#8221;&gt;Sex&lt;/font&gt;&lt;/B&gt;&lt;/TD&gt;</p>
<p>&lt;td ALIGN=&#8221;center&#8221; width=&#8221;80&#8243;&gt;&lt;B&gt;&lt;font color=&#8221;#FFFFFF&#8221;&gt;Sab&lt;/font&gt;&lt;/B&gt;&lt;/TD&gt;</p>
<p>&lt;/tr&gt;</p>
<p>&lt;%</p>
<p>If iDOW &lt;&gt; 1 Then</p>
<p>Response.Write(vbTab &amp; &#8220;&lt;tr&gt;&#8221; &amp; vbCrLf)</p>
<p>iPosition = 1</p>
<p>Do While iPosition &lt; iDOW</p>
<p>Response.Write(vbTab &amp; vbTab &amp; &#8220;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&#8221; &amp; vbCrLf)</p>
<p>iPosition = iPosition + 1</p>
<p>Loop</p>
<p>End If</p>
<p>&#8216;&#8211; Escreva dia do mês em slots bom dia &#8211;</p>
<p>iCurrent = 1</p>
<p>iPosition = iDOW</p>
<p>Do While iCurrent &lt;= iDIM</p>
<p>&#8216;&#8211; opeabre a tabela &#8211;</p>
<p>If iPosition = 1 Then</p>
<p>Response.Write(vbTab &amp; &#8220;&lt;tr&gt;&#8221; &amp; vbCrLf)</p>
<p>End If</p>
<p>&#8216;&#8211; Write na data e assun &#8211;to</p>
<p>Response.Write(vbTab &amp; vbTab &amp; &#8220;&lt;td align=left valign=top height=60&gt;&lt;b&gt;&#8221; &amp; iCurrent &amp; &#8220;&lt;/b&gt;&#8221;)</p>
<p>If Not objRecordset.BOF Then</p>
<p>objRecordset.MoveFirst</p>
<p>Do Until objRecordset.EOF</p>
<p>If objRecordset.Fields(&#8220;Year&#8221;) = Year(dDate) Then</p>
<p>If objRecordset.Fields(&#8220;Month&#8221;) = Month(dDate) Then</p>
<p>If objRecordset.Fields(&#8220;Day&#8221;) = iCurrent Then</p>
<p>Response.Write(&#8220;&lt;br&gt;&lt;font size=2&gt;&lt;a href=&#8221; &amp; Chr(34) &amp; &#8220;display_event.asp?ID=&#8221; &amp; objRecordset.Fields(&#8220;ID&#8221;) &amp; Chr(34) &amp; &#8220;&gt;&#8221; &amp; objRecordset.Fields(&#8220;Subject&#8221;) &amp; &#8220;&lt;/a&gt;&lt;/font&gt;&lt;br&gt;&#8221;)</p>
<p>End If</p>
<p>End If</p>
<p>End If</p>
<p>objRecordset.MoveNext</p>
<p>Loop</p>
<p>End If</p>
<p>Response.Write(&#8220;&lt;/td&gt;&#8221; &amp; vbCrLf)</p>
<p>&#8216;&#8211; Fecha a tabela &#8211;</p>
<p>If iPosition = 7 Then</p>
<p>Response.Write vbTab &amp; &#8220;&lt;/tr&gt;&#8221; &amp; vbCrLf</p>
<p>iPosition = 0</p>
<p>End If</p>
<p>&#8216;&#8211; Incrementa as  variaveis &#8211;</p>
<p>iCurrent = iCurrent + 1</p>
<p>iPosition = iPosition + 1</p>
<p>Loop</p>
<p>If iPosition &lt;&gt; 1 Then</p>
<p>Do While iPosition &lt;= 7</p>
<p>Response.Write(vbTab &amp; vbTab &amp; &#8220;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&#8221; &amp; vbCrLf)</p>
<p>iPosition = iPosition + 1</p>
<p>Loop</p>
<p>Response.Write vbTab &amp; &#8220;&lt;/TR&gt;&#8221; &amp; vbCrLf</p>
<p>End If</p>
<p>%&gt;</p>
<p>&lt;/table&gt;</p>
<p>&lt;%</p>
<p>objRecordset.Close</p>
<p>Set objRecordset = Nothing</p>
<p>%&gt;</p>
<p>&lt;%</p>
<p>Response.Write(&#8220;&lt;form action=&#8221; &amp; Chr(34) &amp; &#8220;calendar.asp&#8221; &amp; Chr(34) &amp; &#8221; method=&#8221; &amp; Chr(34) &amp; &#8220;post&#8221; &amp; Chr(34) &amp; &#8220;&gt;&#8221; &amp; Chr(10))</p>
<p>Response.Write(&#8220;&lt;input type=&#8221; &amp; Chr(34) &amp; &#8220;submit&#8221; &amp; Chr(34) &amp; &#8221; name=&#8221; &amp; Chr(34) &amp; &#8220;AddEvent&#8221; &amp; Chr(34) &amp; &#8221; value=&#8221; &amp; Chr(34) &amp; &#8220;Add Event&#8221; &amp; Chr(34) &amp; &#8220;&gt;&#8221; &amp; &#8220;&amp;nbsp;&amp;nbsp;&#8221;)</p>
<p>Response.Write(&#8220;&lt;/form&gt;&#8221;)</p>
<p>%&gt;</p>
<p>&lt;/center&gt;</p>
<p>&lt;/body&gt;</p>
<p>&lt;/html&gt;</p>
<p>Display_event.asp</p>
<p>&lt;%@ LANGUAGE=VBSCRIPT %&gt;</p>
<p>&lt;%Option Explicit%&gt;</p>
<p>&lt;%</p>
<p>Dim MyName</p>
<p>Dim DB_CONNECTIONSTRING</p>
<p>Dim objRecordset</p>
<p>Dim EventToShow</p>
<p>%&gt;</p>
<p>&lt;!&#8211;#include file=&#8221;adovbs.inc&#8221;&#8211;&gt;</p>
<p>&lt;%</p>
<p>MyName = Session(&#8220;Firstname&#8221;) &amp; &#8221; &#8221; &amp; Session(&#8220;LastName&#8221;)</p>
<p>DB_CONNECTIONSTRING = &#8220;DRIVER={Microsoft Access Driver (*.mdb)};DBQ=&#8221; &amp; Server.Mappath(&#8220;users.mdb&#8221;) &amp; &#8220;;&#8221;</p>
<p>Set objRecordset = Server.CreateObject(&#8220;ADODB.Recordset&#8221;)</p>
<p>objRecordset.Open &#8220;calendar&#8221;, DB_CONNECTIONSTRING, adOpenStatic, adLockPessimistic, adCmdTable</p>
<p>EventToShow = CInt(Request.QueryString(&#8220;ID&#8221;))</p>
<p>If Not objRecordset.EOF Then</p>
<p>objRecordset.MoveFirst</p>
<p>Do Until objRecordset.Fields(&#8220;ID&#8221;) = EventToShow</p>
<p>objRecordset.MoveNext</p>
<p>Loop</p>
<p>End If</p>
<p>Session(&#8220;EventToEdit&#8221;) = EventToShow</p>
<p>%&gt;</p>
<p>&lt;html&gt;</p>
<p>Data:&lt;/b&gt; &lt;%= objRecordset.Fields(&#8220;Month&#8221;) &amp; &#8220;/&#8221; &amp; objRecordset.Fields(&#8220;Day&#8221;) &amp; &#8220;/&#8221; &amp; objRecordset.Fields(&#8220;Year&#8221;) %&gt;&lt;p&gt;</p>
<p>&lt;b&gt;Assunto:&lt;/b&gt; &lt;%= objRecordset.Fields(&#8220;Subject&#8221;) %&gt;&lt;p&gt;</p>
<p>&lt;b&gt;Mensagem:&lt;/b&gt; &lt;%= objRecordset.Fields(&#8220;Message&#8221;) %&gt;&lt;p&gt;</p>
<p>&lt;b&gt;Adicionado por:&lt;/b&gt; &lt;%= objRecordset.Fields(&#8220;AddedBy&#8221;) &amp; &#8221; on &#8221; &amp; objRecordset.Fields(&#8220;DateAdded&#8221;)%&gt;</p>
<p>&lt;p&gt;&amp;nbsp;&lt;/p&gt;</p>
<p>&lt;form method=&#8221;post&#8221; action=&#8221;edit_event.asp&#8221;&gt;</p>
<p>&lt;input type=&#8221;submit&#8221; name=&#8221;btnEditEvent&#8221; value=&#8221;Edita/Exclui Evento&#8221;&gt;</p>
<p>&lt;/form&gt;</p>
<p>&lt;/body&gt;</p>
<p>&lt;/html&gt;</p>
<p>&lt;%</p>
<p>objRecordset.Close</p>
<p>Set objRecordset = Nothing</p>
<p>%&gt;</p>
<p>Edit_event.asp</p>
<p>&lt;%@ LANGUAGE=VBSCRIPT %&gt;</p>
<p>&lt;%Option Explicit%&gt;</p>
<p>&lt;%</p>
<p>Dim DB_CONNECTIONSTRING</p>
<p>Dim objRecordset</p>
<p>Dim Updated</p>
<p>%&gt;</p>
<p>&lt;!&#8211;#include file=&#8221;adovbs.inc&#8221;&#8211;&gt;</p>
<p>&lt;%</p>
<p>If Request.Form(&#8220;btnCalendar&#8221;) = &#8220;Back To Calendar&#8221; Then</p>
<p>Response.Redirect(&#8220;calendar.asp&#8221;)</p>
<p>End If</p>
<p>DB_CONNECTIONSTRING = &#8220;DRIVER={Microsoft Access Driver (*.mdb)};DBQ=&#8221; &amp; Server.Mappath(&#8220;users.mdb&#8221;) &amp; &#8220;;&#8221;</p>
<p>Set objRecordset = Server.CreateObject(&#8220;ADODB.Recordset&#8221;)</p>
<p>objRecordset.Open &#8220;calendar&#8221;, DB_CONNECTIONSTRING, adOpenStatic, adLockPessimistic, adCmdTable</p>
<p>If Session(&#8220;EventToEdit&#8221;) &lt;&gt; 0 Then</p>
<p>If Not objRecordset.EOF Then</p>
<p>objRecordset.MoveFirst</p>
<p>Do Until objRecordset.Fields(&#8220;ID&#8221;) = Session(&#8220;EventToEdit&#8221;)</p>
<p>objRecordset.MoveNext</p>
<p>Loop</p>
<p>End If</p>
<p>End If</p>
<p>If Request.Form(&#8220;btnEdit&#8221;) = &#8220;Update&#8221; Then</p>
<p>&#8216;&#8211; Adiciona records no database do form &#8211;</p>
<p>objRecordset.Fields(&#8220;Subject&#8221;) = Request.Form(&#8220;txtSubject&#8221;)</p>
<p>objRecordset.Fields(&#8220;Message&#8221;) = Request.Form(&#8220;Message&#8221;)</p>
<p>objRecordset.Fields(&#8220;Day&#8221;) = Request.Form(&#8220;txtDay&#8221;)</p>
<p>objRecordset.Fields(&#8220;Month&#8221;) = Request.Form(&#8220;txtMonth&#8221;)</p>
<p>objRecordset.Fields(&#8220;Year&#8221;) = Request.Form(&#8220;txtYear&#8221;)</p>
<p>objRecordset.Fields(&#8220;AddedBy&#8221;) = Request.Form(&#8220;txtAddedBy&#8221;)</p>
<p>objRecordset.Fields(&#8220;DateAdded&#8221;) = Now()</p>
<p>objRecordset.Update</p>
<p>Updated = &#8220;True&#8221;</p>
<p>End If</p>
<p>If Request.Form(&#8220;btnDelete&#8221;) = &#8220;Delete&#8221; Then</p>
<p>&#8216;&#8211;Delete o evento no database &#8211;</p>
<p>objRecordset.Delete adAffectCurrent</p>
<p>Response.Redirect(&#8220;calendar.asp&#8221;)</p>
<p>End If</p>
<p>%&gt;</p>
<p>&lt;html&gt;</p>
<p>&lt;center&gt;</p>
<p>&lt;%</p>
<p>If Updated = &#8220;True&#8221; Then</p>
<p>Response.Write(&#8220;&lt;font size=4&gt;&lt;b&gt;&lt;font color=&#8221; &amp; Chr(34) &amp; &#8220;red&#8221; &amp; Chr(34) &amp; &#8220;&gt;&#8221; &amp; objRecordset.Fields(&#8220;Subject&#8221;) &amp; &#8220;&lt;/font&gt; has been updated&lt;/b&gt;&lt;/font&gt;&lt;p&gt;&#8221;)</p>
<p>End If</p>
<p>%&gt;</p>
<p>&lt;form method=&#8221;post&#8221; action=&#8221;edit_event.asp&#8221;&gt;</p>
<p>&lt;table border=&#8221;0&#8243; cellpadding=&#8221;0&#8243; cellspacing=&#8221;0&#8243;&gt;</p>
<p>&lt;tr&gt;</p>
<p>&lt;td&gt;Dia:</p>
<p>&lt;input type=&#8221;text&#8221; name=&#8221;txtDay&#8221; size=&#8221;4&#8243; value=&#8221;&lt;%= objRecordset.Fields(&#8220;Day&#8221;)%&gt;&#8221;&gt;&lt;/td&gt;</p>
<p>&lt;td&gt;Mês:</p>
<p>&lt;input type=&#8221;text&#8221; name=&#8221;txtMonth&#8221; size=&#8221;10&#8243; value=&#8221;&lt;%= objRecordset.Fields(&#8220;Month&#8221;)%&gt;&#8221;&gt;&lt;/td&gt;</p>
<p>&lt;td&gt;Ano:</p>
<p>&lt;input type=&#8221;text&#8221; name=&#8221;txtYear&#8221; size=&#8221;5&#8243; value=&#8221;&lt;%= objRecordset.Fields(&#8220;Year&#8221;)%&gt;&#8221;&gt;&lt;/td&gt;</p>
<p>&lt;/tr&gt;</p>
<p>&lt;tr&gt;</p>
<p>&lt;td colspan=&#8221;3&#8243;&gt;&amp;nbsp;&lt;/td&gt;</p>
<p>&lt;/tr&gt;</p>
<p>&lt;tr&gt;</p>
<p>&lt;td colspan=&#8221;3&#8243; align=&#8221;center&#8221;&gt;Assunto:</p>
<p>&lt;input type=&#8221;text&#8221; name=&#8221;txtSubject&#8221; size=&#8221;35&#8243; value=&#8221;&lt;%= objRecordset.Fields(&#8220;Subject&#8221;)%&gt;&#8221;&gt;&lt;/td&gt;</p>
<p>&lt;/tr&gt;</p>
<p>&lt;tr&gt;</p>
<p>&lt;td colspan=&#8221;3&#8243;&gt;&amp;nbsp;&lt;/td&gt;</p>
<p>&lt;/tr&gt;</p>
<p>&lt;tr&gt;</p>
<p>&lt;td colspan=&#8221;3&#8243; align=&#8221;center&#8221;&gt;&lt;textarea name=&#8221;Message&#8221; cols=&#8221;40&#8243; rows=&#8221;10&#8243;&gt;&lt;%= objRecordset.Fields(&#8220;Message&#8221;)%&gt;&lt;/textarea&gt;&lt;/td&gt;</p>
<p>&lt;/tr&gt;</p>
<p>&lt;tr&gt;</p>
<p>&lt;td colspan=&#8221;3&#8243;&gt;&amp;nbsp;&lt;/td&gt;</p>
<p>&lt;/tr&gt;</p>
<p>&lt;tr&gt;</p>
<p>&lt;td colspan=&#8221;3&#8243; align=&#8221;center&#8221;&gt;Adicionado por:</p>
<p>&lt;input type=&#8221;text&#8221; name=&#8221;txtAddedBy&#8221; size=&#8221;35&#8243; value=&#8221;&lt;%= objRecordset.Fields(&#8220;AddedBy&#8221;)%&gt;&#8221;&gt;&lt;/td&gt;</p>
<p>&lt;/tr&gt;</p>
<p>&lt;/table&gt;</p>
<p>&lt;p&gt;</p>
<p>&lt;input type=&#8221;submit&#8221; name=&#8221;btnEdit&#8221; value=&#8221;Atualizar&#8221;&gt;&amp;nbsp;&amp;nbsp;</p>
<p>&lt;input type=&#8221;submit&#8221; name=&#8221;btnDelete&#8221; value=&#8221;Excluir&#8221;&gt;&amp;nbsp;&amp;nbsp;</p>
<p>&lt;input type=&#8221;Reset&#8221; name=&#8221;btnReset&#8221; value=&#8221;Limpar&#8221;&gt;&amp;nbsp;&amp;nbsp;</p>
<p>&lt;input type=&#8221;submit&#8221; name=&#8221;btnCalendar&#8221; value=&#8221;Voltar Calendario&#8221;&gt;</p>
<p>&lt;/form&gt;</p>
<p>&lt;/center&gt;</p>
<p>&lt;/body&gt;</p>
<p>&lt;/html&gt;</p>
<p>&lt;%</p>
<p>objRecordset.Close</p>
<p>Set objRecordset = Nothing</p>
<p>%&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/dreamweaver/asp-calendario-de-eventos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usabilidade em Códigos</title>
		<link>http://www.mxstudio.com.br/marketingdigital/usabilidade/usabilidade-em-codigos/</link>
		<comments>http://www.mxstudio.com.br/marketingdigital/usabilidade/usabilidade-em-codigos/#comments</comments>
		<pubDate>Mon, 03 Oct 2011 17:55:10 +0000</pubDate>
		<dc:creator>Ted k'</dc:creator>
				<category><![CDATA[Marketing Digital]]></category>
		<category><![CDATA[Usabilidade]]></category>

		<guid isPermaLink="false">http://www.mxstudio.com.br/?p=7020</guid>
		<description><![CDATA[O código é a engenharia completa de um site, sem ele não existe site, isso é um fato! Ter um código limpo, não é necessariamente, ter um site 100% rodando sem erros, até porque, o erro não precisa ser “visualmente” constatado. Mesmo que seu site seja homologado muitas vezes por você mesmo, sempre passa alguma [...]]]></description>
			<content:encoded><![CDATA[<p>O código é a engenharia completa de um site, sem ele não existe site, isso é um fato!<br />
Ter um código limpo, não é necessariamente, ter um site 100% rodando sem erros, até porque, o erro não precisa ser “visualmente” constatado.</p>
<p>Mesmo que seu site seja homologado muitas vezes por você mesmo, sempre passa alguma coisa que sua mente cansada não visualizou, ou simplesmente, deixou para resolver o tal erro, mais tarde e no final, não resolveu.<br />
Use a cabeça, quer dizer, use mais mentes a seu favor. Fazer testes de estresses (que é forçar os erros acontecerem) no seu código ajuda a sanar os erros que restaram, mais não quer dizer que foram todos resolvidos.</p>
<p>Pessoas que nunca visualizaram seu site ou seu código podem ajudar nessa tarefa. Veja algumas coisas que nunca poderão acontecer em seu site:</p>
<p>1. Já imaginou um usuário entrar em um site, e clicar em um link que não vai para lugar nenhum? Complicado isso, é estressante! Para que tem a tal da “mãozinha” se não te leva a lugar algum?</p>
<p>2. Site que demora de carregar. Isso realmente mata. Você acha que é pouco tempo, mais para o usuário esperar mais de 10 segundos para seu site carregar, é uma eternidade. Otimize seu código, suas imagens, e o conteúdo do texto pode também ser otimizado. Pense nisso!</p>
<p>3. Tipografia! O que é isso? São as fontes usadas em seu site. Certo! Fontes? Não use tantas fontes em seu site, duas no máximo, para que ter um carnaval de fontes de vários tipos e de vários tamanhos? Foque na usabilidade.</p>
<p>4. Formulários. Essa palavra realmente desanima seu usuário. Nome, e-mail, telefone, celular, CPF, endereço, bairro, cidade, estado… Nossa! Quanta coisa! Você mesmo iria preencher isso tudo? Otimize esses campos. O usuário odeia digitar muito, somos preguiçosos na internet, não podemos gastar muito tempo.</p>
<p>Essas dicas podem te ajudar a ter um código mais limpo e ter uma boa usabilidade em seu site. Pesquise mais sobre usabilidade, as empresas hoje em dia procuram profissionais que tenham uma mente aberta para customizar sites antigos!</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/marketingdigital/usabilidade/usabilidade-em-codigos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como adicionar o botão Google+1 plus one.</title>
		<link>http://www.mxstudio.com.br/marketingdigital/usabilidade/plusone_google/</link>
		<comments>http://www.mxstudio.com.br/marketingdigital/usabilidade/plusone_google/#comments</comments>
		<pubDate>Mon, 11 Jul 2011 02:09:50 +0000</pubDate>
		<dc:creator>Bruno Henris</dc:creator>
				<category><![CDATA[Marketing Digital]]></category>
		<category><![CDATA[Usabilidade]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[Plus one]]></category>

		<guid isPermaLink="false">http://www.mxstudio.com.br/?p=6649</guid>
		<description><![CDATA[Olá a todos do portal MXStudio; sejam bem vindos a mais um artigo sobre as ferramentas do Google, dessa vez vou estar escrevendo sobre a novidade: o Plus one o botão +1 do Google, que é como uma resposta ao botão &#8220;Curtir&#8221; da rede social Facebook. O Google sempre inova na área de SEO (otimização [...]]]></description>
			<content:encoded><![CDATA[<p>Olá a todos do portal <strong>MXStudio</strong>; sejam bem vindos a mais um artigo sobre as ferramentas do Google, dessa vez vou estar escrevendo sobre a novidade: o Plus one o botão +1 do Google, que é como uma resposta ao botão &#8220;Curtir&#8221; da rede social Facebook. </p>
<p>O Google sempre inova na área de SEO (otimização de sites) e no dia 1 de junho 2011 lançou no Brasil, esse serviço que serve de avaliação para os sites e funcionando como um indicador para o Google.<br />
A ideia do botão não é bem diferente do botão curtir do Facebook, esse botão vai ser inserido no seu site,de forma bem parecida também com o &#8220;Curtir&#8221; e depois de instalado, os visitantes vão poder avaliar e recomendar a outros usuários, para adicionar o +1 ao site que esteja visitando, o usuário precisa estar conectado ao Google; quando estiver fazendo uma pesquisa no buscador, você vai encontrar o nome do site e ao lado o numero de vezes que foi adicionado o +1 ao site em questão; isso é muito importante para que os internautas possam encontrar conteúdo mais relevante a suas pesquisas; também é  importante para os sites, pelo fato dessas avaliações servirem de atrativos para chamar novos visitantes e com isso aumentar seu tráfego.<br />
Bom agora que foi explicado um pouco sobre este botão, vou estar ensinado como adicionar ele em seu site,o processo é bem simples e rápido, então vamos lá.</p>
<p>1° passo- Entre no site http://www.google.com/webmasters/+1/button<br />
<a href="http://www.mxstudio.com.br/wp-content/uploads/2011/07/botao+1-foto1.jpg"><img src="http://www.mxstudio.com.br/wp-content/uploads/2011/07/botao+1-foto1-300x168.jpg" alt="" width="300" height="168" class="aligncenter size-medium wp-image-6651" /></a></p>
<p>2° passo- depois escolha o idioma de sua preferencia e o tamanho que deseja visualizar o botão em seu site, são 4 opções: pequeno, médio, grande e padrão, ao lado já é possível visualizar sua escolha.</p>
<p>3° passo- mais abaixo você encontra a opções avançadas, basta clicar sobre o link que vai abrir as opções.<br />
<a href="http://www.mxstudio.com.br/wp-content/uploads/2011/07/botao+1.jpg"><img src="http://www.mxstudio.com.br/wp-content/uploads/2011/07/botao+1-300x168.jpg" alt="" width="300" height="168" class="aligncenter size-medium wp-image-6652" /></a></p>
<p>4° passo- Nessas opções que vai abrir você vai encontrar: Incluir contagem(marque esta opção),analisar(é onde você pode escolher entre Default(on load) e explicit), Função de retorno JS e URL para +1(onde você vai colocar o endereço do site em que deseja ser adicionado o botão.</p>
<p>5° passo- Abaixo você vai visualizar o código gerado pelo botão, onde você precisa copiar e colar nas paginas do site, ou seja adicionar esse JavaScript ao seu código fonte.<br />
este código vai estar dividido em 2 partes; a 1° parte deve ser colocada na seção HEAD ou antes do fechamento de BODY, ja a 2°parte do código deve ser inserido onde você deseja exibir o botão.<br />
<a href="http://www.mxstudio.com.br/wp-content/uploads/2011/07/codigo.jpg"><img src="http://www.mxstudio.com.br/wp-content/uploads/2011/07/codigo-300x300.jpg" alt="" width="300" height="300" class="aligncenter size-medium wp-image-6653" /></a></p>
<p>Bom é isso amigos, o processo para adicionar o botão é bem simples, basta seguir as informações do site, é bem rápido e fácil de fazer, na própria pagina do plus one logo abaixo você pode esclarecer suas duvidas em perguntas frequentes.<br />
Agora é só esperar que os visitantes avaliem seu site e se este botão do Google vai mesmo funcionar e agradar os internautas, só o tempo vai poder responder isso; nem tudo que o Google faz ou fez teve um bom retorno dos internautas, agora basta dar um tempo para o <strong>+1 plus one</strong>. </p>
<p>Agradeço a todos  leitores do portal <strong>MXStudio</strong> e em breve vou estar escrevendo sobre como integrar o botão+1 com o Google Analytics; e antes de terminar você também pode clicar no botão aqui no portal e recomendar este artigo e os demais ao seus amigos é claro se você achar justo, abraço a todos e até breve.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/marketingdigital/usabilidade/plusone_google/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>ASP &#8211; ISAPI REWRITE</title>
		<link>http://www.mxstudio.com.br/marketingdigital/usabilidade/asp-isapi-rewrite-2/</link>
		<comments>http://www.mxstudio.com.br/marketingdigital/usabilidade/asp-isapi-rewrite-2/#comments</comments>
		<pubDate>Sun, 24 Apr 2011 14:00:24 +0000</pubDate>
		<dc:creator>X@nBuRzUm</dc:creator>
				<category><![CDATA[ASP.net]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Usabilidade]]></category>

		<guid isPermaLink="false">http://www.mxstudio.com.br/marketingdigital/usabilidade/asp-isapi-rewrite-2/</guid>
		<description><![CDATA[ISAPI REWRITE é um mecanismo de reescrita que modifica a aparência de uma URL da web ,cria regras e extensões que são executadas antes de um servidor web mostrar o conteúdo solicitado por um usuário. São controladas por eventos do servidor não por requisições do cliente. Aqui algumas ótimas referencias de estudo sobre o assunto, [...]]]></description>
			<content:encoded><![CDATA[<p>ISAPI REWRITE é um mecanismo de reescrita que modifica a aparência de uma URL da web ,cria regras e extensões que são executadas antes de um servidor web mostrar o conteúdo solicitado por um usuário. São controladas por eventos do servidor não por requisições do cliente. Aqui algumas ótimas referencias de estudo sobre o assunto, <a title="http://www.isapirewrite.com/" href="http://www.isapirewrite.com/" target="_blank">http://www.isapirewrite.com/</a>, <a title="http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html" href="http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html" target="_blank">http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html</a>.</p>
<p>Podemos por exemplo, mudar uma URL assim:</p>
<p>http://exemplo.com.br/teste/index.asp?titulo= titulo_pagina</p>
<p>Para:</p>
<pre>http:// exemplo.com.br/ teste / titulo_pagina

Um Fórum pode ter uma URL que codifica as datas de cada entrada:</pre>
<p><a href="http://www.site.com.br/Forum/Posts.asp?Dia=11&amp;Mes=04&amp;Ano=2011">http://www.site.com.br/Forum/Posts.asp?Dia=11&amp;Mes=04&amp;Ano=2011</a><br />
Ela pode ser alterada como esta:</p>
<p>http://www. site.com.br/Forum /11/04/2011/</p>
<p>que também permite ao usuário alterar a URL para ver todos os lançamentos disponíveis em abril, basta remover a codificação de texto no dia &#8217;11 &#8216;, como se a navegação fosse &#8220;para cima&#8221; de um diretório:</p>
<p>http://www. site.com.br/Forum/04/2011/</p>
<h2>Podemos também utilizar para proteção de hotlink, no seu arquivo <strong>httpd.ini</strong> adicione essas linhas:</h2>
<p>#<strong> </strong>proteção<strong> </strong>hotlink<br />
RewriteCond Host: (.+)<br />
RewriteCond Referer: (?!http://1.*).*<br />
RewriteRule .*.(?:gif|jpg|png) /block.gif [I,O]</p>
<p>Para esta expressão protegemos todos os formatos de arquivos com extensão <strong>gif, jpg </strong>e <strong>png</strong>. Você pode proteger outros formatos adicionando-os na última linha do código.</p>
<p><strong>Instalando</strong></p>
<p>Para a instalação necessitamos ter controle total de um servidor local ou próprio se a instalação for em um servidor compartilhado, utilize o painel de controle, geralmente por um botão de comando ativar/desativar, ou então por uma solicitação no helpdesk.</p>
<h2>Criando regras para as urls amigáveis.</h2>
<p>Vamos criar regras básicas, para facilitar o entendimento e absorção do material e neste caso, vamos criar uma regra para cada arquivo.<br />
O site que vamos utilizar como exemplo para implementar as URL’s amigáveis tem as seguintes páginas:  home.asp, empresa.asp, produtos.asp, contato.asp</p>
<p>A pagina de home é uma pagina dinâmica, que recebe até 3 parâmetros: id do produto, categoria e quantidade (em caso de paginação). Ou seja, a pagina de noticias é acessada da seguinte maneira:</p>
<p><a href="http://www.site.com.br/home.asp?categoria=15&amp;idproduto=23&amp;quantidade=3">HTTP://www.site.com.br/home.asp?categoria=15&amp;idproduto=23&amp;quantidade=3</a></p>
<p>Logo, a regra deverá ser:</p>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td><code>RewriteRule     ^/</code><code>preco</code><code>/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)-([0-9]+),([0-9]+),([0-9]+)/?(.html)?$    /</code><code>home</code><code>.asp?</code> categoria   <code>=$3&amp;id</code><code>produto</code><code>=$4&amp;</code><code>quantidade</code><code>=$5   [I,L]</code></td>
</tr>
</tbody>
</table>
<p>Esta é regra a conversão do link acima, que retornará o seguinte endereço:</p>
<p>HTTP://www.site.com.br/home/informatica/mouse-otico-15,23,3.html</p>
<p>Para as demais paginas, que não recebem parâmetros as regras ficarão mais simples, veja:</p>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td><code>RewriteRule    ^/default/?([a-zA-Z0-9_-]+)?(.html)?$ /default.asp [I,L]</code></td>
</tr>
<tr>
<td colspan="2"><code>RewriteRule    ^/quemsomos/?([a-zA-Z0-9_-]+)?(.html)?$ /</code><code>empresa</code><code>.asp   [I,L]</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td colspan="2"><code>RewriteRule    ^/servicos/?([a-zA-Z0-9_-]+)?(.html)?$ /</code><code>produtos</code><code>.asp   [I,L]</code></td>
</tr>
<tr>
<td><code>RewriteRule    ^/contato/?([a-zA-Z0-9_-]+)?(.html)?$ /contato.asp [I,L]</code></td>
</tr>
</tbody>
</table>
<h2>Modificando os links internos</h2>
<p>Depois que as regras foram mapeadas e concluídas, e todas paginas já estão funcionando com a utilização do ISAPI REWRITE, chega a hora então e apontar os links internos do site para a novo formato do link. Vamos efetuar uma busca no site por todas as ocorrências da tag <em>“&lt;a&gt;…&lt;/a&gt;”</em>. Localize e abra todos os arquivos que contenha a sintax <em>“&lt;a href=</em>”.</p>
<p>Com os links já localizados, faça a modificação do código tomado como exemplo. Troque:</p>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td><code>&lt;a   href="</code><code>home</code><code>.asp?</code><code>c=15&amp;</code><code>Categoria=23&amp;</code><code>quantidade</code><code>=3"&gt;Titulo   Notícia&lt;/a&gt;</code></td>
</tr>
</tbody>
</table>
<p>Por:</p>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td><code>&lt;a    href="&lt;%=URLamigavel("</code><code>home</code><code>.asp?</code><code>v</code><code>=15&amp;idCategoria=23&amp;</code><code> quantidade </code><code>=3","nome    da Categoria","Titulo Noticia")%&gt;"&gt;Titulo   Notícia&lt;/a&gt;</code></td>
</tr>
</tbody>
</table>
<p>Para que o site permaneça funcionando, basta criar uma função que retorne o mesmo valor. Assim também é possível manter o site funcionando caso ocorre algum problema com o servidor ou com a própria aplicação.</p>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td colspan="2"><code>Function</code> <code>URLamigavel(param)</code></td>
</tr>
<tr>
<td><code>URLamigavel   = param</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td><code>End</code> <code>Function</code></td>
</tr>
</tbody>
</table>
<h2>Função para converter url amigável</h2>
<p>Precisaremos então de uma função que converta os links atuais, para os novos formatos de links. Na sua biblioteca de funções cria as seguinte funções:</p>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td><code>&lt;pre&gt;Function</code> <code>urlAmigavel(pag,   ByVal</code> <code>cat, ByVal</code> <code>tit)</code></td>
</tr>
<tr>
<td></td>
<td colspan="2"><code> </code><code>dim   URL, arquivo, parametros, sField, sValue, valor</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td colspan="2"><code> URL = "</code><code><a href="http://www.site.com.br/">http://www.site.com.br/</a></code><code>"</code></td>
</tr>
<tr>
<td></td>
<td><code> If</code> <code>InStr(pag,   ".asp"</code> <code>)   &gt; 0 Then</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td colspan="2"><code> arquivo   = Left( pag, ( InStr(pag, ".asp"</code> <code>) -1)    )</code></td>
</tr>
<tr>
<td></td>
<td><code> If</code> <code>InStr(pag,   "?"</code> <code>)   Then</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td colspan="2"><code> parametros = Split( Right( pag , Len(pag)   -  InStr(pag, "?"</code> <code>)   ) , "&amp;")</code></td>
</tr>
<tr>
<td></td>
<td><code> For</code> <code>j   = 0 To</code> <code>UBound(   parametros )</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td><code> sField   = left ( parametros(j) , InStr( parametros(j) , "=") -1 )</code></td>
</tr>
<tr>
<td></td>
<td colspan="2"><code> sValue   = Right( parametros(j) , Len(parametros(j)) -  InStr( parametros(j) ,   "=") )</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td colspan="2"><code> if valor = ""</code> <code>Then</code> <code>valor =   sValue Else</code> <code>valor   = valor &amp;","&amp; sValue End</code> <code>If</code></td>
</tr>
<tr>
<td></td>
<td><code> </code><code>Next</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td><code> End</code> <code>if</code></td>
</tr>
<tr>
<td></td>
<td><code> End</code> <code>if</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td><code> If</code> <code>tit   &lt;&gt; ""</code> <code>then</code></td>
</tr>
<tr>
<td></td>
<td colspan="2"><code> tit =   "/"&amp; FormataTitulo( tit )</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td><code> If</code> <code>cat   &lt;&gt; ""</code> <code>then</code></td>
</tr>
<tr>
<td></td>
<td colspan="2"><code> cat =   "/"&amp; FormataTitulo( cat )</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td colspan="2"><code> End</code> <code>if</code></td>
</tr>
<tr>
<td></td>
<td><code> Else</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td colspan="2"><code> tit =   "/"</code></td>
</tr>
<tr>
<td></td>
<td><code> End</code> <code>if</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td colspan="2"><code> If</code> <code>valor   &lt;&gt; ""</code> <code>Then</code> <code>valor =   "-"</code> <code>&amp;   valor&amp;".html"</code> <code>End</code> <code>If</code></td>
</tr>
<tr>
<td></td>
<td><code> </code><code>urlAmigavel   = URL &amp; arquivo &amp; cat &amp; tit &amp; valor</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td><code>End</code> <code>Function</code></td>
</tr>
<tr>
<td></td>
<td colspan="2"><code>'---------------------------------------------------------------</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td colspan="2"><code>Function</code> <code>ereg_replace(ByVal</code> <code>ereg_vetor,   ByVal</code> <code>repl, ByVal</code> <code>valor)</code></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td colspan="2"><code>&lt;pre&gt; ereg_vetorV = Split(ereg_vetor,   "-")</code></td>
</tr>
<tr>
<td></td>
<td><code> If</code> <code>ubound(ereg_vetorV)   &gt; 0 Then</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td colspan="2"><code> charName     = Split(ereg_vetorV(0),"|")</code></td>
</tr>
<tr>
<td></td>
<td><code> For</code> <code>i_ereg   = 0 To</code> <code>UBound(charName)</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td colspan="2"><code> valor   = Replace(valor, charName(i_ereg), repl)</code></td>
</tr>
<tr>
<td></td>
<td><code> Next</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td><code> If</code> <code>UBound(ereg_vetorV)   &gt;= 1 then</code></td>
</tr>
<tr>
<td></td>
<td colspan="2"><code> </code><code>charID       = Split(ereg_vetorV(1),"|")</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td><code> If</code> <code>Join(charID)   &lt;&gt; ""</code> <code>then</code></td>
</tr>
<tr>
<td></td>
<td colspan="2"><code> For</code> <code>i_ereg   = 0 To</code> <code>UBound(charID)</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td colspan="2"><code> valor   = Replace(valor, "&amp;#"</code> <code>&amp;   charID(i_ereg) &amp; ";", repl)</code></td>
</tr>
<tr>
<td></td>
<td><code> Next</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td><code> End</code> <code>if</code></td>
</tr>
<tr>
<td></td>
<td><code> End</code> <code>if</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td><code> End</code> <code>If</code></td>
</tr>
<tr>
<td></td>
<td colspan="2"><code> ereg_replace   = valor</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td><code>End</code> <code>Function</code></td>
</tr>
<tr>
<td></td>
<td colspan="2"><code>Function</code> <code>FormataTitulo(   ByVal</code> <code>s )</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td><code> s =   Trim(s)</code></td>
</tr>
<tr>
<td></td>
<td colspan="2"><code> s =   LCase(s)</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td colspan="2"><code> s =   ereg_replace("á|à|â|ã|ä|ª-@|224|225|226|227|228|229","a",s)</code></td>
</tr>
<tr>
<td></td>
<td><code> s =   ereg_replace("é|è|ê|ë-232|233|234|235","e",s)</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td><code> s =   ereg_replace("í|ì|î|ï-236|237|238|239","i",s)</code></td>
</tr>
<tr>
<td></td>
<td colspan="2"><code> </code><code>s   =   ereg_replace("ó|ò|ô|õ|º|ö-242|243|244|245|246|186","o",s)</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td colspan="2"><code> s =   ereg_replace("ú|ù|û|ü-249|250|251|252","u",s)</code></td>
</tr>
<tr>
<td></td>
<td><code> s =   ereg_replace("ç-231","c",s)</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td colspan="2"><code> s =   ereg_replace("ñ","n",s)</code></td>
</tr>
<tr>
<td></td>
<td><code> s =   replace(s , "-", "")</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td><code> s =   replace(s , "&amp;", "")</code></td>
</tr>
<tr>
<td></td>
<td colspan="2"><code> s =   replace(s , " ", "-")</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td><code> s =   replace(s , ",", "")</code></td>
</tr>
<tr>
<td></td>
<td><code> s =   replace(s , "?", "")</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td><code> s =   replace(s , ":", "")</code></td>
</tr>
<tr>
<td></td>
<td><code> s =   replace(s , "/", "")</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td><code> s =   replace(s , ".", "")</code></td>
</tr>
<tr>
<td></td>
<td><code> s =   replace(s , "'", "")</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td><code> s =   replace(s , "´", "")</code></td>
</tr>
<tr>
<td></td>
<td colspan="2"><code> s =   replace(s , "&amp;quot;", "")</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td colspan="2"><code> s =   replace(s , "$", "s")</code></td>
</tr>
<tr>
<td></td>
<td><code> s =   replace(s , "!", "")</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td colspan="2"><code> s =   replace(s , "%", "")</code></td>
</tr>
<tr>
<td></td>
<td><code> FormataTitulo   = s</code></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td></td>
<td><code>End</code> <code>Function&lt;/pre&gt;</code></td>
</tr>
</tbody>
</table>
<p><span style="text-decoration: underline"> </span></p>
<p>Abaixo alguns metacaracteres, com o seu significado entre parêntesis a seguir:</p>
<p>•	. (qualquer caractere)<br />
•	* (zero ou mais precedentes)<br />
•	+ (uma ou mais precedentes)<br />
•	{} (mínimo ao máximo quantificador)<br />
•	? (modificador ungreedy)<br />
•	! (no início da string significa &#8220;padrão negativo &#8220;)<br />
•	^ (início da seqüência de caracteres, ou &#8220;negativo&#8221; se no início de uma série)<br />
•	$ (final da string)<br />
•	[] (corresponde a nenhum conteúdo)<br />
•	- (intervalo se usado entre colchetes)<br />
•	() (grupo, de volta referenciado)<br />
•	| (alternativa, ou)<br />
•	\ (o próprio caractere de escape)</p>
<p>Usando expressões regulares, é possível pesquisar por todos os tipos de padrões de URLs e reescrevê-los quando eles coincidem. Hora para um outro exemplo &#8211; que queríamos antes de ser capaz de identificar essa URL e reescrevê-lo:</p>
<p>http://www.site.com.br/ araras/brasil-azul/</p>
<p>Vamos fazer o servidor interpretar isso como o seguinte, mas para todos os produtos:</p>
<p>http://www. site.com.br /produto_por_nome.asp?produto_nome= brasil-azul</p>
<p>E podemos fazer isso de forma relativamente simples, com a seguinte regra:</p>
<p>RewriteRule ^ araras/([A-Za-z0-9-]+)/?$      produto_por_nome.asp?produto_nome =$1                  [NC,L]               # Processo araras</p>
<p>Com essa regra, qualquer URL que começa com &#8221; araras &#8220;, seguido por uma barra (araras /), então um ou mais (+) em qualquer combinação de letras, números e hífens ([A-Za-z0-9]) ( Observe o hífen no final da seleção de caracteres entre colchetes &#8211; que deve ser adicionado lá para ser tratado, literalmente, ao invés de como um separador de intervalo),nome do produto de referência entre parênteses, com $1 na substituição.</p>
<p>Podemos fazer ainda mais genérica, se queremos, de modo que não importa o diretório de um produto, assim:</p>
<p>RewriteRule ^ [A-Za-z-]+/([ produto_por_nome.asp A-Za-z0-9-]+)/?$           ? produto_nome = $ 1               [NC, L]                 # Processa todos os produtos</p>
<p>Como você pode ver, temos substituído &#8221; araras&#8221; com um padrão que combina letras e hífens. Essa regra será para diretório araras ou qualquer outro diretório cujo nome é composto de pelo menos uma ou mais letras e hífens.</p>
<p>Flags</p>
<p>Flags são adicionados ao final de uma regra como interpretar e lidar com a regra. Elas podem ser usadas para tratar a regra como case-sensitive, para parar regras de processamento, e os  one matches atual, ou uma variedade de outras opções. Eles são separados por vírgula, e entre colchetes. Aqui está uma lista das Flags, com seus significados (esta informação é incluído no cheat sheet).</p>
<p>•	C (acorrentado com a regra seguinte)<br />
•	CO=cookie (set cookie especificado)<br />
•	E=var:value (var conjunto variável de ambiente para o valor)<br />
•	F (forbidden [proibido] &#8211; envia um cabeçalho de 403 para o usuário)<br />
•	G (gone [se foi] &#8211; não existe mais)<br />
•	H=handler (conjunto manipulador)<br />
•	L (last &#8211; deixar de regras de processamento)<br />
•	N (next &#8211; continua regras de processamento)<br />
•	NC (case insensitive)<br />
•	NE (n ão escapar caracteres especiais na URL de saída)<br />
•	NS (ignorar esta regra se o pedido é um SUBPEDIDO)<br />
•	P (proxy &#8211; ou seja, o Apache deve pegar o conteúdo remoto especificado na seção de substituição e devolvê-lo)<br />
•	PT (passar &#8211; use quando URLs com os manipuladores de processamento adicional, por exemplo, mod_alias)<br />
•	R (temporária redirecionar para nova URL)<br />
•	R=301 (redirecionamento permanente para nova URL)<br />
•	QSA (query string de pedido de URL substituído)<br />
•	S=x (ignorar as regras ao lado x)<br />
•	T=mime-type (força especificada tipo mime)</p>
<p>Exceções e casos especiais</p>
<p>As condições podem ser testadas em algumas maneiras diferentes ,elas não precisam ser tratadas como padrões de expressões regulares, embora esta seja a maneira mais comum de serem usadas. Aqui estão as várias maneiras reescrever conditons pode ser processado:</p>
<p>•Pattern (seqüência de teste é maior do padrão)<br />
•	=Pattern (seqüência de teste é igual ao padrão)<br />
•	-d (seqüência de teste é um diretório válido)<br />
•	-f (seqüência de teste é um arquivo válido)<br />
•	-s (seqüência de teste é um arquivo válido com tamanho maior que zer)<br />
•	-l (eqüência de teste é um link simbólico)<br />
•	-F (seqüência de teste é um arquivo válido e acessível (via SUBPEDIDO))<br />
•	-U (seqüência de teste é uma URL válida, e acessíveis (via SUBPEDIDO))</p>
<p>Variáveis de Servidor</p>
<p>Variáveis do servidor são uma seleção de itens que você pode testar quando estiver a escrever reescrever condições. Isto permite-lhe aplicar as regras com base em todos os tipos de parâmetros da requisição, incluindo os identificadores navegador, URL de referência ou uma infinidade de outras seqüências. As variáveis são do seguinte formato:<br />
% {variable_name}</p>
<p>•	HTTP Headers<br />
o	HTTP_USER_AGENT<br />
o	HTTP_REFERER<br />
o	HTTP_COOKIE<br />
o	HTTP_FORWARDED<br />
o	HTTP_HOST<br />
o	HTTP_PROXY_CONNECTION<br />
o	HTTP_ACCEPT<br />
•	Variáveis Connection<br />
o	REMOTE_ADDR<br />
o	REMOTE_HOST<br />
o	REMOTE_USER<br />
o	REMOTE_IDENT<br />
o	REQUEST_METHOD<br />
o	SCRIPT_FILENAME<br />
o	PATH_INFO<br />
o	QUERY_STRING<br />
o	AUTH_TYPE<br />
•	Server Variables<br />
o	DOCUMENT_ROOT<br />
o	SERVER_ADMIN<br />
o	SERVER_NAME<br />
o	SERVER_ADDR<br />
o	SERVER_PORT<br />
o	SERVER_PROTOCOL<br />
o	SERVER_SOFTWARE<br />
•	Data e Hora<br />
o	TIME_YEAR<br />
o	TIME_MON<br />
o	TIME_DAY<br />
o	TIME_HOUR<br />
o	TIME_MIN<br />
o	TIME_SEC<br />
o	TIME_WDAY<br />
o	TIME<br />
•	Itens Especiais<br />
o	API_VERSION<br />
o	THE_REQUEST<br />
o	REQUEST_URI<br />
o	REQUEST_FILENAME<br />
o	IS_SUBREQ</p>
<p>Exemplo de regras</p>
<p>Para redirecionar um domínio antigo para um novo domínio:</p>
<p>RewriteCond %{HTTP_HOST} velho_dominio\.com [NC] RewriteRule ^(.*)$ http://www.novo_dominio.com /$1 [L,R=301]</p>
<p>Para redirecionar todas as solicitações faltando &#8220;www&#8221; (sim www):</p>
<p>RewriteCond %{HTTP_HOST} ^dominio\.com [NC] RewriteRule ^(.*)$ http://www.dominio.com/$1 [L,R=301]</p>
<p>Para redirecionar todas as solicitações com &#8220;www&#8221; (sem www):</p>
<p>RewriteCond %{HTTP_HOST} ^www\.dominio\.com [NC] RewriteRule ^(.*)$ http:// dominio.com/$1 [L,R=301]</p>
<p>Redirecionar página antiga para a nova página:</p>
<p>RewriteRule ^old-url\.htm$ http://www.dominio.com/nova-url.htm [NC,R=301,L]</p>
<p>[size="1"][font="Garamond"]<br />
Fonte: vários sites e URL´s citadas no próprio post.[/font][/size]Abaixo alguns metacaracteres, com o seu significado entre parêntesis a seguir:</p>
<p>•	. (qualquer caractere)<br />
•	* (zero ou mais precedentes)<br />
•	+ (uma ou mais precedentes)<br />
•	{} (mínimo ao máximo quantificador)<br />
•	? (modificador ungreedy)<br />
•	! (no início da string significa &#8220;padrão negativo &#8220;)<br />
•	^ (início da seqüência de caracteres, ou &#8220;negativo&#8221; se no início de uma série)<br />
•	$ (final da string)<br />
•	[] (corresponde a nenhum conteúdo)<br />
•	- (intervalo se usado entre colchetes)<br />
•	() (grupo, de volta referenciado)<br />
•	| (alternativa, ou)<br />
•	\ (o próprio caractere de escape)</p>
<p>Usando expressões regulares, é possível pesquisar por todos os tipos de padrões de URLs e reescrevê-los quando eles coincidem. Hora para um outro exemplo &#8211; que queríamos antes de ser capaz de identificar essa URL e reescrevê-lo:</p>
<p>http://www.site.com.br/ araras/brasil-azul/</p>
<p>Vamos fazer o servidor interpretar isso como o seguinte, mas para todos os produtos:</p>
<p>http://www. site.com.br /produto_por_nome.asp?produto_nome= brasil-azul</p>
<p>E podemos fazer isso de forma relativamente simples, com a seguinte regra:</p>
<p>RewriteRule ^ araras/([A-Za-z0-9-]+)/?$<br />
produto_por_nome.asp?produto_nome =$1 [NC,L] # Processo araras</p>
<p>Com essa regra, qualquer URL que começa com &#8221; araras &#8220;, seguido por uma barra (araras /), então um ou mais (+) em qualquer combinação de letras, números e hífens ([A-Za-z0-9]) ( Observe o hífen no final da seleção de caracteres entre colchetes &#8211; que deve ser adicionado lá para ser tratado, literalmente, ao invés de como um separador de intervalo),nome do produto de referência entre parênteses, com $1 na substituição.</p>
<p>Ppodemos fazer ainda mais genérica, se queremos, de modo que não importa o diretório de um produto, assim:</p>
<p>RewriteRule ^ [A-Za-z-]+/([ produto_por_nome.asp A-Za-z0-9-]+)/?$? produto_nome = $ 1 [NC, L] # Processa todos os produtos</p>
<p>Como você pode ver, temos substituído &#8221; araras&#8221; com um padrão que combina letras e hífens. Essa regra será para diretório araras ou qualquer outro diretório cujo nome é composto de pelo menos uma ou mais letras e hífens.</p>
<p>Flags</p>
<p>Flags são adicionados ao final de uma regra como interpretar e lidar com a regra. Elas podem ser usadas para tratar a regra como case-sensitive, para parar regras de processamento, e os  one matches atual, ou uma variedade de outras opções. Eles são separados por vírgula, e entre colchetes. Aqui está uma lista das Flags, com seus significados (esta informação é incluído no cheat sheet).</p>
<p>•	C (acorrentado com a regra seguinte)<br />
•	CO=cookie (set cookie especificado)<br />
•	E=var:value (var conjunto variável de ambiente para o valor)<br />
•	F (forbidden [proibido] &#8211; envia um cabeçalho de 403 para o usuário)<br />
•	G (gone [se foi] &#8211; não existe mais)<br />
•	H=handler (conjunto manipulador)<br />
•	L (last &#8211; deixar de regras de processamento)<br />
•	N (next &#8211; continua regras de processamento)<br />
•	NC (case insensitive)<br />
•	NE (n ão escapar caracteres especiais na URL de saída)<br />
•	NS (ignorar esta regra se o pedido é um SUBPEDIDO)<br />
•	P (proxy &#8211; ou seja, o Apache deve pegar o conteúdo remoto especificado na seção de substituição e devolvê-lo)<br />
•	PT (passar &#8211; use quando URLs com os manipuladores de processamento adicional, por exemplo, mod_alias)<br />
•	R (temporária redirecionar para nova URL)<br />
•	R=301 (redirecionamento permanente para nova URL)<br />
•	QSA (query string de pedido de URL substituído)<br />
•	S=x (ignorar as regras ao lado x)<br />
•	T=mime-type (força especificada tipo mime)</p>
<p>Exceções e casos especiais</p>
<p>As condições podem ser testadas em algumas maneiras diferentes ,elas não precisam ser tratadas como padrões de expressões regulares, embora esta seja a maneira mais comum de serem usadas. Aqui estão as várias maneiras reescrever conditons pode ser processado:</p>
<p>•<br />
Pattern (seqüência de teste é maior do padrão)<br />
•	=Pattern (seqüência de teste é igual ao padrão)<br />
•	-d (seqüência de teste é um diretório válido)<br />
•	-f (seqüência de teste é um arquivo válido)<br />
•	-s (seqüência de teste é um arquivo válido com tamanho maior que zer)<br />
•	-l (eqüência de teste é um link simbólico)<br />
•	-F (seqüência de teste é um arquivo válido e acessível (via SUBPEDIDO))<br />
•	-U (seqüência de teste é uma URL válida, e acessíveis (via SUBPEDIDO))</p>
<p>Variáveis de Servidor</p>
<p>Variáveis do servidor são uma seleção de itens que você pode testar quando estiver a escrever reescrever condições. Isto permite-lhe aplicar as regras com base em todos os tipos de parâmetros da requisição, incluindo os identificadores navegador, URL de referência ou uma infinidade de outras seqüências. As variáveis são do seguinte formato:<br />
% {variable_name}</p>
<p>•	HTTP Headers<br />
o	HTTP_USER_AGENT<br />
o	HTTP_REFERER<br />
o	HTTP_COOKIE<br />
o	HTTP_FORWARDED<br />
o	HTTP_HOST<br />
o	HTTP_PROXY_CONNECTION<br />
o	HTTP_ACCEPT<br />
•	Variáveis Connection<br />
o	REMOTE_ADDR<br />
o	REMOTE_HOST<br />
o	REMOTE_USER<br />
o	REMOTE_IDENT<br />
o	REQUEST_METHOD<br />
o	SCRIPT_FILENAME<br />
o	PATH_INFO<br />
o	QUERY_STRING<br />
o	AUTH_TYPE<br />
•	Server Variables<br />
o	DOCUMENT_ROOT<br />
o	SERVER_ADMIN<br />
o	SERVER_NAME<br />
o	SERVER_ADDR<br />
o	SERVER_PORT<br />
o	SERVER_PROTOCOL<br />
o	SERVER_SOFTWARE<br />
•	Data e Hora<br />
o	TIME_YEAR<br />
o	TIME_MON<br />
o	TIME_DAY<br />
o	TIME_HOUR<br />
o	TIME_MIN<br />
o	TIME_SEC<br />
o	TIME_WDAY<br />
o	TIME<br />
•	Itens Especiais<br />
o	API_VERSION<br />
o	THE_REQUEST<br />
o	REQUEST_URI<br />
o	REQUEST_FILENAME<br />
o	IS_SUBREQ</p>
<p>Exemplo de regras</p>
<p>Para redirecionar um domínio antigo para um novo domínio:</p>
<p>RewriteCond %{HTTP_HOST} velho_dominio\.com [NC] RewriteRule ^(.*)$ http://www.novo_dominio.com /$1 [L,R=301]</p>
<p>Para redirecionar todas as solicitações faltando &#8220;www&#8221; (sim www):</p>
<p>RewriteCond %{HTTP_HOST} ^dominio\.com [NC] RewriteRule ^(.*)$ http://www.dominio.com/$1 [L,R=301]</p>
<p>Para redirecionar todas as solicitações com &#8220;www&#8221; (sem www):</p>
<p>RewriteCond %{HTTP_HOST} ^www\.dominio\.com [NC] RewriteRule ^(.*)$ http:// dominio.com/$1 [L,R=301]</p>
<p>Redirecionar página antiga para a nova página:</p>
<p>RewriteRule ^old-url\.htm$ http://www.dominio.com/nova-url.htm [NC,R=301,L]</p>
<p>Para ter os usuários do site assim www.meusite.com.br/usuario, sem o default.asp?usr=NOME, só pelo /usuário:</p>
<p>RewriteEngine on<br />
#<code> </code>Internamente adicionar extensões ao pedido<br />
RewriteCond %{REQUEST_FILENAME}.asp -f<br />
RewriteRule (.*) $1.asp</p>
<p>Fonte: vários sites e URL´s citadas no próprio post.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/marketingdigital/usabilidade/asp-isapi-rewrite-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Como instalar o Google Analytics  no seu site</title>
		<link>http://www.mxstudio.com.br/marketingdigital/usabilidade/google-analytics/</link>
		<comments>http://www.mxstudio.com.br/marketingdigital/usabilidade/google-analytics/#comments</comments>
		<pubDate>Mon, 14 Feb 2011 03:42:48 +0000</pubDate>
		<dc:creator>Bruno Henris</dc:creator>
				<category><![CDATA[Carreira]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Marketing Digital]]></category>
		<category><![CDATA[Mercado]]></category>
		<category><![CDATA[Mobilidade]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Usabilidade]]></category>
		<category><![CDATA[analytics]]></category>
		<category><![CDATA[aplicativo gratuito]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[vistas]]></category>

		<guid isPermaLink="false">http://www.mxstudio.com.br/?p=6029</guid>
		<description><![CDATA[E ai amigos do portal mxstudio, estamos de volta com mais um artigo tutorial, e dessa vez vou ensinar como instalar o google anlytics no seu site, uma ferramenta super importante e que poucas pessoas usam e deveria ser mais aproveitada para gerenciar se o seu site esta tendo retorno. O Google Analytics é um [...]]]></description>
			<content:encoded><![CDATA[<p>E ai amigos do portal mxstudio, estamos de volta com mais um artigo tutorial, e dessa vez vou ensinar como instalar o google anlytics no seu site, uma ferramenta super importante e que poucas pessoas usam e deveria ser mais aproveitada para gerenciar se o seu site esta tendo retorno.<br />
O Google Analytics é um serviço gratuito disponibilizado pela Google onde ao ativar o serviço através de uma conta do Google e cadastrar um site recebe-se um código para ser inserido na página cadastrada e a cada exibição, estatísticas de visitação são enviados ao sistema e disponibilizado ao dono. Com o analytics você vai poder acompanhar as visitas do seu site, quando  tempo seus clientes estão navegando no site e outras informações importantes.<br />
Pelo fato de não conhecerem o aplicativo ou não saberem como instalar muitos web designer não oferecem aos seus clientes um aplicativo gratuito que eles possam acompanhar no seu site, as visitas e tempo de tráfego.<br />
<a href="http://www.mxstudio.com.br/wp-content/uploads/2011/02/google-analytics-logo.png"><img src="http://www.mxstudio.com.br/wp-content/uploads/2011/02/google-analytics-logo.png" alt="" width="181" height="220" class="alignnone size-full wp-image-6028" /></a></p>
<p>Como instalar o Google Analytics :<br />
1° passo você precisa criar uma conta gratuita no google analytics, se você ja possui uma conta no Google será necessário apenas entra com seu login e senha na pagina do Google analytics e aceitar os termos de contrato que você vai ser direcionado ao site.<br />
<a href="http://www.mxstudio.com.br/wp-content/uploads/2011/02/como-usar-o-google-analytics.png"><img src="http://www.mxstudio.com.br/wp-content/uploads/2011/02/como-usar-o-google-analytics-300x239.png" alt="" width="300" height="239" class="alignnone size-medium wp-image-6030" /></a></p>
<p>2° passo informe seus dados ao site e coloque seu domínio o qual o Google deverá analisar .</p>
<p>3° após informar o domínio a ser analisado, você precisa gerar o código que será colocado nas paginas do seu site , salve em um arquivo de texto.<br />
<a href="http://www.mxstudio.com.br/wp-content/uploads/2011/02/codigo-analytics.jpg"><img src="http://www.mxstudio.com.br/wp-content/uploads/2011/02/codigo-analytics.jpg" alt="" width="618" height="194" class="alignnone size-full wp-image-6031" /></a></p>
<p>4° para finalizar a instalação, depois de gerado o código você vai inserir ele dentro de todas as paginas do site antes do fechamento da tag BODY , para essa instalação será necessário que você ou seu webmaster edite o códigos das paginas do site. Se o seu site não possui um CMS(gerenciador de conteúdo) será necessário utilizar o bom e velho Dreamweaver .<br />
abra seu site no Dreamweaver vá até o código e coloque antes do fechamento da tag body sem mecher no restante do código, depois só salvar e enviar ao servidor, após inserir esse código em todas as paginas.</p>
<p>5° no Google analytics vai aparecer que já é possível analisar seu site, porem só após 24h vai aparecer suas visitas e relatórios sobre o site.<br />
<a href="http://www.mxstudio.com.br/wp-content/uploads/2011/02/google-analytics.jpg"><img src="http://www.mxstudio.com.br/wp-content/uploads/2011/02/google-analytics-275x300.jpg" alt="" width="275" height="300" class="alignnone size-medium wp-image-6032" /></a></p>
<p>Bom é isso pessoal, uma ferramenta necessária ao mundo moderno que vai facilitar sua vida com seus clientes ter esse feedback e saber qual o retorno que seu site esta tendo, um aplicativo da marca Google, qualidade garantida e o melhor gratuito.<br />
até mais pessoal, com mais artigos e tutoriais aqui no portal mxstudio, se você esta afim de conferir mais artigos entre no meu site www.brunohenris.com muito obrigado.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/marketingdigital/usabilidade/google-analytics/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Recuperar propriedades da imagem</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/dreamweaver/recuperar-propriedades-da-imagem/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/dreamweaver/recuperar-propriedades-da-imagem/#comments</comments>
		<pubDate>Sun, 19 Sep 2010 13:41:50 +0000</pubDate>
		<dc:creator>X@nBuRzUm</dc:creator>
				<category><![CDATA[ASP.net]]></category>
		<category><![CDATA[Dreamweaver]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Usabilidade]]></category>

		<guid isPermaLink="false">http://www.mxstudio.com.br/?p=5204</guid>
		<description><![CDATA[Recuperar propriedades da imagem de um arquivo não-local ,obter todos os dados da imagem, arquivo com base na definição de algoritmos em tamanho IMGSZ que também pega a imagem de um site remoto usando XML, suporta arquivos GIF e JPG. A sintaxe a utilizar getSize é a seguinte: someBoolean = pegatamanho(URL, width, height, depth, flType) [...]]]></description>
			<content:encoded><![CDATA[<p>Recuperar propriedades da imagem de um arquivo não-local ,obter todos os dados da imagem, arquivo com base na definição de algoritmos em tamanho IMGSZ que também pega a imagem de um site remoto usando XML, suporta arquivos GIF e JPG.</p>
<p>A sintaxe a utilizar getSize é a seguinte:</p>
<p><em>someBoolean = pegatamanho(URL, width, height, depth, flType)<br />
‘URL, largura, altura, profundidade, flType</em></p>
<p>• someBoolean será definido com base verdadeiro ou falso se o script foi capaz de determinar os atributos de imagens<br />
• URL é uma entrada informando a  URL da imagem, tais como http://www.sintchospir.com/images/sua_imagem.jpg<br />
• largura será definida para a largura da imagem, ou -1 para script failed<br />
• A altura será definido para a altura da imagem, ou -1 para script failed<br />
•Profundidade  será definido como a profundidade da imagem, ou -1 para script failed<br />
• FlType será definido o tipo de arquivo de imagem foi, GIF ou JPG</p>
<p>Utilizando as funções de string binária como midb e lenb. Uma vez que todas as imagens são arquivos binários, essas funções são necessárias.</p>
<p><code> 0 then 'começar em bytes não no início<br />
     strbuff = midb(objHTTP.responseBody, offset, bytes)<br />
     end if<br />
     if bytes = -1 then        ' Get All!<br />
        GetBytes = objHTTP.responseBody  'ReadAll<br />
     else<br />
        GetBytes = midb(objHTTP.responseBody, 1, bytes)<br />
     end if<br />
  end function</p>
<p>  function lngConvert(strTemp)<br />
     lngConvert = clng(ascb(leftb(strTemp, 1)) + ((ascb(rightb(strTemp, 1)) * 256)))<br />
  end function</p>
<p>  function lngConvert2(strTemp)<br />
     lngConvert2 = clng(ascb(rightb(strTemp, 1)) + ((ascb(leftb(strTemp, 1)) * 256)))<br />
  end function</p>
<p>    function pegatamanho(URL, width, height, depth, flType)</p>
<p>     dim PNGflType<br />
     dim GIFflType<br />
     dim BMPflType<br />
     dim flTypeOf<br />
     dim obj<br />
     flTypeOf = ""<br />
     flType = "(unknown)"<br />
     Set obj = Server.CreateObject ("Microsoft.XMLHTTP")<br />
     obj.open "GET", URL, False<br />
     obj.send<br />
     '"Aqui nós temos os dados para o arquivo de imagem<br />
     pegatamanho = False<br />
     PNGflType = chr(137) &amp; chr(80) &amp; chr(78)<br />
     GIFflType = chrb(71) &amp; chrb(73) &amp; chrb(70)<br />
     BMPflType = chr(66) &amp; chr(77)<br />
     'Aqui estão as definições para o flTypes imagem, suportam GIF e JPG, mas você pode adicionar outros:)<br />
     flTypeOf = GetBytes(obj, 0, 3)<br />
     'Saiba quaul o flType da imagem<br />
     if flTypeOf = GIFflType then    'É um GIF!!!<br />
     flType = "GIF"<br />
     strbuffer = getbytes(obj, 0, -1) 'obter todos os dados da imagem<br />
     width= lngconvert(midb(strbuffer, 7, 2))<br />
     Height = lngconvert(midb(strbuffer, 9, 2))<br />
     Depth = 2 ^ ((ascb(GetBytes(obj, 11, 1)) and 7) + 1)<br />
     'É muito importante observar o ascB e midB, as imagens são arquivos binários<br />
     pegatamanho = True<br />
     else<br />
     strBuff = GetBytes(obj, 0, -1)        'obter o arquivo inteiro<br />
     SizeofFile = lenb(strBuff)<br />
     flgFound = 0<br />
     strTarget = chrb(255) &amp; chrb(216) &amp; chrb(255)<br />
     flgFound = instrb(strBuff, strTarget)<br />
     char = (midb(strbuff, 1, 3)) 'confira os primeiros caracteres<br />
     if flgFound = 0 then 'diferente de jpg ou GIF<br />
       exit function<br />
     end if<br />
     flType = "JPG"<br />
     lngPos = flgFound + 2<br />
     ExitLoop = false<br />
     do while ExitLoop = False and lngPos &lt; SizeofFile<br />
           do while ascb(midb(strBuff, lngPos, 1)) = 255 and lngPos &lt; SizeofFile<br />
              lngPos = lngPos + 1<br />
           loop<br />
           &#039;pesquisa até encontrar os dados<br />
           if ascb(midb(strBuff, lngPos, 1))  195 then<br />
              lngMarkerSize = lngConvert2(midb(strBuff, lngPos + 1, 2))<br />
              lngPos = lngPos + lngMarkerSize  + 1<br />
           else<br />
              ExitLoop = True 'temos tudo que precisamos<br />
           end if</p>
<p>     loop</p>
<p>           if ExitLoop = False then </p>
<p>              Width = -1<br />
              Height = -1<br />
              Depth = -1</p>
<p>           else</p>
<p>              Height = lngConvert2(midb(strBuff, lngPos + 4, 2))<br />
              Width = lngConvert2(midb(strBuff, lngPos + 6, 2))<br />
              Depth = 2 ^ (ascb(midb(strBuff, lngPos + 8, 1)) * <img src='http://www.mxstudio.com.br/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /><br />
              pegatamanho = True</p>
<p>           end if</p>
<p>     end if</p>
<p>  set obj = Nothing<br />
  end function<br />
%&gt;</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/dreamweaver/recuperar-propriedades-da-imagem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP &#8211; Arrays Dinâmicos</title>
		<link>http://www.mxstudio.com.br/marketingdigital/usabilidade/asp-arrays-dinamicos/</link>
		<comments>http://www.mxstudio.com.br/marketingdigital/usabilidade/asp-arrays-dinamicos/#comments</comments>
		<pubDate>Sun, 18 Jul 2010 17:34:42 +0000</pubDate>
		<dc:creator>X@nBuRzUm</dc:creator>
				<category><![CDATA[ASP.net]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Usabilidade]]></category>

		<guid isPermaLink="false">http://www.mxstudio.com.br/?p=4611</guid>
		<description><![CDATA[Os Arrays ou matrizes são umas estruturas de dados muito utilizadas em Qualquer linguagem. Trata-se de variáveis, porém que estão preparadas para Salvar uma quantidade maior de elementos. É como uma variável que tem vários compartimentos para salvar a informação e a cada um desses compartimentos há que acessar como um índice. Antes de utilizar [...]]]></description>
			<content:encoded><![CDATA[<p>Os Arrays ou matrizes são umas estruturas de dados muito utilizadas em Qualquer linguagem. Trata-se de variáveis, porém que estão preparadas para Salvar uma quantidade maior de elementos. É como uma variável que tem vários compartimentos para salvar a informação e a cada um desses compartimentos há que acessar como um índice. </p>
<p>Antes de utilizar um array devemos declara-lo de maneira obrigatória, para isso utilizamos a palavra chave DIM, deste modo. </p>
<p>dim Array(50) </p>
<p>Despois da palavra DIM devemos indicar o nome do array e a seguir, entre parênteses, coloca-se o número de posição máxima do array, neste caso 50. </p>
<p>Os arrays começam desde a posição 0, ou seja, o primeiro elemento de um array está na posição 0. Portanto, se o array foi definido com 50 campos, como no exemplo, terá 51 elementos, primeira posição será a 0 e a última posição seria a 50.</p>
<p>Para atribuir um valor a um array se realiza igual que uma variável, porém acessando com o índice da posição que queremos escrever. </p>
<p>Array(0) = 128 </p>
<p>Para utilizar o conteúdo de um array devemos faze-lo indicando o índice ao que se deseja acessar. Por exemplo, se quiséssemos imprimir na página a primeira posição de nosso Array o faríamos desta maneira. </p>
<p>document.write(Array(0)) </p>
<p>Agora vamos ver um exemplo sobre como utilizar os arrays, onde vamos realizar dois percorridos, um para escrever nele e o outro para ler a informação e escreve-la na página.<br />
dim matriz (10)<br />
for i=0 to 10<br />
   matriz(i)=100 * i<br />
next<br />
for i=0 to 10<br />
   document.writeln(&#8220;Posicao &#8221; &amp; i &amp; &#8220;: &#8221; &amp; matriz(i) &amp; &#8220;<br />&#8220;)<br />
next</p>
<p>Este exemplo escreveria na página as posições do array, que contém variáveis numéricas que correspondem de multiplicar seu índice por 100.<br />
Bom agora, que vimos como funciona os arrays iremos partir para Arrays dinâmicos.</p>
<p><strong>Aplicação de Objetos  com Arrays Dinâmicos</strong></p>
<p>Dentro de qualquer aplicação que eventualmente é necessário o uso de matrizes de dados. Nós precisamos encontrar os dados para o objetos, a fim de simplificar a lógica que vai ser de execução, bem como para tornar o código mais flexível e escalável. Usando uma classe que engloba uma série de objetos, que se mantém e matriz de objetos, descobrimos que a classe superior nos permite adquirir uma forma simplificada de classificar, filtrar e controlar os itens de dados, bem como os valores desses itens de dados.</p>
<p>Essas classes simplificada permitirá que alcance rapidamente e aprender a usar um array dinâmico que mantém uma matriz dinâmica de objetos (ambas as matrizes dinâmicas objetos que estão sendo eles mesmos). </p>
<p>A camada mais profunda da nossa estrutura é uma classe simples de todos os atributos que você pode precisar de realizar.</p>
<p>&#8216;*********** class ***************<br />
‘Classe valor do item<br />
Class item_value_class<br />
	Private c_item_value<br />
	&#8216; handle value  (let/get)<br />
	public property let value(byval data)<br />
		c_item_value = data<br />
	end property<br />
	public property get value()<br />
		value = c_item_value<br />
	end property<br />
end class<br />
&#8216;******************************************</p>
<p>Observe que esta classe tem um atributo com duas propriedades para permitir a escrita e leitura para o atributo. Isto é normal e não é nada especial. Passamos agora para a próxima camada, onde encontramos a nossa primeira matriz dinâmica.</p>
<p>&#8216;********* classe média ***********************<br />
Class item_class<br />
	Private c_item<br />
	Private c_values()  &#8216; Matriz de todos os valores para o item<br />
	Private c_size  &#8216; max determina os valores possíveis para o item</p>
<p>	&#8216; handle item  (let/get)<br />
	public property let item(byval data)<br />
		c_item = data<br />
	end property<br />
	public property get item()<br />
		item = c_item<br />
	end property</p>
<p>	&#8216;*************************************************<br />
	&#8216;************* metodos ***************************<br />
	&#8216;*************************************************</p>
<p>	 &#8216;*********** Event Handlers *************<br />
	Private Sub Class_Initialize()<br />
		Redim c_values(0)<br />
		Set c_values(0) = New item_value_class<br />
		c_size=0<br />
	End Sub<br />
	&#8216; matar todos os objetos em Adata e livrar memória<br />
	Private Sub Class_Terminate()<br />
	  Dim x<br />
			for x=0 to ubound(c_values)<br />
				Set c_values(0) = nothing<br />
			next<br />
	  c_size=0<br />
	  erase c_values<br />
	End Sub<br />
  &#8216;****************************************<br />
	Public Function getValue(iPos)<br />
		getValue = c_values(iPos).value<br />
	End Function</p>
<p>	Public Function putValue(iPos,data)<br />
		if iPos&gt;c_size then<br />
			Redim preserve c_values(iPos)<br />
			for x = c_size+1 to ubound(c_values)<br />
				set c_values(x)= New item_value_class<br />
			next<br />
			c_size=iPos<br />
		end if<br />
		c_values(iPos).value=cstr(data)</p>
<p>	End Function</p>
<p>	Public Property get numbervalues()<br />
		numbervalues=c_size<br />
	end property</p>
<p>	Public property get allvalues()<br />
		allvalues=c_values<br />
	end property</p>
<p>	Public property let allvalues(ByRef temp)<br />
		Dim x<br />
		Dim sizetochange<br />
		sizetochange=ubound(temp)<br />
			 if sizetochange &lt; c_size then<br />
				for x=sizetochange+1 to ubound(c_values)<br />
					set c_values(x)=nothing<br />
				next<br />
				Redim preserve c_values(sizetochange)<br />
			else<br />
				Redim preserve c_values(sizetochange)<br />
				for x = c_size+1 to ubound(c_values)<br />
					set c_values(x)= New item_value_class<br />
				next<br />
			end if<br />
			c_size=sizetochange<br />
			for x=0 to sizetochange<br />
				c_values(x).value = temp(x).value<br />
			next<br />
	end property<br />
end class<br />
&#39;******************************************</p>
<p>Vemos a instanciação de uma matriz de objetos de valor a nossa classe. Observe sempre que adicionar um valor com o método putValue nossa matriz é automaticamente aumentado e instanciado. Há uma propriedade especial chamada de &quot;allvalues&quot; que cria um ponto de referência para a matriz que esta classe possui. Para todos os valores do GET propriedade retorna a referência para a matriz,  enquanto o imóvel locado nos permite definir um outro array de objetos da nossa classe de valor igual a outro. As propriedades allvalues tornam-se importantes em nossa camada superior chamada de Dynamic_Object_Array_Class &quot;.</p>
<p>&#39;******** classe superior *********************<br />
Class Dynamic_Object_Array_Class<br />
  &#39;************** Properties **************<br />
  Private aData()<br />
  Private c_size<br />
  &#39;****************************************</p>
<p>  &#39;*********** Event Handlers *************<br />
  Private Sub Class_Initialize()<br />
    Redim aData(0)<br />
    Set aData(0) = New item_class<br />
    c_size=0<br />
    c_numberlinks=1<br />
  End Sub<br />
 &#39; matar todos os objetos em Adata e livrar memória<br />
  Private Sub Class_Terminate()<br />
    Dim x<br />
		for x=0 to ubound(aData)<br />
			Set aData(0) = nothing<br />
		next<br />
    c_size=0<br />
    erase aData<br />
  End Sub<br />
  &#39;****************************************<br />
 	Public Property Get allitems()<br />
		allitems = aData<br />
	end property</p>
<p>	Public Property Get getsize()<br />
		getsize = c_size<br />
	end property</p>
<p>  Public Function push()<br />
		c_size = c_size+1<br />
		Redim preserve aData(c_size)<br />
		set aData(c_size)= New item_class<br />
		push=c_size<br />
  End Function</p>
<p>  Public Function pop(ipos)<br />
    Dim tempcount<br />
		pop=aData(ipos).item<br />
		if ipos &lt; c_size then<br />
		  for tempcount=ipos to (c_size &#8211; 1)<br />
			aData(tempcount).item = aData(tempcount+1).item<br />
			aData(tempcount).allvalues = aData(tempcount+1).allvalues<br />
		  next<br />
		end if<br />
		set aData(c_size)= nothing<br />
		c_size = c_size-1<br />
		Redim preserve aData(c_size)<br />
  End Function’<br />
End Class<br />
&#39;********** classe superior final ***************</p>
<p>A classe superior implementa um push-pop e um método para aumentar automaticamente ou diminuir o array de objetos da nossa classe de item que a classe superior detém. Observe que o método de classe anteriores allvalues é implementada no método pop na nossa class = mais alto. Agora que temos a nossa matriz dinâmica, devemos colocá-lo para uso. A maneira mais fácil de ver como ele funciona é a de armazenar alguns dados na matriz e em seguida, exibi-la novamente.</p>
<p>&#39;******** <strong>Exemplo de código usando Array Dinâmico</strong> *****</p>
<table>
<p> &lt;%<br />
	for y=0 to my_array.getsize<br />
		Response.Write &quot;<br />
<tr>
<td width='100'>Item: </td>
<td width='10'>&#8221; &amp; _<br />
					&#8220;</td>
<td width='200'>&#8221; &amp; _<br />
					my_array.allitems()(y).item &amp;  _<br />
 		&#8220;</td>
<td width='200'></td>
</tr>
<p> &#8221;<br />
		for x=0 to my_array.allitems()(y).numbervalues<br />
		   if my_array.allitems()(y).getValue(x)&#8221;" then<br />
			Response.Write &#8220;<br />
<tr>
<td width='100'></td>
<td width='10'>&#8221; &amp; _<br />
				&#8220;</td>
<td width='200'>Value:</td>
<td width='200'>&#8221; &amp; _<br />
				my_array.allitems()(y).getValue(x) &amp; &#8220;</td>
</tr>
<p>&#8221;<br />
		   end if<br />
	  	next<br />
	next<br />
 %&gt;<br />
 </table>
<p>&#8216;********************************************</p>
<p>Depois de executar o nosso código de exemplo, devemos ver o seguinte em nosso navegador da Web:</p>
<p>&#8216;******* Exemplo de Output *********************</p>
<p>Item:   Olá<br />
Item:   TRUE FALSE<br />
  Value: yes<br />
  Value: no<br />
Item:   Seu Nome<br />
Item:   Outro Item<br />
Item:   Lugar em Concurso<br />
  Value: Terceiro<br />
  Value: segundo<br />
  Value: Primeiro<br />
Item:   Escolha o Hotel<br />
  Value: Nacional Inn<br />
  Value: Ibis</p>
<p>&#8216;********* end example output ****************</p>
<p><strong>Resumo</strong></p>
<p>Arrays dinâmicos de objetos que contêm matrizes dinâmicas dos objetos nos permitem criar a estrutura que precisamos de uma forma simplificada e reutilizáveis. Nossas matrizes também serão auxiliadas na classificação, filtragem e manipulação de dados. Apesar de eu não ter incluído o código de exemplo para a classificação e filtragem, uma vez que você entender como funcionam as classes, gerando a classificação e os métodos de filtragem é bastante fácil.<br />
Podemos ainda, Redimensionar arrays<br />
Este tipo de arrays redimensionais se chama array dinâmico. Para criar este tipo de arrays podemos utilizar a sentença dim (como criávamos os anteriores) ou a sentença redim, com a particularidade que não lhe colocamos nenhum valor entre parênteses onde antes indicávamos o número de campos do array. </p>
<p>dim meu_array()<br />
redim meu_outro_array() </p>
<p>Quando usamos arrays dinâmicos podemos utilizar a sentença redim para indicar o número de dimensões e a quantidade de campos de cada dimensão. </p>
<p>Com esta sentença estamos indicando que meu_array deve ter o tamanho 10. Campos desde 0 até a 10.</p>
<p>redim meu_array(10) </p>
<p>Se indicamos a chave &#8220;preserve&#8221; estamos garantindo que o conteúdo dos campos que havia previamente no array se mantém. </p>
<p>redim preserve meu_array(20) </p>
<p>Por último, se em qualquer momento reduzimos o número de campos perderemos o que possa ter sido salvo nos campos que se eliminaram. </p>
<p>No seguinte exemplo criamos um array dinâmico e o redimensionamos inicialmente a tamanho 3. Preenchemos e mostramos seus distintos valores. Posteriormente o redimensionamos outra vez para que chegue até a posição 7, salvando os valores antigos. Para acabar preenchendo os campos que criamos novos e mostramos todos os valores do array. </p>
<p>dim frutas()<br />
redim frutas(3) </p>
<p>frutas(0) = &#8220;Pêra&#8221;<br />
frutas(1) = &#8220;Uva&#8221;<br />
frutas(2) = &#8220;Maçã&#8221;<br />
frutas(3) = &#8220;Melão&#8221; </p>
<p>for each fruta in frutas<br />
    document.write fruta &amp; &#8220;<br />&#8221;<br />
next </p>
<p>redim preserve frutas(7) </p>
<p>frutas(4) = &#8220;Melancia&#8221;<br />
frutas(5) = &#8220;Laranja&#8221;<br />
frutas(6) = &#8220;Banana&#8221;<br />
frutas(7) = &#8220;Tangerina&#8221; </p>
<p>for each fruta in frutas<br />
    document.write fruta &amp; &#8220;<br />&#8221;<br />
next </p>
<p><strong>Para saber o número de campos de um array </strong></p>
<p>Um dos dados típicos que necessitamos extrair de um array é seu número de posições, útil, por exemplo, para fazer um percorrido a um array, desde a primeira até o último campo. Para isso, utilizamos a função uBound() de VBScript. A função UBound permite descobrir o que o membro da matriz superior é definida. Isto torna mais fácil o loop para percorrer um array do início ao fim.</p>
<p>Digamos que você usa a função split para analisar uma string em um array. Então você:<br />
Dim ListaArray</p>
<p>SentStr = &#8221; Oitenta e sete anos atrás nossos pais trouxeram &#8221;<br />
ListaArray = split(SentStr, &#8221; &#8220;)</p>
<p>Agora você tem uma matriz listarray que pretende percorrer, mas você não sabe até onde ir. Como saber quando você tiver chegado ao final do array ?</p>
<p>A resposta é a função UBound. ubound dá-lhe o membro superior matriz de uma matriz. Neste caso, a matriz tem 10 palavras na mesma. O arrays começam sempre a numeração em zero, significa que essa matriz pontos de 0 a 9 são tomadas. Se você fizer<br />
ubound(ListArray)</p>
<p>O resultado é 9.</p>
<p>Você pode então fazer um loop através dos membros, que operam em cada um .</p>
<p>for loopctr = 0 to ubound(ListaArray)<br />
response.write ListaArray(loopctr)<br />
next</p>
<p><strong>Outro Exemplo: </strong></p>
<p>dim paises (4)<br />
response.write ubound (paises)<br />
Escreveria na página o número do campo mais alto do array paises, neste caso 4.<br />
Ademais, se por acaso algum dia necessitamos, também temos a nossa disposição a função lBound(), que devolve o número da posição com índice menor do array.<br />
response.write lbound (paises) </p>
<p>A última linha sobre nosso array de paises definido anteriormente escreveria um 0 na página web, visto que o array começa na posição zero. </p>
<p><strong>Arrays multidimensionais</strong></p>
<p>Podem-se construir matrizes multidimensionais, ou seja, que nos permitam criar matrizes de várias coordenadas. Para trabalhar com eles utiliza-se uma vírgula que separa os dois índices. Por exemplo, podemos definir uma matriz de 10&#215;10 desta maneira.</p>
<p>dim Array2Dimensoes (9,9)</p>
<p>Como o array é de 10 campos, utilizamos um 9 e suas posições serão as 10 que vão desde o 0 ao 9. Para escrever e ler do Array podemos utilizar a vírgula de maneira similar a como se declara. Por exemplo, para colocar dados na posição 0,4 faríamos o seguinte:</p>
<p>Array2Dimensoes (0,4) = &#8220;texto posicao 0,4&#8243; </p>
<p>Abaixo, temo um exemplo de como armazenar o conteúdo do vetor em uma session, muito usada pelo pessoal de e-commerce para carrinhos de compras.</p>
<p>&lt;%<br />
&quot;A função abaixo é generica e pode ser utilizada como um arquivo include<br />
Function VetorMonta(Acao,Valor)<br />
&quot;Usamos o case para manipular a ação da função<br />
Select Case Trim(Acao)<br />
&quot;Inclui nova posicao ao vetor<br />
Case &quot;Incluir&quot;<br />
&quot;Guarda na variavel Vetor o conteudo da Session<br />
Vetor = Session(&quot;GuardaVetor&quot;)<br />
&quot;Verifica se a Variavel Vetor é um Array, caso nao for entao definimos ela um Array<br />
If Not IsArray(Vetor) Then Vetor = Array() End if<br />
&quot;Verifica se o Valor que esta sendo inserido já esta no Vetor se estiver entao nao inseri para nao haver duplicidades do vetor<br />
If InStr(Join(Vetor), Valor) = 0 Then<br />
&quot;Este comando ira preservar o vetor e adciona + 1 valor<br />
ReDim preserve Vetor(UBound(Vetor)+1)<br />
&quot;Este é o valor que estamos adicionando no vetor<br />
Vetor(Ubound(Vetor )) = Valor<br />
&quot;Coloca o conteudo da variavel vetor dentro da Session<br />
Session(&quot;GuardaVetor&quot;) = Vetor<br />
End if<br />
&quot;Apaga uma determinada posicao do vetor<br />
Case &quot;Excluir&quot;<br />
&quot;Inicia a varivel vetor como vazia<br />
Vetor = Array()<br />
&quot;Criamos uma nova variavel Auxiliar e guardamos o valor da Session<br />
AuxVetor = Session(&quot;GuardaVetor&quot;)<br />
&quot;Definine a Session como um Array vazio<br />
Session(&quot;GuardaVetor&quot;) = Array()<br />
&quot;Faz um laço em todas as posições do vetor<br />
For i = 0 To Ubound(AuxVetor)<br />
&quot;Verifica se o valor passado para excluir do vetor é diferente do valor que esta dentro da variavel Auxiliar<br />
If AuxVetor(i)  (Valor) Then<br />
&#8220;Este comando ira preservar o vetor e adciona + 1 valor<br />
ReDim preserve Vetor (UBound(Vetor)+1)<br />
&#8220;Este é o valor que estamos adicionando no vetor<br />
Vetor (Ubound(Vetor)) = AuxVetor(i)<br />
&#8220;Coloca o conteudo da variavel vetor dentro da Session<br />
Session(&#8220;GuardaVetor&#8221;) = Vetor<br />
End If<br />
Next<br />
&#8220;Fim do Case<br />
End Select<br />
End Function<br />
Function Incluir_Vetor<br />
&#8220;Executa a função que ira criar uma posição do vetor, basta passar a acao e o valor<br />
Call VetorMonta(&#8220;Incluir&#8221;,Replace(Request(&#8220;Valor_Vetor&#8221;),&#8221;"&#8221;,&#8221;"))<br />
End Function<br />
Function Excluir_Vetor(Valor_Vetor)<br />
&#8220;Executa a função que ira deletar uma posição do vetor, basra passar a acao e o valor<br />
Call VetorMonta(&#8220;Excluir&#8221;,Valor_Vetor)<br />
End Function<br />
Function VisualizaValoresVetor<br />
&#8220;Veriofica se a Session é um array, caso nao for então atribuimos a Session como um Array<br />
IF Not IsArray(session(&#8220;GuardaVetor&#8221;)) Then session(&#8220;GuardaVetor&#8221;) = Array() End if<br />
&#8220;Faremos um laço entre todos os vetores criados<br />
For x = 0 To ubound(session(&#8220;GuardaVetor&#8221;)) &#8220;ira fazer um laço mostrando todos os vetores criados<br />
&#8220;Mostra os valores armazenados na Session e adiciona um link para apagar a posição do vetor caso queira<br />
Response.Write session(&#8220;GuardaVetor&#8221;)(x) &amp; &#8220;<a>(Apagar)</a>&#8221; &amp; &#8220;<br />&#8221;<br />
Next<br />
&#8220;Verifica se a Session tem alguma posição, se tiver mostra a opção de apagar todos os vetores<br />
If ubound(session(&#8220;GuardaVetor&#8221;)) &gt;= 0 Then<br />
Response.Write &#8220;<br />&#8221; &amp;&#8221;<a href="vetor.asp?action=LimpaVetor">Apagar Tudo</a>&#8221; &amp; &#8220;<br />&#8221; &#8220;Imprime o Vetor na tela<br />
End if<br />
End Function<br />
Function LimpaVetor<br />
&#8220;Limpa todas as posiçoes do vetor, apagando a Session<br />
session(&#8220;GuardaVetor&#8221;) = Empty<br />
End Function<br />
&#8220;USAMOS CASES PARA MANUPULARAS CHAMADAS DAS FUNÇÕES<br />
useraction=request(&#8220;action&#8221;)<br />
select case useraction<br />
Case &#8220;Incluir_Vetor&#8221;<br />
&#8220;Chama a function que ira incluir um valor para o vetor<br />
Call Incluir_Vetor<br />
Case &#8220;Excluir_Vetor&#8221;<br />
&#8220;Chama a function que ira excluir um valor para o vetor<br />
Call Excluir_Vetor(Request(&#8220;Valor_Vetor&#8221;))<br />
Case &#8220;LimpaVetor&#8221;<br />
&#8220;Chama a function que apagar todas as posições do vetor<br />
Call LimpaVetor<br />
End Select<br />
%&gt;</p>
<table width="100%">
<form name="form" method="post" action="?action=Incluir_Vetor">
<tr>
<td>
</td>
</tr>
</form>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/marketingdigital/usabilidade/asp-arrays-dinamicos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP &#8211; Editor FCKeditor</title>
		<link>http://www.mxstudio.com.br/tecnologia/geral/asp-editor-fckeditor/</link>
		<comments>http://www.mxstudio.com.br/tecnologia/geral/asp-editor-fckeditor/#comments</comments>
		<pubDate>Sun, 23 May 2010 21:31:50 +0000</pubDate>
		<dc:creator>X@nBuRzUm</dc:creator>
				<category><![CDATA[ASP.net]]></category>
		<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Geral]]></category>
		<category><![CDATA[Usabilidade]]></category>

		<guid isPermaLink="false">http://www.mxstudio.com.br/?p=3903</guid>
		<description><![CDATA[O FCKEditor é o editor bem popular devido ao seu uso nativo em vários SGC's como o Drupal, o PHP-Nuke, Joomla! e mais diversos outros aplicativos que o integram em sua estrutura.]]></description>
			<content:encoded><![CDATA[<p>O FCKEditor é um editor WYSIWYG online gratuíto e open-source, multiproposital, feito em JavaScript que cria páginas visualmente, gerando um código de saída HTML estilizado.<br />
O FCKEditor é o editor bem popular devido ao seu uso nativo em vários SGC&#8217;s como o Drupal, o PHP-Nuke, Joomla! e mais diversos outros aplicativos que o integram em sua estrutura.<br />
Seu uso é extremamente fácil e ele está disponivel para praticamente todas as linguagens web disponíveis. Você pode baixar o FCKeditor, através do link http://ckeditor.com/download. Caso queira ver como funciona o editor, clique aqui e veja o demo. Descompacte em uma pasta especifica, por exemplo &#8220;fckeditor&#8221;, assim seus arquivos irão ficar melhor organizados. Será criada um diretório com o nome de /fckeditor/, todo este artigo só funcionará se os arquivos estiverem dentro de um diretório com este nome, pois se você preferir utilizar um diretório com outro nome, terá que mudar o nome no código também. A primeira coisa a fazer é deletar o diretório com o nome samples. (/fckeditor/samples/), dentro deste diretório estão alguns exemplos de como utilizar o editor, mas estes exemplos podem ser utilizados por usuários não autorizados para invadir o seu sistema.</p>
<p>Ainda dentro do diretório /fckeditor/, apague todos os arquivos de outra linguagem de programação, (PHP, CFM, LASSO, PL, PY) mantenha apenas os XML, HTML , JS e ASP.</p>
<p>Os arquivos principais que utilizaremos serão fckconfig.js e fckeditor.asp.<br />
fckconfig.js</p>
<p>FCKConfig.ToolbarSets["Default"] = [<br />
['Source','DocProps','-','Save','NewPage','Preview','-','Templates'],<br />
['Cut','Copy','Paste','PasteText','PasteWord','-','Print','SpellCheck'],<br />
['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],<br />
['Form','Checkbox','Radio','TextField','Textarea','Select','Button','ImageButton','HiddenField'],<br />
&#8216;/&#8217;,<br />
['Bold','Italic','Underline','StrikeThrough','-','Subscript','Superscript'],<br />
['OrderedList','UnorderedList','-','Outdent','Indent','Blockquote','CreateDiv'],<br />
['JustifyLeft','JustifyCenter','JustifyRight','JustifyFull'],<br />
['Link','Unlink','Anchor'],<br />
['Image','Flash','Table','Rule','Smiley','SpecialChar','PageBreak'],<br />
&#8216;/&#8217;,<br />
['Style','FontFormat','FontName','FontSize'],<br />
['TextColor','BGColor'],<br />
['FitWindow','ShowBlocks','-','About']          // No comma for the last row.<br />
] ;</p>
<p>FCKConfig.ToolbarSets["Basic"] = [<br />
['Bold','Italic','-','OrderedList','UnorderedList','-','Link','Unlink','-','About']<br />
] ;</p>
<p>ckeditor.asp</p>
<p>Definimos o trecho abaixo de código com estes novos dados. Aqui é definido o diretório base, tamanho da área do editor e também o tipo de barra formada, podendo variar entre Default ou Basic mostrado anteriormente no arquivo fckconfig.js.</p>
<p>Private Sub Class_Initialize()<br />
sBasePath         = &#8220;/fckeditor/&#8221;<br />
sWidth            = &#8220;100%&#8221; &#8216;Aqui é a largura, aconselho a manter 1005<br />
sHeight           = &#8220;400&#8243;  &#8216;Aqui é altura<br />
sToolbarSet             = &#8220;Default&#8221;<br />
sValue</p>
<p>Na segunda alteração do arquivo fckeditor.asp iremos mudar para o caminho fckeditor/editor/<br />
Public Function CreateHtml( instanceName )<br />
dim html</p>
<p>If IsCompatible() Then</p>
<p>Dim sFile, sLink<br />
If Request.QueryString( &#8220;fcksource&#8221; ) = &#8220;true&#8221; Then<br />
sFile = &#8220;fckeditor.original.html&#8221;<br />
Else<br />
sFile = &#8220;fckeditor.html&#8221;<br />
End If</p>
<p>sLink = sBasePath &amp; &#8220;fckeditor/editor/&#8221; &amp; sFile &amp; &#8220;?InstanceName=&#8221; + instanceName</p>
<p>If (sToolbarSet &amp; &#8220;&#8221;)  &#8220;&#8221; Then<br />
sLink = sLink + &#8220;&amp;Toolbar=&#8221; &amp; sToolbarSet<br />
End If</p>
<p>Iremos agora fazer a chamada deste arquivo fckeditor.asp em uma página asp com formulário simples.</p>
<p><!-- #include file="fckeditor/fckeditor.asp" --></p>
<form action="recebe.asp" method="post"> Título:</p>
<p>Notícia:</p>
</form>
<p>Na página onde você quer que apareça o editor, exatamente no local, coloque o seguinte código, iremos utilizar um include chamando o arquivo fckeditor.asp. Esta página também precisa estar dentro do diretório /fckeditor/</p>
<p><!-- #INCLUDE file="fckeditor.asp" --></p>
<p>Os caracteres especiais, palavras acentuadas e outros use a metatag:</p>
<p>A  acentuação, pode ser resolvida, apenas mudando no inicio das páginas de alteração e inserção de dados no banco de dados, faça as seguintes mudanças:</p>
<p>altera para:</p>
<p>Recuperando os dados dentro do editor. iremos utilizar um include chamando o arquivo fckeditor.asp.</p>
<p><!-- #INCLUDE file="fckeditor.asp" --></p>
<p>Vamos mudar o FCK Editor 2.6.4 , que vem habilitado para PHP por padrão, para nossa linguagem ASP, entre no arquivo fckconfig.js, dentro do diretório /fckeditor/ e altere as linhas:<br />
var _FileBrowserLanguage        = &#8216;asp&#8217;;        // asp | aspx | cfm | lasso | perl | php | py<br />
var _QuickUploadLanguage        = &#8216;asp&#8217;;        // asp | aspx | cfm | lasso | perl | php | py</p>
<p>Você pode mudar o visual (skin) do editor, iremos usar a do office 2003, para isso iremos alterar no arquivo fckconfig.js, dentro do diretório /fckeditor/ a seguinte linha:<br />
FCKConfig.SkinPath = FCKConfig.BasePath + &#8216;skins/office2003/&#8217;;</p>
<p>você indica o caminho da skin que você quer que apareça, é só copiar e subistituir, é só escolher um dos tres:</p>
<p>FCKConfig.SkinPath = FCKConfig.BasePath + &#8216;skins/default/&#8217; ;<br />
FCKConfig.SkinPath = FCKConfig.BasePath + &#8216;skins/office2003/&#8217; ;<br />
FCKConfig.SkinPath = FCKConfig.BasePath + &#8216;skins/silver/&#8217; ;</p>
<p>você pode baixar mais skins acessando aqui: http://www.midiaville.com.br/docs/arquivos/skins/index.php<br />
Você também pode mudar o visual do meu editor, alterando os ícones da barra. Apenas no arquivo fckconfig.js, onde citamos acima. Mudando o parâmetro ToolbarSets</p>
<p>Para fazer upload de fotos, banner flash, arquivos para links e etc.</p>
<p>Navegue até o diretório: /fckeditor/editor/ filemanager/ connectors/<br />
Apague tudo que tiver lá dentro, deixe só o diretório /asp/ dentro dele, edite o arquivo config.asp</p>
<p>Na linha</p>
<p>ConfigIsEnabled = False &#8216;mude de False para true, isso habilita o upload<br />
ConfigUserFilesPath = &#8220;/userfiles/&#8221;</p>
<p>Coloque no lugar de userfiles o nome do seu diretório onde será feito o upload a barra no inicio quer dizer que este diretório está na raiz do site. Caso o diretório que você listou aqui não exista o fckeditor vai cria-lo.<br />
Algumas soluções para alguns erros apresentados pelo Editor.<br />
Dentro do diretório FCKeditor/_samples/asp/ existem vários exemplos, iremos utilizar o sample04.asp.</p>
<p>Deste arquivo copie:</p>
<p><!-- #INCLUDE file="fckeditor.asp" --></p>
<p>e cole no início de sua página de inserção e alteração de dados, no local onde está seu textarea, cole a outra parte do código</p>
<p>&lt;%<br />
Dim sBasePath<br />
sBasePath = Request.ServerVariables(&#8220;PATH_INFO&#8221;)<br />
sBasePath = Left( sBasePath, InStrRev( sBasePath, &#8220;/_samples&#8221; ) )<br />
Dim oFCKeditor<br />
Set oFCKeditor = New FCKeditor<br />
oFCKeditor.BasePath = sBasePath<br />
If Request.QueryString(&#8220;Skin&#8221;)  &#8220;&#8221; Then<br />
oFCKeditor.Config(&#8220;SkinPath&#8221;) = sBasePath + &#8220;editor/skins/&#8221; &amp; Server.HTMLEncode( Request.QueryString(&#8220;Skin&#8221;) ) + &#8220;/&#8221;<br />
End If<br />
oFCKeditor.Value = &#8221; &#8221;<br />
oFCKeditor.Create &#8220;FCKeditor1&#8243;<br />
%&gt;</p>
<p>Note-se que apaguei todos os comentários.<br />
Atenção! &#8211; A página de inserção e alteração de dados deve estar na pasta raiz do FCKeditor, no meu caso eu uso o diretório config.</p>
<p>Localizar os arquivos no servidor</p>
<p>Agora é a vez de localizarmos os arquivos no servidor, para não dar erros, localize:<br />
FCKeditor/editor/filemanager/browser/default/connectors/asp/config.asp<br />
Faça as mudanças, altere o trecho abaixo:</p>
<p>Dim ConfigIsEnabled<br />
ConfigIsEnabled = true &#8216;aqui estará false, muda para true</p>
<p>Para:</p>
<p>Dim ConfigUserFilesPath<br />
ConfigUserFilesPath = &#8220;/fotos/&#8221; &#8216;aqui coloca em qual diretório ele deve buscar os arquivos</p>
<p>Fazer o upload dos arquivos</p>
<p>Para  fazer o upload dos arquivos, evite os erros, ache o arquivo:</p>
<p>FCKeditor/editor/filemanager/upload/asp/config.asp</p>
<p>Faça as seguintes mudanças:</p>
<p>Dim ConfigIsEnabled<br />
ConfigIsEnabled = true] &#8216;aqui estava false, você muda para true</p>
<p>Nesse trecho:</p>
<p>Dim ConfigUserFilesPath<br />
ConfigUserFilesPath = &#8220;/fotos/&#8221; &#8216;aqui você mostra o diretório onde serão upados os arquivos</p>
<p>Estamos usando o diretório fotos, verifique sempre se o diretório que você está setando em seus arquivos config. está criado, preferencialmente que seja um diretório no diretório raiz do site.   Não esqueça das permissões de escrita no diretório indicado.</p>
<p>Sempre que for mudar o diretório, use a / no final, exemplo /fotos/, /banco/, não esqueça a barra no final pois ela será necessária na função de FSO do FCKeditor para ciriar subdiretórios,como é o caso de imagens, flash e outros,  pois para cada extensão de arquivo, o fckeditor usa um subdiretório.</p>
<p>O parent path  conhecido como &#8220;..&#8221;, não está disponível, isso se deve por resolução da Microsoft que o desabilitou por padrão na versão 6 do IIS. Então não use ../../../fotos/<br />
O Server.MapPath sempre aponta para a raiz de seu site, ou seja, se estiver na pasta &#8220;/includes/libs/&#8221; e quiser apontar para o arquivo &#8220;/db/meu.mdb&#8221;,  use Server.MapPath (&#8220;/db/meu.mdb&#8221;);<br />
Alterando a Largura e Altura do Textarea</p>
<p>Agora vamos para o arquivo FCKeditor/ FCKeditor.asp</p>
<p>Encontre o trecho:</p>
<p>Private Sub Class_Initialize()<br />
sBasePath = &#8220;/config/&#8221;<br />
sWidth = &#8220;465&#8243;<br />
sHeight = &#8220;450&#8243;<br />
sToolbarSet = &#8220;Default&#8221;<br />
sValue = &#8220;&#8221;</p>
<p>Nas linhas</p>
<p>sWidth = &#8220;465&#8243;<br />
sHeight = &#8220;450&#8243;</p>
<p>Vvocê pode mudar para a largura ou altura que quiser,  se for em pixels, não é necessário usar o px, use apenas os números.</p>
<p>Diretório base</p>
<p>Na linha do arquivo /FCKeditor.asp:<br />
sBasePath = &#8220;/config/&#8221;<br />
Altere para config, o seu pode estar como /FCKeditor/, aqui é necessário você mudar para o nome do diretório onde estão os arquivos, para não acontecer  os erros de xlm que geralmente acontecem.<br />
Alterar os dados do bd com o FCKeditor<br />
Para alterar os dados do banco de dados com o FCKeditor , você pode recuperar os dados do campo dentro do textarea, proceda da seguinte forma:</p>
<p>Na página altere os dados:</p>
<p>Para:</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/tecnologia/geral/asp-editor-fckeditor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Diretrizes De Projeto &#8211; Proteger Aplicativos Web</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/dreamweaver/diretrizes-de-projeto-proteger-aplicativos-web/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/dreamweaver/diretrizes-de-projeto-proteger-aplicativos-web/#comments</comments>
		<pubDate>Sun, 25 Apr 2010 00:49:04 +0000</pubDate>
		<dc:creator>X@nBuRzUm</dc:creator>
				<category><![CDATA[ASP.net]]></category>
		<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Dreamweaver]]></category>
		<category><![CDATA[Usabilidade]]></category>

		<guid isPermaLink="false">http://www.mxstudio.com.br/?p=3672</guid>
		<description><![CDATA[Os aplicativos da Web apresentam um conjunto complexo de questões de segurança para arquitetos, designers e desenvolvedores. Os aplicativos da Web mais seguros e resistentes a ataques são aqueles que foram criados com o quesito segurança em primeiro lugar. Você deve aplicar práticas de arquitetura e design e incorporar considerações de implantação e diretivas de [...]]]></description>
			<content:encoded><![CDATA[<p>Os aplicativos da Web apresentam um conjunto complexo de questões de segurança para arquitetos, designers e desenvolvedores. Os aplicativos da Web mais seguros e resistentes a ataques são aqueles que foram criados com o quesito segurança em primeiro lugar.</p>
<p>Você deve aplicar práticas de arquitetura e design e incorporar considerações de implantação e diretivas de segurança corporativas durante as fases iniciais do projeto. Se isso não for feito, poderá resultar em aplicativos que não podem ser implantados em uma infra–estrutura existente sem comprometer a segurança.<br />
Este módulo apresenta um conjunto de diretrizes de segurança para projeto e arquitetura. Ele foi organizado por categoria de vulnerabilidade dos aplicativos comuns. São as áreas principais de segurança dos aplicativos da Web e são as mesmas onde os erros ocorrem com mais freqüência.</p>
<p>Objetivos</p>
<p>Utilize este módulo para:</p>
<p>• Identificar as questões principais de projeto e arquitetura de aplicativos da Web seguros.<br />
• Considerar as principais questões de implantação no momento do projeto.<br />
• Projetar estratégias para melhorar a validação da entrada do aplicativo da Web.<br />
• Criar mecanismos seguros de autenticação e gerenciamento de sessões.<br />
• Escolher um modelo de autorização apropriado.<br />
• Implementar práticas eficientes de gerenciamento de contas e proteger as sessões dos usuários.<br />
• Utilizar criptografia para oferecer privacidade, não–recusa, proteção contra violações e autenticação.<br />
• Evitar a manipulação de parâmetros.<br />
• Criar estratégias de auditoria e log.</p>
<p>Aplicação</p>
<p>Embora contidas no livro sobre segurança ASP.NET, as informações deste módulo são importantes para qualquer pessoa interessada em desenvolver aplicativos da Web seguros.</p>
<p>Como utilizar este módulo</p>
<p>O foco deste módulo está nas diretrizes e nos princípios que você deve seguir ao projetar um aplicativo.</p>
<p>Para aproveitar ao máximo este módulo:</p>
<p>• Conheça as ameaças ao seu aplicativo para que você possa garantir que isso seja solucionado pelo seu projeto.<br />
Leia, &#8220;Ameaças e Contramedidas&#8221;, para entender as ameaças a considerar. O módulo 2 relaciona as ameaças que podem prejudicar seu aplicativo. Considere essas ameaças durante a fase de projeto.<br />
• Use uma abordagem sistemática para as áreas principais nas quais o aplicativo poderia ficar vulnerável a ataques. Pontos nos quais se concentrar: considerações sobre a implantação; validação da entrada; autenticação e autorização; criptografia e confidencialidade dos dados; gerenciamento de configuração, sessões e exceções e auditoria e log adequados para garantir a criação de contas.</p>
<p>Questões de arquitetura e projeto para aplicativos da Web</p>
<p>Os aplicativos da Web apresentam a designers e desenvolvedores muitos desafios. Como o protocolo HTTP não mantém um registro das sessões por usuário, o registro passa a ser de responsabilidade do aplicativo. Como precursor disso, o aplicativo deve ser capaz de identificar o usuário utilizando alguma forma de autenticação. Como todas as decisões subseqüentes de autorização baseiam–se na identidade do usuário, é essencial que o processo de autenticação seja seguro e que o mecanismo de tratamento da sessão utilizado para monitorar os usuários autenticados seja igualmente bem protegido. Projetar os mecanismos de autenticação seguros e o gerenciamento de sessão é apenas parte das questões com que se deparam designers e desenvolvedores de aplicativos da Web. Outros desafios surgem porque a entrada e a saída de dados são feitos por redes públicas. Impedir a manipulação de parâmetros e a divulgação de dados confidenciais é outra questão importante.</p>
<p>As diretrizes de projeto apresentadas neste módulo estão organizadas por categoria de vulnerabilidade do aplicativo. A experiência mostra que um projeto deficiente nessas áreas em particular cria vulnerabilidades de segurança.</p>
<p>Vulnerabilidades do aplicativo da Web e possíveis problemas causados por um projeto ruim</p>
<p>Categoria da vulnerabilidade e possível problema causado por um projeto ruim</p>
<p>Validação da entrada Ataques realizados incorporando–se seqüências de caracteres mal–intencionadas em seqüências de caracteres de consulta, campos de formulário, cookies e cabeçalhos HTTP. Eles incluem execução de comandos, ataques XSS (cross-site scripting), inclusão de código SQL e estouro de buffer.</p>
<p>Autenticação Spoofing de identidade, quebra de senha, elevação de privilégios e acesso não–autorizado.</p>
<p>Autorização Acesso a dados confidenciais ou restritos, violação e execução de operações não–autorizadas.</p>
<p>Gerenciamento de configuração Acesso não–autorizado a interfaces administrativas, capacidade de atualizar dados de configuração e acesso não–autorizado a contas de usuários e perfis de contas.</p>
<p>Dados confidenciais Informações confidenciais divulgadas e violação de dados.</p>
<p>Gerenciamento de sessão Captura de identificadores de sessão, resultando em seqüestro de sessão e spoofing de identidade.</p>
<p>Criptografia Acesso a dados confidenciais, a credenciais de contas ou a ambos.</p>
<p>Manipulação de parâmetros Ataques de atravessamento de caminho, execução de comando e mecanismos para ignorar o controle de acesso, entre outros, levando à divulgação de informações ,elevação de privilégios e negação de serviço.</p>
<p>Gerenciamento de exceções Negação de serviço e divulgação de detalhes confidenciais do sistema.</p>
<p>Auditoria e log Falha ao indicar sinais de invasão, incapacidade de comprovar as ações de um usuário e dificuldades no diagnóstico de problemas.</p>
<p>Considerações para implantação</p>
<p>Durante a fase de design do aplicativo, analise as diretivas e os procedimentos da empresa junto a infra–estrutura na qual seu aplicativo será implantado. Freqüentemente, o ambiente de destino é rígido e o projeto do aplicativo deve refletir as restrições. Às vezes, são necessárias mudanças no projeto, por exemplo, devido a restrições de protocolo ou porta ou topologias de implantação específicas. Identifique as restrições no início da fase de projeto para evitar surpresas mais tarde e envolver membros das equipes de rede e infra–estrutura para ajudarem nesse processo.</p>
<p>Políticas e procedimentos de segurança</p>
<p>A diretiva de segurança determina o que os aplicativos podem fazer e o que os usuários do aplicativo têm permissão para fazer. O mais importante: ela define restrições para determinar o que os aplicativos e os usuários não podem fazer. Identifique e trabalhe com a estrutura definida pela diretiva de segurança da empresa ao projetar os aplicativos para garantir que você não está violando a diretiva, o que impedirá a implantação do aplicativo.</p>
<p>Componentes da infra–estrutura de rede</p>
<p>Certifique–se de que você entendeu a estrutura de rede do ambiente de destino e os requisitos básicos de segurança da rede em termos de regras de filtragem, restrições de porta, protocolos suportados e assim por diante.<br />
Identifique como firewalls e suas diretivas podem afetar o projeto e a implantação do aplicativo. Pode haver firewalls para separar da rede interna os aplicativos ligados diretamente à Internet. Pode haver firewalls adicionais do banco de dados. Eles podem afetar as portas de comunicação possíveis e, portanto, as opções de autenticação do servidor Web para servidores de aplicativos e de banco de dados remotos. Por exemplo, a autenticação do Windows requer portas adicionais.<br />
Na fase de projeto, considere quais protocolos, portas e serviços podem acessar os recursos internos a partir de servidores Web localizados na rede de perímetro. Identifique também os protocolos e as portas necessários ao projeto do aplicativo e analise as ameaças que podem surgir com a abertura de novas portas ou com o uso de novos protocolos.<br />
Comunique e registre qualquer consideração sobre a segurança na camada da rede e do aplicativo e qual componente cuidará disso. Isso evita que faltem controles de segurança quando as equipes de desenvolvimento e de rede assumirem que a outra equipe está cuidado do assunto. Preste atenção às defesas de segurança que o aplicativo espera que a rede forneça. Considere as implicações de uma alteração na configuração da rede. Quanto você perderá de segurança se implementar uma alteração específica na rede?</p>
<p>Topologias de implantação</p>
<p>A topologia de implantação do aplicativo e se existe uma camada de aplicativo remota são considerações importantes a serem incorporadas ao seu projeto. Se existir uma camada de aplicativo remota, você terá que considerar como proteger a rede entre os servidores para eliminar a ameaça de espionagem da rede e para fornecer privacidade e integridade aos dados confidenciais.</p>
<p>Considere também identificar o fluxo e as contas que serão utilizadas para autenticação da rede quando o aplicativo conectar–se com servidores remotos. Uma abordagem comum é utilizar pelo menos uma conta de processo privilegiada e criar uma conta duplicada (espelho) no servidor remoto com a mesma senha. Como alternativa, convém utilizar uma conta de processo de domínio, que facilita a administração, mas é mais problemática de proteger devido à dificuldade de limitar o uso da conta pela rede. Um firewall intermediário ou domínios separados sem relações de confiança geralmente fazem com que a abordagem de conta local seja a única opção viável.</p>
<p>Intranet, extranet e Internet</p>
<p>Cada um desses cenários de uso do aplicativo apresenta desafios de projeto. As questões a considerar incluem: Como você conduzirá a identidade do chamador em várias camadas de aplicativo até os recursos back–end? Onde será feita a autenticação? Você pode confiar na autenticação feita no front–end e então utilizar uma conexão confiável para acessar recursos de back–end? No caso da extranet, você também deve considerar se confia nas contas dos parceiros.<br />
Para obter mais informações sobre questões específicas para esses e outros cenários, consulte as seções &#8220;Intranet Security&#8221;, &#8220;Extranet Security&#8221; e &#8220;Internet Security&#8221; de &#8220;Building Secure ASP.NET Web Applications: Authentication, Authorization, and Secure Communication&#8221; em [url="http://msdn.microsoft.com/library/en-us/dn...ecnetlpMSDN.asp"]http://msdn.microsoft.com/library/en-us/dn&#8230;ecnetlpMSDN.asp[/url] (em inglês).</p>
<p>Validação da entrada</p>
<p>A validação da entrada é um desafio e o peso de uma solução cai sobre os ombros dos desenvolvedores do aplicativo. No entanto, a validação da entrada correta é uma das medidas de defesa mais fortes contra os ataques a aplicativos realizados atualmente. A validação da entrada correta é uma contramedida eficiente que pode ajudar a impedir ataques de scripts em sites, inclusão de código SQL e estouro do buffer, entre outros ataques de entrada.<br />
A validação da entrada é difícil porque não há uma resposta única a o que constitui uma entrada válida entre os aplicativos e nem mesmo em cada aplicativo. Da mesma forma, não há uma única definição de entrada mal–intencionada. Além disso, o que o aplicativo faz com essa entrada influencia o risco de exploração. Por exemplo, você armazena dados para serem utilizados por outros aplicativos ou o seu aplicativo usa a entrada feita em outras fontes de dados por outros aplicativos?</p>
<p>As práticas a seguir melhoram a validação da entrada do aplicativo da Web:</p>
<p>• Considere que todas as entradas são mal–intencionadas.<br />
• Centralize a sua abordagem.<br />
• Não confie na validação do lado do cliente.<br />
• Tenha cuidado com questões de canonização.<br />
• Restrinja, rejeite e limpe a entrada.</p>
<p>Considere que todas as entradas são mal–intencionadas</p>
<p>A validação da entrada começa com a suposição fundamental de que toda entrada é mal–intencionada até que se prove o contrário. Independentemente de a entrada ter origem em um serviço, um compartilhamento de arquivo, um usuário ou de um banco de dados, valide a entrada se a fonte estiver fora do limite confiável. Por exemplo, se você chamar um Web Service externo que retornar seqüências de caracteres, como você sabe se não foram inseridos comandos mal–intencionados? Além disso, se houver vários aplicativos gravando dados em um banco de dados compartilhado, ao ler os dados, como saber se eles são seguros?</p>
<p>Centralize a sua abordagem</p>
<p>Faça da estratégia de validação da entrada um elemento básico do projeto do aplicativo. Considere uma abordagem centralizada para validação, por exemplo, utilizando um código comum de validação e filtragem em bibliotecas compartilhadas. Isso garante que as regras de validação serão aplicadas de forma consistente. Isso também reduz o trabalho de desenvolvimento e ajuda na manutenção futura.<br />
Em muitos casos, campos individuais requerem validação específica, por exemplo, com expressões regulares desenvolvidas especialmente. No entanto, você pode freqüentemente melhorar rotinas comuns para validar campos utilizados regularmente, como endereços de email, cargos, nomes, endereços postais (incluindo CEP) e assim por diante.</p>
<p>Não confie na validação do lado do cliente</p>
<p>O código do lado do servidor deve executar sua própria validação. E se um invasor ignorar ou desativar as rotinas de script do lado do cliente, por exemplo, desativando o JavaScript? Use validação no lado do cliente para ajudar a reduzir o número de idas e vindas ao servidor, mas não confie nela para a segurança. Esse é um exemplo de defesa profunda.</p>
<p>Tenha cuidado com questões de canonização</p>
<p>Dados em forma canônica estão na sua forma padrão ou mais simples. Canonização é o processo de converter dados em sua forma canônica. Caminhos de arquivo e URLs são particularmente sujeitos a problemas de canonização e exploração bem conhecidas são o resultado direto de bugs de canonização. Por exemplo, considere a seqüência de caracteres a seguir que contém um arquivo e o caminho em sua forma canônica.</p>
<p>c:\temp\algumarquivo.dat</p>
<p>As seqüências de caracteres a seguir também poderiam representar o mesmo arquivo.<br />
algumarquivo.dat</p>
<p>c:\temp\subdir\..\algumarquivo.dat<br />
c:\ temp\ algumarquivo.dat<br />
..\algumarquivo.dat<br />
c%3A%5Ctemp%5Csubdir%5C%2E%2E%5Calgumarquivo.dat</p>
<p>No último exemplo, os caracteres foram especificados na forma hexadecimal:</p>
<p>• %3A representa o sinal dois–pontos.<br />
• %5C representa uma barra invertida.<br />
• %2E representa um ponto.</p>
<p>Geralmente, você deve tentar evitar projetar aplicativos que aceitam nomes de arquivo na entrada do usuário para evitar problemas de canonização. Em vez disso, considere projetos alternativos. Por exemplo, deixe o aplicativo determinar o nome do arquivo para o usuário.</p>
<p>Se você aceitar nomes de arquivo na entrada, certifique–se de que eles estejam estritamente formados antes de tomar decisões de segurança como autorizar ou negar acesso ao arquivo especificado.</p>
<p>Restrinja, rejeite e limpe a entrada</p>
<p>A melhor abordagem para validar a entrada é restringir desde o começo o que será permitido. É muito mais fácil validar dados de tipos, padrões e intervalos conhecidos que validá–los procurando caracteres inválidos conhecidos. Quando você projeta o aplicativo, sabe o que ele espera. O intervalo de dados válidos geralmente é um conjunto mais finito que o de entradas mal–intencionadas possíveis. No entanto, para uma defesa mais detalhada, convém rejeitar a entrada inválida conhecida e então limpá–la.</p>
<p>Para criar uma estratégia de validação da entrada eficiente, conheça as abordagens a seguir e suas exigências:</p>
<p>• Restringir a entrada.<br />
• Validar dados por tipo, tamanho, formato e intervalo.<br />
• Rejeitar dados inválidos.<br />
• Limpar a entrada.</p>
<p>Restringir a entrada</p>
<p>Restringir a entrada refere–se a aceitar dados bons. Esta é a melhor abordagem. A idéia é definir um filtro de entradas aceitáveis utilizando tipo, tamanho, formato e intervalo. Defina o que é uma entrada aceitável para os campos do aplicativo e a aplique. Rejeite o restante como dados inválidos.<br />
A restrição da entrada deve envolver a definição de conjuntos de caracteres no servidor para que você possa estabelecer a forma canônica da entrada de maneira localizada.</p>
<p>Validar os dados por tipo, tamanho, formato e intervalo</p>
<p>Use uma verificação de tipo rígida da entrada de dados sempre que possível, por exemplo, em classes utilizadas para manipular e processar os dados da entrada e em rotinas de acesso a dados. A exemplo disto, utilize procedimentos armazenados com parâmetros para acessar dados a fim de aproveitar a verificação de tipo dos campos de entrada.<br />
Verifique também os campos de seqüências de caracteres e, muitas vezes, se seu formato é apropriado. Por exemplo, CEPs, números de RG, etc. têm formatos definidos que podem ser validados utilizando–se expressões regulares. A verificação completa não é a única boa prática de programação; ela dificulta que um invasor explore o código. O invasor pode passar pela verificação de tipo, mas a verificação de tamanho pode dificultar a execução de seu ataque favorito.</p>
<p>Rejeitar dados inválidos</p>
<p>Rejeite dados &#8220;inválidos&#8221;, mas não dependa totalmente dessa abordagem. Geralmente, ela é menos eficiente que utilizar a abordagem de &#8220;permissão&#8221; descrita anteriormente e é melhor usá–la de forma combinada. Para negar dados inválidos, assume–se que o aplicativo conhece todas as variações de uma entrada mal–intencionada. Lembre–se de que existem várias formas de representar caracteres. Esse é um outro motivo pelo qual a &#8220;permissão&#8221; é a abordagem preferida.<br />
Embora seja útil para aplicativos que já estão em uso e quando você não pode arcar com alterações significativas, a abordagem de &#8220;negação&#8221; não é tão robusta como a de &#8220;permissão&#8221; pode os dados inválidos, como padrões que podem ser utilizados para identificar ataques comuns, não são constantes. Os dados válidos são constantes enquanto os dados inválidos podem variar periodicamente.</p>
<p>Limpar a entrada</p>
<p>Quando falamos em limpeza, significa transformar dados possivelmente mal–intencionados em dados seguros. Isso pode ser útil quando o intervalo de entrada permitido não pode garantir que a entrada é segura. Isso inclui qualquer coisa desde separar um valor nulo do final de uma seqüência de caracteres fornecida pelo usuário até remover valores para que sejam tratados como literais.<br />
Outro exemplo comum de limpeza da entrada de aplicativos da Web é utilizar codificação de URL ou HTML para combinar dados e tratá–los como texto literal em vez de como script executável. Os métodos de HtmlEncode removem caracteres HTML e UrlEncode codificam um URL para que ele seja uma solicitação URI válida.</p>
<p>Na prática</p>
<p>Seguem exemplos aplicados a campos de entrada comuns utilizando as abordagens citadas:</p>
<p>• Campo Sobrenome. Este é um bom exemplo de onde a restrição da entrada é apropriada. Nesse caso, convém restringir os dados da seqüência de caracteres no intervalo ASCII A–Z e a–z e também em hífens e apóstrofes (apóstrofes não significam nada para o SQL) para tratar nomes como O&#8217;Dell. Também é ideal limitar a extensão ao maior valor esperado.<br />
• Campo Quantidade. Este é outro caso em que a restrição da entrada funciona bem. Neste exemplo, convém utilizar uma restrição simples de tipo e intervalo. Por exemplo, os dados da entrada podem precisar ser um número inteiro positivo entre 0 e 1000.<br />
• Campo Texto livre. Os exemplos incluem campos de comentário em quadros de discussão. Nesse caso, convém permitir o uso de letras e espaços além de caracteres comuns, como apóstrofes, vírgulas e hífens. O conjunto do que é permitido não inclui sinais de maior que e menor que, chaves e colchetes.<br />
Alguns aplicativos podem permitir que os usuários marquem o texto utilizando um conjunto finito de caracteres de script, como negrito &#8220;&#8221; e itálico &#8220;&#8221;, ou até mesmo incluam um link para o URL favorito. No caso de um URL, a validação deve codificar o valor para que ele seja tratado como URL.</p>
<p>Um aplicativo da Web existente que não valida a entrada do usuário. Em um cenário ideal, o aplicativo verifica se a entrada de cada campo ou ponto de entrada é aceitável. No entanto, se você já possui um aplicativo da Web que não valida a entrada do usuário, você precisa de uma abordagem &#8220;quebra galho&#8221; para reduzir o risco até que seja possível aprimorar a estratégia de validação da entrada do aplicativo. Embora nenhuma das abordagens a seguir garantam um tratamento seguro da entrada, pois dependem de fatores como de onde vem a entrada e como ela será utilizada no aplicativo, elas são empregadas atualmente como correções rápidas para melhorar a segurança em curto prazo:</p>
<p>• Codificar como HTML e URL a entrada do usuário ao gravar de volta no cliente. Nesse caso, considera–se que nenhuma entrada é tratada como HTML e todas as saída são gravadas de volta de forma protegida. Essa é uma ação de limpeza.<br />
• Rejeitar caracteres de script mal-intencionados. Esse é um caso de rejeição de entrada inválida conhecida. Nesse caso, um conjunto configurável de caracteres mal–intencionados é utilizado para rejeitar a entrada. Como descrito anteriormente, o problema dessa abordagem é um dado considerado inválido de acordo com o contexto.</p>
<p>Autenticação</p>
<p>Autenticação é o processo pelo qual se determina a identidade do chamador. Existem três aspectos a considerar:</p>
<p>• Identificar onde a autenticação é necessária no aplicativo. Geralmente, ela é requerida sempre que um limite confiável é ultrapassado. Os limites confiáveis normalmente incluem conjuntos, processos e hosts.<br />
• Validar quem é o chamador. Os usuários geralmente se autenticam com nomes de usuário e senhas.<br />
• Identificar o usuário nas solicitações subseqüentes. Isso requer alguma forma de identificador de autenticação.<br />
Muitos aplicativos da Web usam um mecanismo de senha para autenticar usuários, sendo que o usuário fornece um nome de usuário e uma senha em formato HTML. As questões a considerar nesse caso incluem:<br />
• Os nomes de usuário e senhas são enviados em texto sem formatação por um canal inseguro? Se sim, um invasor pode utilizar um software de monitoramento de rede para espionar e capturar as credenciais. A contramedida aqui é proteger o canal de comunicação utilizando SSL (Secure Socket Layer).<br />
• Como as credenciais são armazenadas? Se você estiver armazenando nomes de usuário e senhas em texto sem formatação, em arquivos ou em um banco de dados, está procurando problemas. E se o diretório do aplicativo não estiver configurado corretamente e um invasor procurar um arquivo e baixar seu conteúdo ou incluir uma conta de logon com privilégios? E se um administrador descontente levar seu banco de dados de nomes de usuário e senhas?<br />
• Como as credenciais são verificadas? Não é necessário armazenar senhas de usuário se a única finalidade for verificar se o usuário conhece a senha. Em vez disso, você pode armazenar um verificador na forma de um valor de hash e recalcular o hash utilizando o valor fornecido pelo usuário durante o processo de logon. Para eliminar a ameaça de um ataque de dicionário contra o armazenamento de credenciais, utilize senhas de alta segurança e combine um valor falso gerado aleatoriamente com o hash da senha.<br />
• Como o usuário autenticado é identificado após o logon inicial? É necessária alguma forma de permissão de autenticação como, por exemplo, um cookie de autenticação. Como o cookie é protegido? Se ele for enviado por um canal desprotegido, um invasor pode capturá–lo e usá–lo para acessar o aplicativo. Um cookie de autenticação roubado é um logon roubado.</p>
<p>As práticas a seguir melhoram a autenticação do aplicativo da Web:</p>
<p>• Separar áreas públicas e restritas.<br />
• Utilizar diretivas de bloqueio de conta para as contas de usuário final.<br />
• Utilizar senhas com data de validade.<br />
• Poder desativar contas.<br />
• Não armazenar senhas nos armazenamentos de usuários.<br />
• Exigir senhas de alta segurança.<br />
• Não transmitir senhas em texto sem formatação.<br />
• Proteger os cookies de autenticação.</p>
<p>Separar áreas públicas e restritas</p>
<p>A área pública do seu site pode ser acessada por qualquer usuário de forma anônima. As áreas restritas só podem ser acessadas por pessoas específicas e os usuários devem ser autenticados no site. Considere um site comum de uma loja. Você pode navegar pelo catálogo de produtos de forma anônima. Quando você inclui itens no carrinho de compra, o aplicativo identifica você utilizando um identificador de sessão. Finalmente, quando você faz o pedido, realiza uma transação segura. Nesse ponto, você precisa fazer logon para autenticar sua transação pela SSL.<br />
Dividindo o site em áreas de acesso pública e restrita, você pode aplicar regras de autenticação e autorização a todo o site e limitar o uso da SSL. Para evitar a sobrecarga desnecessária sobre o desempenho provocado pela SSL, projete o site de modo a limitar o uso da SSL nas áreas que requerem acesso autenticado.<br />
Utilizar diretivas de bloqueio de conta para as contas de usuário final</p>
<p>Desative contas de usuário final ou a gravação de eventos em log depois de um número determinado de tentativas de logon sem sucesso. Se você estiver utilizando a autenticação do Windows, como NTLM ou o protocolo Kerberos, essas diretivas podem ser configuradas e aplicadas automaticamente pelo sistema operacional. Com autenticação de formulários, essas diretivas são responsabilidade do aplicativo e devem ser incorporadas ao projeto do mesmo.<br />
Tenha cuidado para que as diretivas de bloqueio de contas não sejam utilizadas em ataques de negação de serviço. Por exemplo, contas de serviço padrão conhecidas, como IUSR_MACHINENAME, devem ser substituída por nomes de contas personalizados para evitar que um invasor que consiga obter o nome do servidor Web do IIS (Internet Information Services) bloqueie essa conta vital.</p>
<p>Utilizar senhas com data de validade</p>
<p>As senhas não devem ser estáticas e sim alteradas como parte da rotina de manutenção de senha por meio de períodos de validade da senha. Considere fornecer esse tipo de recurso ao projetar o aplicativo.</p>
<p>Poder desativar contas</p>
<p>Se o sistema estiver comprometido, poder invalidar deliberadamente credenciais ou desativar contas pode evitar outros ataques.</p>
<p>Não registrar senhas nos armazenamentos de usuários</p>
<p>Se você deve verificar as senhas, não é necessário realmente armazená–las. Em vez disso, armazene um valor de hash unidirecional e então recalcule o hash utilizando as senhas fornecidas pelos usuários. Para eliminar a ameaça de um ataque de dicionário contra o armazenamento do usuário, utilize senhas de alta segurança e incorpore um valor falso gerado com a senha.</p>
<p>Exigir senhas de alta segurança</p>
<p>Não facilite a quebra de senhas para os invasores. Existem muitas instruções, mas uma prática geral é exigir no mínimo oito caracteres e uma mistura de letras maiúsculas e minúsculas, números e caracteres especiais. Tanto se você estiver utilizando uma plataforma para aplicar essas regras ou quanto se estiver desenvolvendo sua própria validação, essa etapa é necessária para combater ataques de força bruta, nos quais o invasor tenta quebrar uma senha sistematicamente por tentativa e erro. Utilize expressões regulares para ajudar na validação de senhas de alta segurança.</p>
<p>Não transmitir senhas em texto sem formatação</p>
<p>Senhas em texto sem formatação enviadas por uma rede ficam vulneráveis à espionagem. Para acabar com essa ameaça, você precisa proteger o canal de comunicação como, por exemplo, utilizar SSL para criptografar o tráfego.</p>
<p>Proteger os cookies de autenticação</p>
<p>Um cookie de autenticação roubado é um logon roubado. Proteja as permissões de autenticação utilizando criptografia e canais de comunicação seguros. Além disso, limite o tempo de validade de uma permissão de autenticação para combater a ameaça de spoofing que pode resultar de ataques de repetição, nos quais o invasor captura o cookie e o usa para obter acesso ilegal ao site. Reduzir o tempo limite do cookie não evita ataques de repetição, mas limita o tempo pelo qual o invasor terá acesso ao site utilizando o cookie roubado.</p>
<p>Autorização</p>
<p>A autorização determina o que a identidade autenticada pode realizar e quais recursos ela acessa. Uma autorização incorreta ou ineficaz leva à divulgação de informações e à violação dos dados. Defesa profunda é o princípio básico de segurança utilizado na estratégia de autorização do aplicativo.</p>
<p>As práticas a seguir melhoram a autorização do aplicativo da Web:</p>
<p>• Utilizar vários gatekeepers.<br />
• Restringir o acesso do usuário a recursos no nível do sistema.<br />
• Considerar a granulação da autorização.</p>
<p>Utilizar vários gatekeepers</p>
<p>No lado do servidor, você pode utilizar as diretivas do IPSec (IP Security Protocol) para definir restrições do host a fim de restringir a comunicação entre servidores. Por exemplo: uma diretiva IPSec poderia restringir a conexão de qualquer host separado de um servidor Web com um servidor de banco de dados. O IIS fornece permissões da Web e restrições IP/DNS (Internet Protocol/Domain Name System). As permissões da Web do IIS são válidas para todos os recursos solicitados pelo HTTP independentemente do usuário. Elas não oferecem proteção se um invasor tiver como realizar logon no servidor. Por isso, as permissões de NTFS consentem que você especifique listas de controle de acesso por usuário. Finalmente, o ASP.NET fornece autorização de URL e de arquivo junto a demanda de permissão principal. Combinando esses gatekeepers, você pode desenvolver uma estratégia de autorização eficiente.</p>
<p>Restringir o acesso do usuário a recursos no nível do sistema</p>
<p>Os recursos no nível do sistema incluem arquivos, pastas, chaves do registro, objetos do Active Directory, objetos do banco de dados, logs de evento, etc. Utilize as listas de controle de acesso do Windows para restringir quais usuários podem acessar quais recursos e os tipos de operação que eles podem executar. Preste atenção especialmente nas contas de usuário anônimas da Internet; utilize as listas de controle de acesso para restringi–las a recursos que negam acesso explicitamente a usuários anônimos.</p>
<p>Considerar a granulação da autorização</p>
<p>Existem três modelos comuns de autorização, cada um com graus diferentes de granulação e escalabilidade.<br />
A abordagem mais granular depende de representação. O acesso aos recursos ocorre utilizando o contexto de segurança do chamador. As listas de controle de acesso do Windows dos recursos protegidos (geralmente arquivos ou tabelas, ou ambos) determinam se o chamador pode acessar o recurso. Se o aplicativo fornecer acesso basicamente a recursos específicos do usuário, essa abordagem pode ser válida. Sua vantagem é que a auditoria no nível do sistema operacional pode ser feita entre as camadas do aplicativo, pois o contexto de segurança do chamador original flui no nível do sistema operacional e é utilizado para acessar recursos. No entanto, seu problema é a escalabilidade do aplicativo, pois não é possível estabelecer um pool de conexão eficiente para acessar o banco de dados. Como resultado, essa abordagem é encontrada com mais freqüência em aplicativos para intranet de escala limitada.</p>
<p>A abordagem menos granular, porém mais escalonável, utiliza a identificação de processo do aplicativo para acessar recursos. Ela oferece suporte ao pool de conexão ao banco de dados, mas isso significa que as permissões concedidas à identificação do aplicativo no banco de dados são comuns, independentemente da identificação do chamador original. A autorização principal é feita na camada intermediária lógica do aplicativo utilizando funções, agrupando usuários que compartilham os mesmos privilégios com relação ao aplicativo. O acesso a classes e métodos é restringido de acordo com a participação do chamador na função. Para oferecer suporte à recuperação de dados por usuário, uma abordagem comum é inclui uma coluna de identificação nas tabelas do banco de dados e utilizar parâmetros de consulta para restringir os dados recuperados. Por exemplo: você pode passar a identificação do chamador original para o banco de dados no nível do aplicativo (não do sistema operacional) por meio de parâmetros de procedimentos armazenados e gravar consultas semelhantes a estas:</p>
<p>SELECT field1, field2, field3 FROM Table1 WHERE {some search criteria} AND</p>
<p>UserName = @originalCallerUserName</p>
<p>Esse modelo é conhecido como subsistema confiável ou, às vezes, como modelo de servidor confiável.<br />
A terceira opção é utilizar um conjunto limitado de identidades para acessar recursos com base na participação do chamador na função. Na verdade, trata–se de um híbrido dos dois modelos descritos anteriormente. Os chamadores são mapeados para funções na camada intermediária lógica do aplicativo e o acesso a classes e métodos é restrito de acordo com a participação na função. O acesso a recursos de downstream é feito utilizando um conjunto restrito de identidade determinado pela participação na função do chamador atual. A vantagem dessa abordagem é que as permissões podem ser atribuídas a logons separados no banco de dados e a regulagem da conexão ainda ser efetiva com diversos pools de conexões. A desvantagem é que a criação dos símbolos de acesso com vários segmentos utilizados para estabelecer contextos diferentes de segurança para acessar recursos de downstream utilizando a autenticação do Windows é uma operação com privilégios que requer contas de processo com privilégios. Isso vai contra o princípio de menos privilégios.</p>
<p>Gerenciamento de configuração</p>
<p>Considere atentamente a funcionalidade de gerenciamento de configuração do aplicativo da Web. A maioria dos aplicativos requer interfaces que permitem que desenvolvedores de conteúdo, operadores e administradores configurem o aplicativo e gerenciem itens como conteúdo de páginas da Web, contas de usuário, informações do perfil do usuário e seqüências de caracteres para conexão do banco de dados. Se houver suporte para administração remota, como as interfaces de administração são protegidas? As conseqüências de uma falha de segurança em uma interface administrativa podem ser graves, pois o invasor freqüentemente acaba utilizando privilégios de administrador e tem acesso direto a todo o site.</p>
<p>As práticas a seguir aumentam a segurança do gerenciamento da configuração do aplicativo da Web:</p>
<p>• Proteger as interfaces administrativas.<br />
• Proteger o armazenamento da configuração.<br />
• Manter privilégios administrativos distintos.<br />
• Utilizar contas com processos e serviços com a menor quantidade de privilégios.</p>
<p>Proteger as interfaces administrativas</p>
<p>É importante que a funcionalidade de gerenciamento da configuração seja acessível somente por operadores e administradores autorizados. O principal é aplicar uma autenticação rígida nas interfaces administrativas, por exemplo, utilizando certificados.</p>
<p>Se possível, limite ou evite o uso da administração remota e exija que os administradores façam logon localmente. Se você precisar oferecer suporte a administração remota, use canais criptografados, por exemplo, com tecnologia de SSL VPN, devido à natureza confidencial dos dados transmitidos pelas interfaces administrativas. Considere também limitar a administração remota a computadores da rede interna utilizando diretivas IPSec para diminuir ainda mais o risco.</p>
<p>Proteger o armazenamento da configuração</p>
<p>Arquivos de configuração em texto, o registro e os bancos de dados são as opções comuns para armazenamento dos dados de configuração do aplicativo. Se possível, evitar utilizar arquivos de configuração no espaço da Web do aplicativo para evitar possíveis vulnerabilidades no servidor de configuração, resultando no download dos arquivos de configuração. Independentemente da abordagem utilizada, proteja o acesso ao armazenamento da configuração, por exemplo, utilizando as listas de controle de acesso do Windows ou permissões do banco de dados. Além disso, evite armazenar informações confidenciais, como seqüências de caracteres de conexão do banco de dados ou credenciais de contas, em texto sem formatação. Proteja esses itens utilizando criptografia e restrinja o acesso à chave do registro, ao arquivo ou à tabela que contém os dados criptografados.</p>
<p>Manter privilégios administrativos distintos</p>
<p>Se a funcionalidade suportada pelos recursos do gerenciamento da configuração do aplicativo varia de acordo com a função do administrador, considere autorizar cada função separadamente utilizando a autorização com base na função. Por exemplo: a pessoa responsável por atualizar o conteúdo estático do site não precisa ter permissão para alterar o limite de crédito de um cliente.<br />
Utilizar contas com processos e serviços com a menor quantidade de privilégios<br />
Um aspecto importante da configuração do aplicativo são as contas de processo utilizadas para executar processos no servidor Web e as contas de serviço utilizadas para acessar recursos de downstream e sistemas. Certifique–se de que essas contas estejam configuradas com a menor quantidade de privilégios. Se um invasor conseguir assumir o controle de um processo, a identificação do processo deve ter acesso extremamente restrito ao sistema de arquivos e a outros recursos do sistema para limitar os danos que podem ser causados</p>
<p>Dados confidenciais</p>
<p>Os aplicativos que lidam com informações particulares dos usuários, como números de cartão de crédito, endereços, registros médicos e outros, devem seguir etapas especiais para garantir que os dados permanecerão particulares e inalterados. Além disso, os segredos utilizados na implementação do aplicativo, como senhas e seqüências de conexão ao banco de dados, devem ser protegidos. A segurança de dados confidenciais é um problema enquanto os dados são armazenados em um local de armazenamento persistente e enquanto são transmitidos pela rede.</p>
<p>Segredos</p>
<p>Os segredos incluem senhas, seqüências de caracteres de conexão ao banco de dados e números de cartão de crédito. As práticas a seguir aumentam a segurança do tratamento dos segredos feito pelo aplicativo da Web:</p>
<p>• Não armazenar segredos se for possível evitar.<br />
• Não armazenar segredos no código.<br />
• Não armazenar conexões ao banco de dados, senhas ou chaves em texto sem formatação.<br />
• Evitar armazenar segredos na LSA (autoridade de segurança local).<br />
• Utilizar a DAPI (API de Proteção a Dados) para criptografar os segredos.</p>
<p>Não armazenar segredos se for possível evitar</p>
<p>Armazenar segredos em software de maneira totalmente segura é impossível. Um administrador, com acesso físico ao servidor, pode acessar os dados. Não é necessário armazenar um segredo quando tudo o que você precisa fazer é verificar se o usuário o conhece. Nesse caso, você pode armazenar um valor de hash que representa o segredo e calcula o hash utilizando o valor fornecido pelo usuário para verificar se o usuário conhece o segredo.</p>
<p>Não armazenar segredos no código</p>
<p>Não inclua os segredos no código. Mesmo que o código–fonte não seja exposto no servidor Web, é possível extrair constantes de seqüências de caracteres de arquivos executáveis compilados. Uma vulnerabilidade na configuração pode permitir que um invasor recupere o executável.<br />
Não armazenar conexões ao banco de dados, senhas ou chaves em texto sem formatação<br />
Evite armazenar segredos como seqüências de caracteres de conexões ao banco de dados, senhas ou chaves em texto sem formatação. Utilize criptografia e armazene seqüências de caracteres criptografadas.</p>
<p>Evitar armazenar segredos na LSA</p>
<p>Evitar a LSA porque o aplicativo requer privilégios administrativos para acessá–la. Isso viola o princípio de segurança básico de utilizar a menor quantidade de privilégios. Além disso, a LSA pode armazenar segredos somente em um número restrito de slots. O melhor é utilizar a DPAPI, disponível no Microsoft Windows® 2000 e nos sistemas operacionais posteriores.</p>
<p>Utilizar DPAPI para criptografar os segredos</p>
<p>Para armazenar segredos como seqüências de caracteres de conexão a banco de dados ou credenciais de serviço das contas, use DPAPI. A principal vantagem de utilizar a DPAPI é que o sistema da plataforma gerencia a chave de criptografia/descriptografia e isso não é problema para o aplicativo. A chave é vinculada a uma conta de usuário do Windows ou a um computador específico, dependendo dos sinalizadores passados para as funções da DPAPI.<br />
A DPAPI é mais adequada para criptografar informações, pois pode ser recriada manualmente em caso de perda das chaves mestre, por exemplo, devido a um dano no servidor que exija a reinstalação do sistema operacional. Dados que não podem ser recuperados porque você conhece o valor sem formatação, por exemplo, detalhes do cartão de crédito do cliente, requerem uma abordagem alternativa que usa a criptografia com base em chave simétrica tradicional, como a utilizada no triplo DES.</p>
<p>Dados confidenciais por usuário</p>
<p>Dados confidenciais, como credenciais de logon, e dados no nível do aplicativo, como números de cartão de crédito, números de contas bancárias, etc., precisam ser protegidos. A privacidade por meio da criptografia e a integridade através de códigos de autenticação de mensagens (MAC) são os elementos principais.</p>
<p>As práticas a seguir aumentam a segurança de dados confidenciais por usuário em aplicativos da Web:</p>
<p>• Recuperar dados confidenciais sob demanda.<br />
• Criptografar os dados ou proteger o canal de comunicação.<br />
• Não armazenar dados confidenciais em cookies persistentes.<br />
• Não transmitir dados confidenciais utilizando o protocolo HTTP–GET.</p>
<p>Recuperar dados confidenciais sob demanda</p>
<p>A melhor abordagem é recuperar dados confidenciais sob demanda quando eles forem necessários em vez de mantê–los ou armazená–los em cache na memória. Por exemplo: recupere o segredo criptografado quando ele for necessário, descriptografe–o e limpe a memória (variável) uutilize para manter o segredo em texto sem formatação. Se a questão for o desempenho, considere estas opções:</p>
<p>• Armazenar em cache o segredo criptografado.<br />
• Armazenar em cache o segredo em texto sem formatação.</p>
<p>Armazenar em cache o segredo criptografado</p>
<p>Recupere o segredo quando o aplicativo for carregado e o armazene em cache na memória, descriptografando–o quando o aplicativo usá–lo. Apague a cópia em texto sem formatação quando ela não for mais necessária. Essa abordagem evita o acesso ao armazenamento de dados a cada solicitação.</p>
<p>Armazenar em cache o segredo em texto sem formatação</p>
<p>Evite a sobrecarga de descriptografar o segredo várias vezes e armazenar a cópia em texto sem formatação do segredo na memória. Essa é a abordagem menos segura, mas oferece o melhor desempenho. Teste as outras abordagens antes de achar que o ganho em desempenho compensa o risco de segurança maior.<br />
Criptografar os dados ou proteger o canal de comunicação</p>
<p>Se você estiver enviando ao cliente dados confidenciais pela rede, criptografe–os ou proteja o canal. Uma prática comum é utilizar SSL entre o cliente e o servidor Web. Entre servidores, a abordagem cada vez mais comum é utilizar IPSec. Para proteger dados confidenciais que trafegam entre vários intermediários, por exemplo, mensagens SOAP (Simple Object Access Protocol) do Web Service, usam criptografia no nível da mensagem.</p>
<p>Não armazenar dados confidenciais em cookies persistentes</p>
<p>Evite armazenar dados confidenciais em cookies persistentes. Se você armazenar dados em texto sem formatação, o usuário final poderá ver e modificar os dados. Se você criptografar os dados, o gerenciamento de chaves pode ser um problema. Por exemplo, a chave utilizada para criptografar os dados no cookie expirou e foi reciclada, a nova chave não consegue descriptografar o cookie persistente transmitido pelo navegador a partir do cliente.<br />
Não transmitir dados confidenciais utilizando o protocolo HTTP–GET<br />
Você pode evitar armazenar dados confidenciais utilizando o protocolo HTTP–GET porque ele usa seqüências de caracteres de consulta para transmitir dados. Não é possível proteger dados confidenciais utilizando seqüências de caracteres de consulta e estas são freqüentemente registradas pelo servidor</p>
<p>Gerenciamento de sessão</p>
<p>Os aplicativos da Web baseiam–se no protocolo HTTP independente, portanto, o gerenciamento da sessão é responsabilidade do aplicativo. A segurança da sessão é fundamental para a segurança geral do aplicativo.<br />
As práticas a seguir aumentam a segurança do gerenciamento da sessão do aplicativo da Web:</p>
<p>• Utilizar SSL para proteger os cookies de autenticação da sessão.<br />
• Criptografar o conteúdo dos cookies de autenticação.<br />
• Limitar a duração da sessão.<br />
• Proteger o estado da sessão contra acesso não autorizado.</p>
<p>Utilizar SSL para proteger os cookies de autenticação da sessão</p>
<p>Não transmita cookies de autenticação por conexões HTTP. Defina o cookie seguro corretamente nos cookies de autenticação, que instruem os navegadores a retornar os cookies ao servidor somente por conexões HTTPS.<br />
Criptografar o conteúdo dos cookies de autenticação<br />
Criptografe o conteúdo do cookie mesmo que você esteja utilizando SSL. Isso evita que um invasor visualize ou modifique o cookie se ele conseguir roubá–lo por meio de um ataque de scripts através de sites. Nesse caso, o invasor ainda poderia utilizar o cookie para acessar o aplicativo, mas somente enquanto ele fosse válido.</p>
<p>Limitar a duração da sessão</p>
<p>Reduza o tempo de duração das sessões para reduzir o risco de seqüestro de sessão e ataques de repetição. Quanto menor a sessão, menos tempo o invasor terá para capturar um cookie da sessão usá–lo para acessar o aplicativo.<br />
Proteger o estado da sessão contra acesso não autorizado</p>
<p>Considere como o estado da sessão será armazenado. Para um melhor desempenho, você pode armazená–lo no espaço de endereço do processo do aplicativo da Web. No entanto, essa abordagem tem escalabilidade limitada e implicações em cenários de Web farm, nos quais não há garantia de que as solicitações do mesmo usuário serão tratadas pelo mesmo servidor. Nesse caso, é necessário um estado fora do processo em um servidor de estado dedicado ou um armazenamento de estado persistente em um banco de dados compartilhado. O ASP.NET suporte as três opções.<br />
Você deve proteger o link de rede entre o aplicativo da Web e o armazenamento de estado utilizando IPSec ou SSL para reduzir o risco de espionagem. Considere também como o aplicativo da Web será autenticado pelo armazenamento de estado. Utilize a autenticação do Windows sempre que possível para evitar transmitir credenciais de autenticação em texto sem formatação pela rede e para aproveitar as diretivas de contas seguras do Windows.</p>
<p>Criptografia</p>
<p>A criptografia em sua forma básica oferece o seguinte:</p>
<p>• Privacidade (Confidencialidade). Esse serviço mantém um segredo como confidencial.<br />
• Não-repúdio (Autenticidade). Esse serviço garante que um usuário não pode negar o envio de uma mensagem em particular.<br />
• À prova de violação (Integridade). Esse serviço evita que os dados sejam alterados.<br />
• Autenticação. Esse serviço confirma a identidade do remetente de uma mensagem.</p>
<p>Os aplicativos da Web freqüentemente usam criptografia para protege dados em armazenamentos persistentes ou enquanto são transmitidos pelas redes. As práticas a seguir aumentam a segurança do aplicativo da Web quando você utilizar criptografia:</p>
<p>• Não desenvolver sua própria criptografia.<br />
• Manter dados descriptografados próximos do algoritmo.<br />
• Utilizar o algoritmo e o tamanho de chave corretos.<br />
• Proteger as chaves de criptografia.</p>
<p>Não desenvolver sua própria criptografia</p>
<p>Algoritmos e rotinas de criptografia são notoriamente difíceis de desenvolver com sucesso. Como resultado, você deve utilizar os serviços de criptografia testados fornecidos pela plataforma. Isso inclui o .NET Framework e o sistema operacional subjacente. Não desenvolva implementações personalizadas porque, geralmente, resultam em uma proteção fraca.</p>
<p>Manter dados descriptografados próximos do algoritmo</p>
<p>Ao transmitir texto sem formatação a um algoritmo, não obtenha os dados até que você esteja pronto para usá–los e armazená–los no menor número de variáveis possível.</p>
<p>Utilizar o algoritmo e o tamanho de chave corretos</p>
<p>É importante garantir que você escolheu o algoritmo certo para o trabalho certo e que você está utilizando um tamanho de chave que fornece um grau suficiente de segurança. Chaves maiores geralmente aumentar a segurança. A lista a seguir resume os principais algoritmos com o tamanho de chave que cada um usa:</p>
<p>• Chave DES (Data Encryption Standard) de 64 bits (8 bytes)<br />
• Chave triplo DES de 128 bits ou chave de 192 bits (16 ou 24 bytes)<br />
• Chaves Rijndael de 128 – 256 bits (16 – 32 bytes)<br />
• Chaves RSA de 384 – 16.384 bits (48 – 2.048 bytes)</p>
<p>Para criptografar dados maiores, utilize o algoritmo de criptografia simétrica Triplo DES. Para criptografia mais lenta e mais rígida de grandes quantidades de dados, use Rijndael. Para criptografar os dados que serão armazenados por curtos períodos, você pode considerar o uso de um algoritmo mais rápido, mas mais fraco, como o DES. Para assinaturas digitais, utilize RSA (Rivest, Shamir e Adleman) ou DAS (Digital Signature Algorithm). Para hash, utilize o SHA (Secure Hash Algorithm)1.0. Para hashes com chaves, utilize o HMAC (Hash–based Message Authentication Code) SHA1.0.</p>
<p>Proteger as chaves de criptografia</p>
<p>A chave de criptografia é um número secreto utilizado como entrada para processos de criptografia e descriptografia. Para que os dados criptografados continuem seguros, a chave deve ser protegida. Se um invasor comprometer a chave de descriptografia, os dados criptografados não estarão mais seguros.<br />
As práticas a seguir ajudam a proteger as chaves de criptografia:</p>
<p>• Utilizar a DPAPI para evitar o gerenciamento de chaves.<br />
• Mudar as chaves periodicamente.</p>
<p>Utilizar a DPAPI para evitar o gerenciamento de chaves</p>
<p>Como já foi citado, uma das maiores vantagens do uso da DPAPI é que a questão do gerenciamento de chaves fica a cargo do sistema operacional. A chave utilizada pela DPAPI é derivada da senha associada à conta de processo que aciona as funções da DPAPI. Use a DPAPI para deixar o trabalho de gerenciamento de chaves para o sistema operacional.</p>
<p>Mudar as chaves periodicamente</p>
<p>Geralmente, a probabilidade de um segredo estático ser descoberto com o tempo é maior. As questões que você não pode esquecer incluem: Você o anotou em algum lugar? Bob, o administrador que detém os segredos, mudou de cargo ou saiu da empresa? Não use demais as chaves.</p>
<p>Manipulação de parâmetros</p>
<p>Com ataques de manipulação de parâmetros, o invasor modifica os dados transmitidos entre o cliente e o aplicativo da Web. Podem ser dados enviados por meio de seqüências de caracteres de consulta, campos de formulário, cookies ou em cabeçalhos HTTP. As práticas a seguir ajudam a proteger a manipulação de parâmetros do aplicativo da Web:</p>
<p>• Criptografar o estado de cookies confidenciais.<br />
• Certificar–se de que os usuários não ignoram as verificações.<br />
• Validar todos os valores enviados a partir do cliente.<br />
• Não confiar nas informações do cabeçalho HTTP.</p>
<p>Criptografar o estado de cookies confidenciais</p>
<p>Os cookies podem conter dados confidenciais, como identificadores de sessão, ou dados utilizados no processo de autorização do lado do servidor. Para proteger esse tipo de dados contra manipulação não–autorizada, criptografe o conteúdo do cookie.</p>
<p>Certificar–se de que os usuários não ignoram as verificações</p>
<p>Certifique–se de que os usuários não ignoram as verificações manipulando parâmetros. Os parâmetros de URL podem ser manipulados pelos usuários finais através da caixa de texto de endereço do navegador. Por exemplo: o URL [url="http://www.//IDsessão=10"]http://www.//IDsessão=10[/url] possui um valor de 10 que pode ser alterado para algum número aleatório para receber uma saída diferente. Certifique–se de verificar isso no código do lado do servidor, não no JavaScript no lado do cliente, que pode ser desativado no navegador.</p>
<p>Validar todos os valores enviados a partir do cliente</p>
<p>Restrinja os campos que o usuário pode inserir e modificar e valide todos os valores provenientes do cliente. Se você predefiniu valores em campos de formulário, os usuários podem alterá–los e retorná–los para receber resultados diferentes. Permita somente valores bem conhecidos sempre que possível. Por exemplo, se o campo de entrada for um estado, somente entradas que correspondam ao código postal do estado devem ser permitidas.</p>
<p>Não confiar nas informações do cabeçalho HTTP</p>
<p>Os cabeçalhos HTTP são enviados no início das solicitações e das respostas HTTP. O aplicativo da Web deve certificar–se de que ele não baseia nenhuma decisão de segurança nas informações contidas nos cabeçalhos HTTP porque é fácil para um invasor manipular o cabeçalho. Por exemplo, o campo referencial do cabeçalho contém o URL da página da Web de onde ele provém. Não tome decisões de segurança com base no valor do campo referencial, por exemplo, verificar se a solicitação teve origem em uma página gerada pelo aplicativo da Web, pois o campo pode ser facilmente falsificado.</p>
<p>Gerenciamento de exceções</p>
<p>O tratamento seguro de exceções pode ajudar a evitar certos ataques de negação de serviço no nível do aplicativo e também pode ser utilizado para impedir que informações importantes no nível do sistema úteis aos invasores sejam retornadas ao cliente. Por exemplo, sem o tratamento correto de exceções, informações como detalhes do esquema do banco de dados, versões do sistema operacional, rastreamentos de pilha, nomes e caminho de arquivos, seqüências de caracteres de consulta do SQL e outras informações de valor para o invasor podem ser retornadas ao cliente.<br />
Uma boa abordagem é projetar um gerenciamento de exceções centralizado e uma solução de registro em log e considerar a inclusão de ganchos no sistema de gerenciamento de exceções para oferecer suporte à instrumentação e ao monitoramento centralizado para ajudar os administradores de sistema.</p>
<p>As práticas a seguir ajudam a proteger o gerenciamento de exceções do aplicativo da Web:</p>
<p>• Não deixar vazar informações para o cliente.<br />
• Registrar em log mensagens de erro com detalhes.<br />
• Identificar as exceções.</p>
<p>Não deixar vazar informações para o cliente</p>
<p>No caso de falha, não exponha informações que poderiam resultar na divulgação de informações. Por exemplo, não exponha detalhes do rastreamento de pilha que incluam nomes de função e números de linha no caso de compilações para depuração (que não devem ser utilizadas em servidores de produção). Em vez disso, retorne mensagens de erro genéricas ao cliente.</p>
<p>Registrar em log mensagens de erro com detalhes<br />
Envie mensagens de erro detalhadas ao log de erros. Envie o mínimo de informações ao usuário do serviço ou do aplicativo, como uma mensagem de erro genérica e uma identificação personalizada do log de erro que possa ser então mapeada até a mensagem detalhada nos logs de eventos. Certifique–se de não registrar no log senhas nem outros dados confidenciais.</p>
<p>Identificar as exceções</p>
<p>Utilize um tratamento de exceções estruturado e identifique condições de exceção. Isso evita que o aplicativo fique com um estado inconsistente que pode resulta na divulgação de informações. Isso também pode ajudar a proteger o aplicativo contra ataques de negação de serviço. Decida como propagar as exceções internamente no aplicativo e dê atenção especial a o que ocorre no limite do aplicativo.</p>
<p>Auditoria e log</p>
<p>Você deve executar atividades de auditoria e log nas camadas do aplicativo. Utilizando logs, é possível detectar atividades suspeitas. Elas freqüentemente indicam com antecedência um ataque devastador e os logs ajudam a resolver o risco de recusa quando os usuários recusam suas ações. Os arquivos de log podem ser exigidos em processos judiciais para provarem a transgressão dos acusados. Geralmente, o processo de auditoria é considerado mais autorizado se as auditorias forem geradas no momento exato em que um recurso é acessado e pelas mesmas rotinas que acessam o recurso.</p>
<p>As práticas a seguir aumentam a segurança do aplicativo da Web:</p>
<p>• Auditar e registrar em log o acesso entre as camadas do aplicativo.<br />
• Considerar o fluxo de identificação.<br />
• Registrar em log eventos importantes.<br />
• Proteger arquivos de log.<br />
• Fazer backup dos arquivos de log e os analisar regularmente.</p>
<p>Auditar e registrar em log o acesso entre as camadas do aplicativo</p>
<p>Audite e registre em log o acesso entre as camadas do aplicativo no caso de não–repúdio. Use uma combinação de log no nível do aplicativo e recursos de auditoria da plataforma, como a auditoria do Windows, do IIS e do SQL Server.</p>
<p>Considerar o fluxo de identificação</p>
<p>Considere como o aplicativo transmitirá a identificação do chamador entre as várias camadas do aplicativo. Você tem duas opções básicas. Você pode transmitir a identificação do chamador no nível do sistema operacional utilizando a delegação do protocolo Kerberos. Isso permite o uso da auditoria no nível do sistema operacional. A desvantagem dessa abordagem é que ela afeta a escalabilidade, pois significa que não pode haver nenhum pool de conexão do banco de dados ativo na camada intermediária. Como alternativa, você pode transmitir a identificação do chamador no nível do aplicativo e utilizar identificações confiáveis para acessar recursos de back–end. Com essa abordagem, você tem que confiar na camada intermediária e existe um risco de recuso. Você deve gerar faixas de auditoria na camada intermediária que possam ser correlacionadas às faixas de auditoria de back–end. Para isso, você deve certificar–se de que os relógios dos servidores estão sincronizados, embora o Microsoft Windows 2000 e o Active Directory façam isso por você.</p>
<p>Registrar em log eventos importantes</p>
<p>Os tipos de eventos que devem ser registrados incluem tentativas de logon bem–sucedidas ou não, modificação de dados, recuperação de dados, comunicações de rede e funções administrativas, como ativar ou desativar o registro em log. Os logs devem inclui a hora do evento, a localização do evento incluindo o nome da máquina, a identificação do usuário atual, a identificação do processo que iniciou o evento e uma descrição detalhada do evento.</p>
<p>Proteger arquivos de log</p>
<p>Proteja os arquivos de log utilizando as listas de controle de acesso do Windows e restrinja o acesso a eles. Isso dificulta para os invasores a alteração dos arquivos de log para encobrir seus rastros. Reduza o número de pessoas que podem manipular os arquivos de log. Autorize acesso somente a contas altamente confiáveis, como as dos administradores.</p>
<p>Fazer backup dos arquivos de log e os analisar regularmente</p>
<p>Não há porquê criar um log se os arquivos de log nunca são analisados. Os arquivos de log devem ser removidos dos servidores de produção regularmente. A freqüência de remoção depende do nível de atividade do aplicativo. O projeto deve considerar o modo como os arquivos de log serão recuperados e movidos para servidores offline para análise. Quaisquer protocolos e portas adicionais abertos no servidor Web com essa finalidade devem ser fechados de forma segura.</p>
<p>Diretrizes de projeto do aplicativo</p>
<p>Categoria Diretrizes</p>
<p>Validação da entrada Não confiar na entrada; considerar a validação da entrada centralizada.</p>
<p>Não confiar na validação do lado do cliente. Ter cuidado com questões de canonização. Restringir, rejeitar e limpar a entrada. Validar dados por tipo, tamanho, formato e intervalo.</p>
<p>Autenticação Dividir o site nas áreas de acesso anônimo, identificado e autenticado. Utilizar senhas de alta segurança. Oferecer suporte para senhas com validade e desativação de conta. Não armazenar credenciais (utilizar hashes unidirecionais com valores falsos). Criptografar os canais de comunicação para proteger os identificadores de autenticação.<br />
Transmitir cookies de autenticação de formulários somente por conexões HTTPS.</p>
<p>Autorização Utilizar contas com a menor quantidade de privilégios. Considerar a granulação da autorização.</p>
<p>Aplicar a separação de privilégios. Restringir o acesso do usuário a recursos no nível do sistema.</p>
<p>Gerenciamento de configuração Utilizar contas com processos e serviços com a menor quantidade de privilégios. Não armazenar credenciais em texto sem formatação. Utilizar autenticação e autorização rígidas nas interfaces administrativas.</p>
<p>Não utilizar a LSA. Proteger o canal de comunicação para administração remota. Evitar armazenar dados confidenciais no espaço da Web.</p>
<p>Dados confidenciais Evitar armazenar segredos. Criptografar dados confidencias transmitidos. Proteger o canal de comunicação. Fornecer controles de acesso rígidos aos armazenamentos de dados confidenciais. Não armazenar dados confidenciais em cookies persistentes. Não transmitir dados confidenciais utilizando o protocolo HTTP–GET.</p>
<p>Gerenciamento de sessão Limitar a duração da sessão. Proteger o canal. Criptografar o conteúdo dos cookies de autenticação. Proteger o estado da sessão contra acesso não autorizado.</p>
<p>Criptografia Não desenvolver sua própria criptografia. Utilizar recursos da plataforma testados. Manter dados descriptografados próximos do algoritmo. Utilizar o algoritmo e o tamanho de chave corretos. Evitar o gerenciamento de chaves (utilizar DPAPI). Mudar as chaves periodicamente. Armazenar chaves em um local restrito.</p>
<p>Manipulação de parâmetros Criptografar o estado de cookies confidenciais. Não confiar nos campos que o cliente pode manipular (seqüências de caracteres de consulta, campos de formulário, cookies ou cabeçalhos HTTP). Validar todos os<br />
valores enviados a partir do cliente.</p>
<p>Gerenciamento de exceções Utilizar um tratamento de exceções estruturado. Não revelar detalhes confidenciais da implementação do aplicativo. Não registrar em log dados particulares, como senhas. Considerar uma estrutura de gerenciamento de exceções centralizado.</p>
<p>Auditoria e log Identificar comportamento mal–intencionado. Saber como é um tráfego normal. Executar atividades de auditoria e log em todas as camadas do aplicativo. Proteger o acesso aos arquivos de log. Fazer backup dos arquivos de log e os analisar regularmente.</p>
<p>A segurança deve difundir–se por todos os estágios do ciclo de desenvolvimento do produto e deve ser um dos pontos principais do projeto do aplicativo. Preste atenção, especialmente, ao projeto de uma estratégia rígida de autenticação e autorização. Lembre–se também de que a maioria dos ataques no nível do aplicativo utiliza dados com entrada mal–intencionada e uma validação fraca da entrada do aplicativo. As instruções apresentadas neste módulo ajudarão você com esses e outros aspectos complicados referentes ao projeto e à criação de aplicativos seguros.</p>
<p>fonte:msdn,MXStudio </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/dreamweaver/diretrizes-de-projeto-proteger-aplicativos-web/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Classe para navegar em um recordset paginado</title>
		<link>http://www.mxstudio.com.br/tecnologia/geral/classe-para-navegar-em-um-recordset-paginado/</link>
		<comments>http://www.mxstudio.com.br/tecnologia/geral/classe-para-navegar-em-um-recordset-paginado/#comments</comments>
		<pubDate>Sat, 13 Mar 2010 18:35:47 +0000</pubDate>
		<dc:creator>X@nBuRzUm</dc:creator>
				<category><![CDATA[ASP.net]]></category>
		<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Dreamweaver]]></category>
		<category><![CDATA[Geral]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Usabilidade]]></category>

		<guid isPermaLink="false">http://www.mxstudio.com.br/?p=3327</guid>
		<description><![CDATA[A classe NaviPage oferece propriedades e métodos que são utilizados para construir o menu de navegação. Por exemplo, se o seu recordset é de 5 páginas, uma navegação NaviPage como esta será exibida: [Anterior] [1] 2 3 4 5 [Próxima] As propriedades e os métodos propostos neste código são: Propriedades: CurrentPage Opcional. Obtém ou define [...]]]></description>
			<content:encoded><![CDATA[<p>A classe NaviPage oferece propriedades e métodos que são utilizados para construir o menu de navegação. Por exemplo, se o seu recordset é de 5 páginas, uma navegação NaviPage como esta será exibida:</p>
<p>[Anterior] [1] 2 3 4 5 [Próxima]</p>
<p>As propriedades e os métodos propostos neste código são:</p>
<p><strong><em>Propriedades: </em></strong></p>
<p><strong>CurrentPage </strong></p>
<p>Opcional. Obtém ou define a página atual.</p>
<p><strong>PageCount </strong></p>
<p>Necessário. O número de páginas para ser exibido.</p>
<p><strong>QueryString </strong></p>
<p>Opcional. Uma QueryString é necessária para ser transmitida entre as páginas. Querystrings devem ter este formato:</p>
<p><strong>PageUrl </strong></p>
<p>Necessário. A URL onde todos os links de navegação são exibidos.</p>
<p><strong>LinkStyle </strong></p>
<p>Opcional. Estilo CSS, código para as tags âncora de links criados pela classe.</p>
<p><strong>SelectedPageStyle </strong></p>
<p>Opcional. Estilo CSS para a página selecionada.</p>
<p><strong>Width</strong></p>
<p>Opcional. O numérico ou percentual de toda a largura do menu. Exemplos de valores válidos são &#8220;100%&#8221;, 500, 563, &#8220;55%&#8221;, etc.</p>
<p><em><strong>Métodos: </strong></em></p>
<p><strong>RenderMenu </strong></p>
<p>Necessário.Página gerada, menu de navegação do browser.</p>
<p>Este método deve ser chamado depois que todas as propriedades foram ajustadas.</p>
<p>sintaxe:</p>
<p><strong>CurrentPage </strong></p>
<p>Opcional. Obtém ou define a página atual.</p>
<p><strong>PageCount </strong></p>
<p>Necessário. O número de páginas para ser exibido.</p>
<p><strong>QueryString </strong></p>
<p>Opcional. Uma QueryString é necessária para ser transmitida entre as páginas. Querystrings devem ter este formato:</p>
<blockquote><p><code><span>Dim</span><span> qs qs </span><span>=</span><span> qs </span><span>&amp;</span><span> </span><span>"&amp; s ="</span><span> </span><span>&amp;</span><span> </span><span>Server</span><span>.</span><span>UrlEncode</span><span> </span><span>(</span><span>request </span><span>(</span><span> </span><span>"s"</span><span>))</span><span><br />
qs </span><span>=</span><span> qs </span><span>&amp;</span><span> </span><span>"&amp; t ="</span><span> </span><span>&amp;</span><span> </span><span>Server</span><span>.</span><span>UrlEncode</span><span> </span><span>(</span><span>request </span><span>(</span><span> </span><span>"t"</span><span>))</span><span><br />
qs </span><span>=</span><span> qs </span><span>&amp;</span><span> </span><span>"&amp; u ="</span><span> </span><span>&amp;</span><span> </span><span>Server</span><span>.</span><span>UrlEncode</span><span> </span><span>(</span><span>request </span><span>(</span><span> </span><span>"u"</span><span>))</span><span><br />
</span><span>Obj</span><span>.</span><span>Querystring</span><span> </span><span>=</span><span> qs </span></code></p></blockquote>
<p><strong>PageUrl </strong></p>
<p>Necessário. A URL onde todos os links de navegação são exibidos.</p>
<p><strong>LinkStyle </strong></p>
<p>Opcional. Estilo CSS, código para as tags âncora de links criados pela classe.</p>
<p><strong>SelectedPageStyle </strong></p>
<p>Opcional. Estilo CSS para a página selecionada.</p>
<p><strong>Width</strong></p>
<p>Opcional. O numérico ou percentual de toda a largura do menu. Exemplos de valores válidos são &#8220;100%&#8221;, 500, 563, &#8220;55%&#8221;, etc.</p>
<p><em><strong>Métodos: </strong></em></p>
<p><strong>RenderMenu </strong></p>
<p>Necessário.Página gerada, menu de navegação do browser.</p>
<p>Este método deve ser chamado depois que todas as propriedades foram ajustadas.</p>
<p>sintaxe:</p>
<blockquote><p><code><span><code><span>Set</span><span> </span><span>object</span><span> </span><span>=</span><span> </span><span>New</span><span> </span><span>NaviPage</span></code></span></code></p></blockquote>
<p><code><span>exemplo:</span></code></p>
<blockquote><p><code><span><code><span>Dim</span><span> p</span><span>,</span><span> qs</span><span>´</span><span>construir </span><span>QueryString</span><span> para passar de p</span><span>á</span><span>gina em p</span><span>á</span><span>ginaqs </span><span>=</span><span> </span>""<span><br />
qs </span><span>=</span><span> qs </span><span>&amp;</span><span> </span><span>"&amp;s="</span><span> </span><span>&amp;</span><span> </span><span>Server</span><span>.</span><span>UrlEncode</span><span>(</span><span>request</span><span>(</span><span>"s"</span><span>))</span><span><br />
qs </span><span>=</span><span> qs </span><span>&amp;</span><span> </span><span>"&amp;t="</span><span> </span><span>&amp;</span><span> </span><span>Server</span><span>.</span><span>UrlEncode</span><span>(</span><span>request</span><span>(</span><span>"t"</span><span>))</span><span><br />
qs </span><span>=</span><span> qs </span><span>&amp;</span><span> </span><span>"&amp;u="</span><span> </span><span>&amp;</span><span> </span><span>Server</span><span>.</span><span>UrlEncode</span><span>(</span><span>request</span><span>(</span><span>"u"</span><span>))´</span><span>cria nav menu<br />
</span><span>Set</span><span> p </span><span>=</span><span> </span><span>New</span><span> </span><span>NaviPage</span><span>´</span><span>set</span><span> widthp</span><span>.</span><span>Width</span><span> </span><span>=</span><span> </span><span>"100%"</span><span>´</span><span>conjunto estilo da p</span><span>á</span><span>gina </span><span>Links</span><span><br />
p</span><span>.</span><span>LinkStyle</span><span> </span><span>=</span><span> </span><span>"font-family:helvetica;font-size:12pt;"</span><span><br />
</span><span>´</span><span>estilo de p</span><span>á</span><span>gina selecionada<br />
p</span><span>.</span><span>SelectedPageStyle</span><span> </span><span>=</span><span> </span><span>"font-family:helvetica;font-size:12pt;font-weight:bold;"</span><span><br />
</span><span>´</span><span>n</span><span>ú</span><span>mero total de p</span><span>á</span><span>ginas </span><span>"paginável"</span><span> recordsetp</span><span>.</span><span>PageCount</span><span> </span><span>=</span><span> </span><span>3</span><span><br />
</span><span>´</span><span>conjunto da </span><span>QueryString</span><span> usada pelo recordset para gerar filasp</span><span>.</span><span>QueryString</span><span> </span><span>=</span><span> qs<br />
</span><span>´</span><span>definir a p</span><span>á</span><span>gina onde cada p</span><span>á</span><span>gina link deve apontar<br />
p</span><span>.</span><span>PageUrl</span><span> </span><span>=</span><span> </span><span>Request</span><span>.</span><span>ServerVariables</span><span>(</span><span>"SCRIPT_NAME"</span><span>)</span><span><br />
</span><span>´</span><span>response</span><span>.</span><span>write o menu para o browserp</span><span>.</span><span>RenderMenu</span><span>´</span><span>liberar  mem</span><span>ó</span><span>ria<br />
</span><span>Set</span><span> p </span><span>=</span><span> </span><span>Nothing</span><span>´</span><span>impress</span><span>õ</span><span>es</span><span>:</span><span> </span><span>[</span><span>1</span><span>]</span><span> </span><span>2</span><span> </span><span>3</span><span> </span><span>[</span><span>Pr</span><span>ó</span><span>xima</span><span>&gt;&gt;]</span><span><br />
</span><span>´</span><span>Isso</span><span> </span><span>é</span><span> exatamente a mesma classe qeu uso para fazer a pagina</span><span>çã</span><span>o </span></code></span></code></p></blockquote>
<p><code><span>código:</span></code></p>
<p>Dim p, qs</p>
<p> </p>
<p>‘construir QueryString para passar de página em página</p>
<p>qs = &#8220;&#8221;</p>
<p>qs = qs &amp; &#8220;&amp;s=&#8221; &amp; Server.UrlEncode(request(&#8220;s&#8221;))</p>
<p>qs = qs &amp; &#8220;&amp;t=&#8221; &amp; Server.UrlEncode(request(&#8220;t&#8221;))</p>
<p>qs = qs &amp; &#8220;&amp;u=&#8221; &amp; Server.UrlEncode(request(&#8220;u&#8221;))</p>
<p> </p>
<p>&#8216;cria nav menu</p>
<p>Set p = New NaviPage</p>
<p> </p>
<p>&#8216;set width</p>
<p>p.Width = &#8220;100%&#8221;</p>
<p> </p>
<p>‘conjunto estilo da página Links</p>
<p>p.LinkStyle = &#8220;font-family:helvetica;font-size:12pt;&#8221;</p>
<p> </p>
<p>‘estilo de página selecionada</p>
<p>p.SelectedPageStyle = &#8220;font-family:helvetica;font-size:12pt;font-weight:bold;&#8221;</p>
<p> </p>
<p>‘número total de páginas “paginável” recordset</p>
<p>p.PageCount = 3</p>
<p> </p>
<p>‘conjunto da QueryString usada pelo recordset para gerar filas</p>
<p>p.QueryString = qs</p>
<p> </p>
<p>&#8216;definir a página onde cada página link deve apontar</p>
<p>p.PageUrl = Request.ServerVariables(&#8220;SCRIPT_NAME&#8221;)</p>
<p> </p>
<p>&#8216;response.write o menu para o browser</p>
<p>p.RenderMenu</p>
<p> </p>
<p>&#8216;liberar  memória</p>
<p>Set p = Nothing</p>
<p> </p>
<p> </p>
<p>‘impressões: [1] 2 3 [Próxima&gt;&gt;]</p>
<p>&#8216;Isso é exatamente a mesma classe que uso para fazer a paginação</p>
<p> </p>
<p><strong>código:</strong></p>
<p> </p>
<blockquote><p>&lt;%</p>
<p>Class NaviPage</p>
<p>       Private Sub Class_Initialize()</p>
<p>             CurrentPage = 1</p>
<p>             PageCount = 1</p>
<p>             QueryString = &#8220;&#8221;</p>
<p>             PageUrl = Request.ServerVariables(&#8220;SCRIPT_NAME&#8221;)</p>
<p>             LinkStyle = &#8220;font-family:helvetica;font-size:10pt;&#8221;</p>
<p>             SelectedPageStyle = &#8220;font-family:helvetica;font-size:12pt;font-weight:bold;&#8221;</p>
<p>             Width = &#8220;100%&#8221;</p>
<p>       End Sub</p>
<p> </p>
<p>       Public Property Get CurrentPage</p>
<p>             dim p</p>
<p> </p>
<p>             on error resume next</p>
<p>             p = clng(Request(&#8220;Page&#8221;))</p>
<p>             if err.number &lt;&gt; 0 then p = 1</p>
<p>             if p &lt; 1 then p = 1</p>
<p> </p>
<p>             CurrentPage = p</p>
<p>       End Property</p>
<p> </p>
<p>       Public Property Let CurrentPage(byval page)</p>
<p>             CurrentPage = page</p>
<p>       End Property</p>
<p> </p>
<p>       Public PageCount</p>
<p> </p>
<p>       Public QueryString</p>
<p> </p>
<p>       Public PageUrl</p>
<p> </p>
<p>       Public LinkStyle</p>
<p> </p>
<p>       Public SelectedPageStyle</p>
<p> </p>
<p>       Public Width</p>
<p> </p>
<p>       Public Sub RenderMenu()</p>
<p>             Dim strTempNavL, strTempNavR, strTempNavC, iEverySinglePage</p>
<p> </p>
<p>             &#8216;input validação</p>
<p>             if clng(PageCount) &lt; 1 Then</p>
<p>                    PageCount = 1</p>
<p>             end if</p>
<p> </p>
<p>             If clng(CurrentPage) &gt; clng(PageCount) Then</p>
<p>                    CurrentPage = PageCount</p>
<p>             End If</p>
<p> </p>
<p>             If clng(CurrentPage) &lt; 1 Then</p>
<p>                    CurrentPage = 1</p>
<p>             End If</p>
<p> </p>
<p>             if Len(Trim(QueryString)) &gt; 0 Then</p>
<p>                    if Left(QueryString, 1) = &#8220;&amp;&#8221; Then</p>
<p>                           QueryString = Mid(QueryString, 2)</p>
<p>                    End If</p>
<p>             End If</p>
<p> </p>
<p> </p>
<p>             &#8216;criação menu</p>
<p>             If clng(CurrentPage) &lt;&gt; 1 Then</p>
<p>                    strTempNavL = strTempNavL &amp; &#8220;&lt;a href=&#8221;"&#8221; &amp; PageUrl &amp; &#8220;?page=&#8221; &amp; _</p>
<p>                           clng(CurrentPage) &#8211; 1 &amp; &#8220;&amp;&#8221; &amp; QueryString &amp; _</p>
<p>                           &#8220;&#8221;" style=&#8221;"&#8221; &amp; LinkStyle &amp; &#8220;&#8221;"&gt;[&amp;lt;&amp;lt;&amp;nbsp;back]&lt;/a&gt;&#8221;</p>
<p>             else</p>
<p>                    strTempNavL = strTempNavL &amp; &#8220;&amp;nbsp;&#8221;</p>
<p>             End If</p>
<p>             If clng(CurrentPage) &lt; clng(PageCount) Then</p>
<p>                    strTempNavR = strTempNavR &amp; &#8220;&lt;a href=&#8221;"&#8221; &amp; PageUrl &amp; &#8220;?page=&#8221; &amp; _</p>
<p>                           clng(CurrentPage) + 1 &amp; &#8220;&amp;&#8221; &amp; QueryString &amp; _</p>
<p>                           &#8220;&#8221;" style=&#8221;"&#8221; &amp; LinkStyle &amp; &#8220;&#8221;"&gt;[next&amp;nbsp;&amp;gt;&amp;gt;]&lt;/a&gt;&#8221;</p>
<p>             else</p>
<p>                    strTempNavR = strTempNavR &amp; &#8220;&amp;nbsp;&#8221;</p>
<p>             End If</p>
<p>             iEverySinglePage = 1</p>
<p>             Do Until iEverySinglePage &gt; PageCount</p>
<p>                    if iEverySinglePage = clng(CurrentPage) then</p>
<p>                           strTempNavC = strTempNavC &amp; &#8220;[&lt;span style=""" &amp; _</p>
<p>                                  SelectedPageStyle &amp; """&gt;" &amp; iEverySinglePage &amp; _</p>
<p>                                  "&lt;/span&gt;]&amp;nbsp;&amp;nbsp;&#8221;</p>
<p>                    else</p>
<p>                           strTempNavC = strTempNavC &amp; &#8220;&lt;a style=&#8221;"&#8221; &amp; LinkStyle &amp; _</p>
<p>                                  &#8220;&#8221;" href=&#8221;"&#8221; &amp; PageUrl &amp; &#8220;?page=&#8221; &amp; _</p>
<p>                                  iEverySinglePage &amp; &#8220;&amp;&#8221; &amp; QueryString &amp; &#8220;&#8221;"&gt;&#8221; &amp; _</p>
<p>                                  iEverySinglePage &amp; &#8220;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&#8221;</p>
<p>                    end if</p>
<p>                    iEverySinglePage = iEverySinglePage + 1</p>
<p>             LOOP</p>
<p> </p>
<p> </p>
<p>             &#8216;render nav menu</p>
<p>             response.write &#8220;&lt;table width=&#8221;"&#8221; &amp; width &amp; &#8220;&#8221;"&gt;&#8221; &amp; vbCrLf</p>
<p>             response.write &#8220;&lt;tr&gt;&#8221; &amp; vbCrLf</p>
<p>             response.write &#8220;&lt;td valign=top align=left width=&#8221;"20%&#8221;"&gt;&#8221; &amp; vbCrLf</p>
<p>             response.write strTempNavL &amp; vbCrLf</p>
<p>             response.write &#8220;&lt;/td&gt;&#8221; &amp; vbCrLf</p>
<p>             response.write &#8220;&lt;td valign=top align=center width=&#8221;"60%&#8221;"&gt;&#8221; &amp; vbCrLf</p>
<p>             response.write strTempNavC &amp; vbCrLf</p>
<p>             response.write &#8220;&lt;/td&gt;&#8221; &amp; vbCrLf</p>
<p>             response.write &#8220;&lt;td valign=top align=right width=&#8221;"20%&#8221;"&gt;&#8221; &amp; vbCrLf</p>
<p>             response.write strTempNavR &amp; vbCrLf</p>
<p>             response.write &#8220;&lt;/td&gt;&#8221; &amp; vbCrLf</p>
<p>             response.write &#8220;&lt;/tr&gt;&#8221; &amp; vbCrLf</p>
<p>              response.write &#8220;&lt;/table&gt;&#8221; &amp; vbCrLf</p>
<p>       End Sub</p>
<p>End Class</p>
<p>%&gt;</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/tecnologia/geral/classe-para-navegar-em-um-recordset-paginado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

