IEOptLib – Internet Explorer Options Library

Fala meu povo!! Criei uma lib em C# para manipular as opções de internet do Windows. É possível modificar as zonas de segurança ou criar um nível personalizado. É bem útil para utilizar em conjunto com o componente WebBrowser (System.Windows.Forms.WebBrowser).

Basicamente a classe modifica as chaves do registro HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\[0-4], onde [0-4] é zona que deseja modificar.

  • 0 – Meu computador
  • 1 – Intranet local
  • 2 – Sites confiáveis
  • 3 – Internet
  • 4 – Sites restritos

Seguindo a regra acima, HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3 representa as opções da zona de internet. Cada valor DWORD dentro dessa chave, representa um item das opções de internet.

Usar a lib é muito fácil, basta fazer a chamada ao método estático que representa a função que você deseja modificar e passar a zona e o novo valor que será atribuído.

InternetOptions.SetSecurityLevel(InternetOptions.INTERNET, InternetOptions.MEDIUM_LOW_LEVEL);

O exemplo acima altera o nível de segurança da zona de internet para médio-baixo.

Como a maioria das opções requer que o Internet Explorer seja reiniciado, é uma boa prática chamar o método antes de renderizar o componente WebBrowser (se esse for o seu foco). faça as chamadas na classe Program, antes de inicializar o Main Form.

O projeto encontra-se no source forge (http://sourceforge.net/projects/ieoptlib/) e é GPL.
Usei como referência um artigo da Microsoft (http://support.microsoft.com/kb/182569/pt-br) que explica muito bem como funciona a gestão das opções de internet.

Espero ter ajudado
Abrassss

Windows Firewall e conexões remotas no SQL Server 2008

Salve, salve!! Depois de um intervalo sem postar nada, deixo aqui uma dica rápida para liberar conexões remotas no SQL Server 2008. Crie um arquivo bat com o conteúdo:

@echo =========  SQL Server Ports  ===================
@echo Enabling SQLServer default instance port 1433
netsh firewall set portopening TCP 1433 "SQLServer"
@echo Enabling Dedicated Admin Connection port 1434
netsh firewall set portopening TCP 1434 "SQL Admin Connection"
@echo Enabling conventional SQL Server Service Broker port 4022
netsh firewall set portopening TCP 4022 "SQL Service Broker"
@echo Enabling Transact-SQL Debugger/RPC port 135
netsh firewall set portopening TCP 135 "SQL Debugger/RPC"
@echo =========  Analysis Services Ports  ==============
@echo Enabling SSAS Default Instance port 2383
netsh firewall set portopening TCP 2383 "Analysis Services"
@echo Enabling SQL Server Browser Service port 2382
netsh firewall set portopening TCP 2382 "SQL Browser"
@echo =========  Misc Applications  ==============
@echo Enabling HTTP port 80
netsh firewall set portopening TCP 80 "HTTP"
@echo Enabling SSL port 443
netsh firewall set portopening TCP 443 "SSL"
@echo Enabling port for SQL Server Browser Service's 'Browse' Button
netsh firewall set portopening UDP 1434 "SQL Browser"
@echo Allowing multicast broadcast response on UDP (Browser Service Enumerations OK)
netsh firewall set multicastbroadcastresponse ENABLE

Execute o bat e seja feliz! Abraços

Editado
Tinha esquecido de colocar o link de onde vem o script original: http://support.microsoft.com/kb/968872

Evitando SQL Injection com PHP

SQL injection é uma técnica de introduzir (injetar) instruções SQL em entradas de usuário – entenda entradas de usuário como qualquer variável que possa ser manipulada pelo mesmo como variáveis POST e GET.

Como funciona na prática

$query = " SELECT * FROM USUARIOS WHERE login = ";
$query.= " '{$_POST['login']}' AND senha = '{$_POST['senha']}' ";

$res = mysql_query($query);

if( mysql_num_rows($res) ) {
    echo "Login efetuado com sucesso!";
}else{
    echo "Login e/ou senha incorreto(s)";
}

No código acima, caso o usuário informa no campo login a entrada: blablabla’ or 0=0 — e qualquer valor no campo senha o resultado da query será:
SELECT * FROM USUARIOS WHERE login = ‘blablabla’ or 0=0 –‘ AND senha = ‘senhainvalida’;
A mágica está no trecho ‘ or 0=0 — que faz com que seja listado todo conteúdo da tabela USUARIOS já que a consulta busca os usuários cujo o login seja ‘blablabla’ ou que zero seja igual a zero. Zero sempre será igual a zero e assim todo conteúdo é retornado. Mas e a senha? A senha é ignorada já que após a comparação é adicionado o caracter de comentário e tudo a partir dali é ignorado :).

Outro problema nesse código é a forma como o usuário é válidado.

if( mysql_num_rows($res) ) {
    echo "Login efetuado com sucesso!";
}else{
    echo "Login e/ou senha incorreto(s)";
}

A instrução checa apenas se alguma linha foi retornada na consulta. Como vimos antes, todo conteúdo da tabela USUARIOS é retornado e o primeiro usuário retornado na consulta é que será o felizardo a contemplar o invasor com seus dados.

Proteger-se com mysql_real_scape_string() e addslashes()

Essa é a forma mais básica e simples de contornar o problema. Basta chamar uma das duas funções para “escapar” a entrada do usuário.

$_POST['login'] = addslashes($_POST['login']);
$_POST['senha'] = addslashes($_POST['senha']);

$query = " SELECT * FROM USUARIOS WHERE login = '{$_POST['login']}'";
$query.= " AND senha = '{$_POST['senha']}' ";

Ou

$_POST['login'] = mysql_real_escape_string($_POST['login']);
$_POST['senha'] = mysql_real_escape_string($_POST['senha']);

$query = " SELECT * FROM USUARIOS WHERE login = '{$_POST['login']}'";
$query.= " AND senha = '{$_POST['senha']}' ";

As funções irão adicionar um slash (“\”) na aspa simples.
SELECT * FROM USUARIOS WHERE login = ‘blablabla\’ or 0=0 –‘ AND senha = ‘senhainvalida’;
Todo conteúdo entre aspa simples será interpretado como esperado, como um login de usuário.
Se magic_quotes_gpc estiver ativo no PHP (que é configuração padrão) o escape de cookies, post e get é feito automáticamente.

Usando Prepared Statement

Prepared statement automaticamente faz o escape nos valores de entrada e ajustam corretamente o tipo de dado.

$conexao = new mysqli('localhost','usuario','senha','banco');

$stm = $conexao->prepare("SELECT * FROM USUARIOS WHERE login = ? AND senha = ?");
$stm->bind_param("ss", $_POST['login'], $_POST['senha']);
$stm->execute();

if( $stm->affected_rows ){
    echo "Login efetuado com sucesso!";
}else{
    echo "Login e/ou senha incorreto(s)";
}
$stm->close();

Boas práticas

  • O usuário de acesso ao banco deve ter seu acesso limitado em nível de acesso e à objetos que ele realmente precisa.
  • Use senhas criptografadas
  • Não confie em nenhuma entrada de usuário
  • Evite validar o usuário através do número de linhas que retorna da consulta

Evite o código abaixo:

if( $stm->affected_rows ) {
    echo "Usuário autenticado com sucesso!";
}

Use a forma a seguir:

$conexao = new mysqli('localhost','usuario','senha','banco');

$stm = $conexao->prepare("SELECT senha FROM USUARIOS WHERE login = ?");
$stm->bind_param("s", $_POST['login']);
$stm->execute();

$senha = "";
$stm->bind_result($senha);
if( $stm->fetch() ){
   if( $senha == crypt($_POST['senha'],"td") ){
       echo "Usuário autenticado com sucesso!";
       exit();
   }
}
echo "Usuário e/ou senha inválidos";

$stm->close();

Até o próximo post