Quer lembrar do passado da internet?
Quer recuperar a idéia de um site que já mudou totalmente?
- Da um look no UOL em 1996
- Matrix em 1996 também era útil pro pessoal de Floripa
- O Submarino em 1999 eu não conhecia
Quer lembrar do passado da internet?
Quer recuperar a idéia de um site que já mudou totalmente?
Desde 1999 que eu mexo diariamente com o Linux, mas para mim sempre foi um sistema operacional pra servidor… nunca tinha usado ele de verdade como desktop, e a um tempinho comecei a usar o Ubuntu para começar a me desvincular no Weca. Esses dias precisei configurar um roteador e me deparei com um problema… Cadê o HyperTerminal nesta naba?
Vai a dica: GtkTerm muito bom, boa sorte!
Uma boa técnica de SEO(Search Engine Optiomation) é a utilização de URLs amigáveis, além de otimizar sua posição em mecanismos de busca ele fica muito mais agradável para o usuário, é mais fácil entender onde você está identificando a URL: www.seusite.com.br/secao/nome_da_secao do que acessando o site www.seusite.com.br?mod=section§ion_id=129805 , não acha?
Para gerar regras é preciso conhecer expressões regulares, caso você não seja um expert no assunto, existe um gerador de regras para URL amigáveis no apache pode ser localizado em:
http://www.webmaster-toolkit.com/mod_rewrite-rewriterule-generator.shtml
Coloque estas regras no .htaccess de seu diretório.
No código-fonte da sua aplicação você precisará só mudar os links que apontavam para a URL mais confusa para este novo formado de url amigável e Bingo!
Agora você tem URL amigáveis sem mexer quase nenhuma linha em seu código-fonte.
Abraços,
FernandoCosta
Está aqui um vídeo para saber como escrever!
Aprendi a fazer malabarismo, e vendas… será que consigo?
Um cliente me pediu um desenvolvimento de aplicações para SmartPhones e me deu como opção um BlackBerry e o Nokia E61, dois excelentes aparelhos, os dois são práticos e como o público alvo da aplicação é eram pessoa com mais de 40 anos, e por isso eu não estava certo se eles iriam utilizar, mas aparentemente esta sendo muito bom…
Algumas características dos aparelhos:
BlackBerry:
- o gateway de conexão com a internet é a própria RIM (não me agradou saber disso);
- o “mouse” é um botão de rolagem, a princípio é a coisa mais estranha do mundo parece que você não vai se acostumar, mas com pouco tempo de uso(pouco mesmo), você acaba se adaptando e ele se torna muito prático e você consegue usar quase tudo com uma única mão sem dificuldade;
- o navegador eu achei muito ruim, ele não trabalhava direito com JavaScript, não aceitava iframe, etc. parece ser bem limitado;
Nokia E61:
- Sistema operacional: Symbian (é um linux);
- Navegador é o opera (é fantástico, aceita tudo, e a tela útil parece maior que o blackberry);
- Possui suporte a um telefone IP via protocolo SIP, este eu não consegui testar até hoje;
- Suporta Conexão Wifi e Bluetooth;
- Cartão Mini SD hotswap;
- Roda aplicações J2ME;
Para este cliente acabei reaproveitando um código e o sistema adaptado foi todo via WEB (PHP), mas com o incentivo de um professor (Jordan – www.webpack.com.br ) acabei fazendo alguma brincadeira com o J2ME.
Primeiro quero deixar bem claro que eu tenho aversão a JAVA, para mim não existe nada tão ruim… para o desenvolvedor pode ser a melhor coisa do mundo, mas para o usuário final é uma naba, trava mais que windows, é mais lento que 286, etc… não vem ao caso, mas tenho que concordar que se ele roda bem nos celulares podemos e devemos usar esta linguagem.
Para quem quer desenvolver aconselho utilizar o ECLIPSE com o Wireless Toolkit, partindo do ponto que você já instalaou estas ferramentas, siga os passos abaixo:
1- Abra o Eclipse;
2- Clique em “New”, “Other”, e selecione o item “JAVA MIDLET SUITE”;
3- Avance no wizard do novo projeto até o fim;
4- Com um clique no o botão direito sobre o novo projeto, clique em “New”, “Other”, e selecione o item “JAVA MIDLET” – Não é o midlet suite!!;
5- Avance no wizard do novo midlet até o fim;
6- Cole o teste abaixo, se for preciso mude o nome da classe “teste” para o nome da sua classe java midlet:
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;public class teste extends MIDlet implements CommandListener {
private Display theDisplay;
private TextBox txbMensagem;
private Ticker tick;
private Form form1;
private TextField texto1, texto2;
private Command autenticar;
private Alert alert;
public void teste() {
theDisplay = Display.getDisplay(this);
texto1 = new TextField(”Nome:”,””,20,TextField.ANY);
texto2 = new TextField(”Senha:”,””,15,TextField.PASSWORD);
form1 = new Form(”Autenticação”);
form1.append(texto1);
form1.append(texto2);
tick = new Ticker(”Mensagem rolando”);
form1.setTicker(tick);
autenticar = new Command(”OK”,Command.OK,0);
form1.addCommand(autenticar);
form1.setCommandListener(this);
theDisplay.setCurrent(form1);
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException { // TODO Auto-generated method stub
}
protected void pauseApp() { // TODO Auto-generated method stub
}
protected void startApp() throws MIDletStateChangeException {
this.teste();
}
public void commandAction(Command cmd, Displayable arg1) {
// TODO Auto-generated method stub
if (cmd == autenticar){
if(texto1.getString().equalsIgnoreCase("aaa")){
txbMensagem = new TextBox("autenticado","",15,0);
theDisplay.setCurrent(txbMensagem);
}else{
alert=new Alert("Atenção","nome inválido",null,null);
alert.setTimeout(5000);
tick=new Ticker("bé! senha errada");
alert.setTicker(tick);
theDisplay.setCurrent(alert);
}
}
}
}
Agora para rodar este código no emulador é só clicar com o botão direito em cima da classe e logo em seguida nos botões RUN AS e EMULATED J2ME MIDLET ….
Legal né? fácil? também achei… Para publicar o código em seu celular é simples siga os passos:
1- Botão direito em cima do projeto;
2- Clique em J2ME e “CREATE PACKAGE”;
3- Agora é só copiar o .JAD e o .JAR que estão dentro da pasta deployed, dentro da pasta do projeto no workspace do eclipse para dentro do celular e instalar
Abraços,
Fernando Costa
Trabalho a 7 anos para um cliente com um banco de dados já bem ultrapassado, poucas pessoas conhecem ele, é o ZIM, e por ser bem antigo ele não possui nenhuma feature nativa para conexão com linguagens WEB, sendo assim, eu com mais um colega de trabalho que é desenvolvedor ZIM desenvolvemos conector PHP 2 ZIM para poder trabalhar, mas este conector trabalha com algumas limitações que ocasionalmente demandam um pouco mais de tempo de desenvolvimento, mas em momento nenhum impedem o desenvolvimento….
Tentando melhorar esta plataforma desenvolvi um “driver ODBC para ZIM” que tirou todas as limitações de comando no banco (ele não tirou a limitação de telas, mas nem é preciso, afinal de contas quem vai trabalhar com as telas é o HTML com PHP), ficou a coisa mais linda do mundo mas antes de sair implementando com esta nova ferramenta resolvi fazer um benchmark de um algoritmo rodando no sistema antigo e no sistema novo para ajudar na escolha de implementação.
Legal… mas como fazer um benchmark de aplicações HTTP?
Pesquisando encontrei três ferramentas:
http://www.hpl.hp.com/personal/David_Mosberger/httperf.htmlhttp://www.xenoclast.org/autobench/A ferramenta chamada “ab” ou Apache HTTP server benchmarking tool, é uma simples e excelente ferramenta, consultando o manual(“man ab”) dá para incrementar o benchmark, mas basicamente dá para fazer assim:
ab -n [número de requisições] -c [número de conexões concorrentes] [http://site]
Exemplo:
[root@server ~]# ab -n 100 -c 5 http://www.google.com.br/This is ApacheBench,
Version 2.0.41-dev <$Revision: 1.141 $> apache-2.0
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 1998-2002 The Apache Software Foundation,
http://www.apache.org/Benchmarking www.google.com.br (be patient).....done
Server Software: gws
Server Hostname: www.google.com.br
Server Port: 80
Document Path: /
Document Length: 2976 bytes
Concurrency Level: 5
Time taken for tests: 8.54946 seconds
Complete requests: 100
Failed requests: 16
(Connect: 0, Length: 16, Exceptions: 0)
Write errors: 0
Total transferred: 328742 bytes
HTML transferred: 297542 bytes
Requests per second: 12.41 [#/sec] (mean)
Time per request: 402.747 [ms] (mean)
Time per request: 80.549 [ms] (mean, across all concurrent requests)
Transfer rate: 39.85 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 161 170 7.3 172 196
Processing: 190 224 59.2 207 613
Waiting: 166 199 58.9 183 589
Total: 352 394 59.7 380 774
Percentage of the requests served within a certain time (ms)
50% 380
66% 384
75% 395
80% 400
90% 417
95% 532
98% 680
99% 774
100% 774 (longest request)
[root@server ~]#
HTTPERF
httperf [--burst-length N] [--client I/N] [--close-with-
reset] [-d|--debug N] [--failure-status N] [-h|--help]
[--hog] [--http-version S] [--num-calls N] [--num-conns N]
[--port N] [--rate X] [--recv-buffer N] [--send-buffer N]
[--server S] [--think-timeout X] [--timeout X] [--uri S]
[-v|--verbose] [-V|--version] [--wlog y|n,F] [--wsess
N,N,X] [--wset N,X]
Manual: http://www.hpl.hp.com/research/linux/httperf/httperf-man.txt
AUTOBENCH
O autobench pode ser executado desta forma:
autobench --single_host --host1 www.test.com --uri1 /10K --quiet
--low_rate 20 --high_rate 200 --rate_step 20 --num_call 10
--num_conn 5000 --timeout 5 --file resultado.tsv
O resultado deste comuando vai ser o arquivo resultado.tsv:
---------------------- dem_req_rate req_rate_testhost con_rate_testhost min_rep_rate_testhost avg_rep_rate_testhost max_rep_rate_testhost stddev_rep_rate_testhost resp_time_testhost net_io_testhost errors_testhost 200 199.3 19.9 182.0 199.7 200.6 2.6 90.0 243.7 0 300 298.4 29.8 273.8 299.2 300.6 4.6 90.0 364.9 0 400 397.2 39.7 364.7 398.6 401.8 7.1 90.1 485.7 0 500 495.7 49.6 454.9 497.8 501.8 10.1 90.1 606.0 0 600 593.7 59.4 546.0 596.7 601.8 13.6 90.1 725.9 0 700 691.5 69.1 637.6 695.6 700.2 16.7 90.1 845.5 0 800 788.8 78.9 728.6 794.1 802.8 20.7 90.1 964.4 0 900 885.9 88.6 819.5 892.8 900.4 24.3 90.2 1083.2 0 1000 982.5 98.3 910.6 991.1 1008.2 28.8 90.2 1201.3 0 1100 1078.8 107.9 1001.7 1089.1 1101.2 32.8 90.2 1319.0 0 1200 1175.0 117.5 1092.6 1186.5 1200.4 38.0 90.5 1436.6 0 1300 1270.4 127.0 1182.5 1283.1 1312.3 44.9 90.6 1553.3 0 1400 1365.8 136.6 1273.3 1381.7 1401.1 47.8 91.4 1669.9 0 1500 1459.3 145.9 1341.9 1474.6 1505.1 65.1 100.8 1784.2 0 1600 1549.5 155.0 1414.9 1561.9 1607.7 72.6 124.2 1894.5 0 1700 1619.9 162.0 1443.8 1628.7 1726.8 96.6 212.4 1980.6 0 1800 1580.3 158.3 1478.3 1656.2 1757.1 100.2 282.6 1932.2 0.016025641025641 1900 1636.8 165.6 1481.0 1646.9 1759.6 118.4 300.1 2001.2 0.115314586283633 ---------------------- 2000 1641.5 173.0 1502.6 1659.1 1741.4 94.3 312.5 2006.9 0.53740779768177
Um exemplo de gráfico gerado pelo autobench:
Agora com o tempo de execução eu cheguei a conclusão que a nova versão precisa de melhorias na performance, pois a antiga ainda está ganhando
Abraços,
Fernando Costa
Fontes:
http://www.xenoclast.org/autobench/
http://www.hpl.hp.com/research/linux/httperf/
http://www.apache.org/
Por pedidos da diretoria de um cliente meu, fui obrigado a implementar no servidor de domínio(SAMBA) da rede que ele definisse alguns recursos no cliente como:
- definir o fundo de tal com um JPG;
- definir que o usuário não pudesse mudar wallpaper;
- habilitar o serviço mensageiro do windows;
- iniciar o serviço mensageiro do windows;
Para isso precisei adicionar no script de netlogon.bat a execução de um arquivo de registro e abaixo colei os arquivos como ficaram…
–arquivo-fixreg.reg———recorte-aqui————-
REGEDIT4
[HKEY_CURRENT_USER\Control Panel\Desktop]
“Wallpaper”=”C:\\logo.jpg”
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System]
“Wallpaper”=”C:\\logo.jpg”
“WallpaperStyle”=”2″
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\ActiveDesktop]
“NoChangingWallpaper”=dword:00000001
“NoHTMLWallPaper”=dword:00000001
[HKEY_LOCAL_MACHINE\system\currentcontrolset\services\messenger]
“Start”=dword:00000002
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main]
“Start Page”=”http://www.suaempresa.com.br”
[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Restrictions]
“NoSetHomePage”=dword:00000001
———–recorte-aqui————-
—arquivo-netlogon.bat——–recorte-aqui————-
copy \\servidor\compartilhamento\logo.jpg C:\logo.jpg
rem Script Registro do Windows
@echo off
REGEDIT /S \\servidor\compartilhamento\fixreg.reg
cls
net start messenger
@echo off
net use Z: /delete /yes
net use Z: \\servidor\compartilhamento
———–recorte-aqui————-
—smb.conf——–recorte-aqui————-
# Global parameters
[global]
unix charset = ISO8859-1
workgroup = PDC-EMPRESA
netbios name = SERVIDOR
server string = Servidor de Arquivos
passwd program = /usr/bin/passwd %u
passwd chat = *New*UNIX*password* %n\n *Retype*new*UNIX*password* %n\n *passwd:*all*authentication*tokens*updated*successfully*
password level = 8
username level = 8
unix password sync = Yes
log file = /var/log/samba/%m.log
max log size = 50
name resolve order = wins lmhosts bcast
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
logon script = netlogon.bat
logon drive = h:
domain logons = Yes
preferred master = Yes
domain master = Yes
dns proxy = No
wins proxy = Yes
wins support = Yes
idmap uid = 16777216-33554431
idmap gid = 16777216-33554431
admin users = @admin
hosts allow = 192.168.0., 127.
[homes]
comment = Home Directories
valid users = @admin, %S
read list = @admin, %u
write list = @admin, %u
read only = No
veto files = /*.wmv/*.avi/*.mp3/*.wav/*.mov/*.mpeg/*.com/*.scr/*.bat/
browseable = No
vfs objects = recycle, vscan-clamav
recycle:config-file = /etc/samba/recycle.conf
vscan-clamav:config-file = /etc/samba/vscan-clamav.conf
[compartilhamento]
comment = Home do Felipe
path = /home/compartilhamento
write list = @admin
read only = No
veto files = /*.wmv/*.avi/*.mp3/*.wav/*.mov/*.mpeg/*.com/*.scr/*.bat/
browseable = No
vfs objects = recycle, vscan-clamav
recycle:config-file = /etc/samba/recycle.conf
vscan-clamav:config-file = /etc/samba/vscan-clamav.conf
[netlogon]
comment = Network Logon Service
path = /home/netlogon
write list = @admin, root
browseable = No
share modes = No
———–recorte-aqui————-
É isso… boa sorte
IntroduçãoPra não reinventar a roda, e desenvolver um sistema de blog que eu confiasse (bom-prático-seguro), eu decidi utilizar o WordPress depois de pouca pesquisa na internet, confesso que fiquei em dúvida entre o WordPress e o Drupal, mas por “sorteio” acabei escolhendo o WordPress mesmo sem conhecê-lo a fundo.
E agora, confiar ou não confiar no código?
Depois de algumas experiências frustantes com alguns pseudo-CMS (não vou falar nomes para não ofender ninguém), decidi por não confiar em código nenhum, sendo assim tive que estudar alguma técnica de segurança externa ao código do WordPress, pois por ele a única coisa que quero fazer eu mantê-lo sempre atualizado no meu servidor.
A melhor prática de segurança para mim é o BACKUP, e como esta prática já esta sendo feita parti para outra técnica pró-ativa e não reativa.
O apache possui diversos módulos, confesso que entendo um pouco sobre cada um deles, sabia que existia formas de filtros com expressões regulares no apache, mas confesso que não conhecia o suficiente para me sentir seguro com meia dúzia de regras. O tal módulo de segurança é o ModSecurity.
Visão Geral
O ModSecurity funciona como um FIREWALL para aplicativos WEB, que foi desenvolvido exatamente com este princípio de dar segurança a aplicações web pois, segundo a documentação do ModSecurity, 70% de todos os ataques estão no nível de aplicações WEB tornando assim estes sistemas online seguros.
O ModSecurity é um WAF(Web Application Firewall) que funciona em tempo real, sendo assim ele tem o poder de detectar, e impedir um ataque antes de chegar a aplicação web. Uma grande vantagem de utilizá-lo e por ele prover a segurança independente de alterações no código da aplicação, sem alterações na rede, e diferentemente de outros IDS (Intrusion detection system), ele trabalha com dados Criptografados ou Compactados sem problema algum pois no momento que ele aplica suas regras, estes dados não estão compactados ou criptografados.
É possíve implementar o ModSecurity usando o ProxyPassReverse também, isso significar que é possível fazer um proxy/firewall HTTP que protege todos os servidores que ficam “abaixo” dele.
Lógica de Funcionamento
O ModSec. funciona da seguinte forma:
- Baseado em regras ele detecta tentativas de ataques;
- As regras seguintes determinam as ações a serem tomadas caso seja detectada a tentativa de ataque;
Utilização
Agora que já sabemos quem é, e como funciona o modsecurity, e como eu não tenho pretensão em fazer um Manual dele neste post e sim somente mostrar um técnica de como proteger um sistema intrinsicamente vamos para as regras:
É possível utilizar o ModSecurity em vários directivas dos Apache como VirtualHost, Location, LocationMatch, Directory, etc.
Abaixo um exemplo de utilização:
MANUAL ONLINE: http://www.modsecurity.org/documentation/modsecurity-apache/2.1.2/
<VirtualHost www.dominio_protegido.com.br>
# Definição do domínio deste VirtualHost
ServerName www.dominio_protegido.com.br
# Diretório raiz do site
DocumentRoot /home/www.dominio_protegido.com.br
# Sim, para habilitar o motor de filtros
SecFilterEngine On
# Habilita o filtro em requisições HTTP do tipo POST
SecFilterScanPOST On
# Habilita o filtro nas respostas das requisições HTTP
SecFilterScanOutput On
# Check URL encoding
SecFilterCheckURLEncoding On
# This setting should be set to On only if the Web site is
# using the Unicode encoding. Otherwise it may interfere with
# the normal Web site operation.
SecFilterCheckUnicodeEncoding Off
# Only allow certain byte values to be a part of the request.
# This is pretty relaxed, most applications where only English
# is used will happily work with a range 32 – 126.
SecFilterForceByteRange 1 255
# Audit log logs complete requests. Configured as below it
# will only log invalid requests for further analysis.
SecAuditEngine RelevantOnly
SecAuditLog logs/audit_log
# Command execution attacks
SecFilter /etc/password
SecFilter /bin/ls
SecFilter /bin/lynx
SecFilter /bin/wget
SecFilter /bin/curl
SecFilter /bin/links
# Directory traversal attacks
SecFilter “\.\./”
# XSS attacks
SecFilter “<(.|\n)+>”
SecFilter “<[[:space:]]*script”
# SQL injection attacks
SecFilter “delete[[:space:]]+from”
SecFilter “insert[[:space:]]+into”
SecFilter “select.+from”
# MS SQL specific SQL injection attacks
SecFilter xp_enumdsn
SecFilter xp_filelist
SecFilter xp_availablemedia
SecFilter xp_cmdshell
SecFilter xp_regread
SecFilter xp_regwrite
SecFilter xp_regdeletekey
# Protecting a vulnerable script
# Some PHP applications are vulnerable when a register_globals configuration option is turned on,
# allowing attackers to set an internal variable to a value of their choice. This usually leads to
# attacker executing some code on the server. Here is an example from the real world (Cafelog
# b2, http://www.securityfocus.com/bid/7786):
SecFilterSelective ARG_b2inc “!^$”
# Protecting from XSS attacks through the PHP session cookie
# PHP versions prior to 4.3.2 are vulnerable to XSS attacks carried out through the session
# identifier (http://www.securityfocus.com/bid/7761). If you can’t upgrade your PHP version to
# the latest version you can still protect yourself:
SecFilterSelective ARG_PHPSESSID “!^[0-9a-z]*$”
SecFilterSelective COOKIE_PHPSESSID “!^[0-9a-z]*$”
# Stop FormMail from being used to send spam
# Some versions of FormMail can be used to send email to arbitrary email addresses. The
# following rule demonstrates how you can have a filter applied only to certain locations, in this
# case just the FormMail script. The request will be rejected if the email is intended to any address
# except the one ending in “@modsecurity.org”:
<Location /cgi-bin/FormMail>
SecFilterSelective “ARG_recipient” “!@modsecurity\.org$”
</Location>
# Restrict administrative login to an IP address
# Here is a nice one. I have this application where the administrator logs in through the same log
# in panel as other users, but I still wanted to restrict administration login to certain IP addresses.
# So I used two chained rules. The second rule will apply only if the first rule matches; in this case
# – if the incoming username is “admin”.
SecFilterSelective ARG_username admin chain
SecFilterSelective REMOTE_ADDR “!^ADMIN_IP_ADDRESS_HERE$”
# Preventing information leak
# In all versions of PHP, if a fatal error occurs the script will be terminated immediately (standard
# error handling routine will not be invoked). Information leak through these problems can be
# prevented by scanning the output and preventing it from reaching the user if it contains error
# messages.
SecFilterSelective OUTPUT “Fatal error:”
# Detecting intrusions
# Output filtering can also be used to detect successful intrusions. These rules will monitor output
# and detect typical keywords resulting from a command execution on the server.
SecFilterSelective OUTPUT “Volume Serial Number”
SecFilterSelective OUTPUT “Command completed”
SecFilterSelective OUTPUT “Bad command or filename”
SecFilterSelective OUTPUT “file(s) copied”
SecFilterSelective OUTPUT “Index of /cgi-bin/”
SecFilterSelective OUTPUT “.*uid\=\(”
# Você poderá precisar desta opção habilitada depois mas nunca deixe
# esta opção habilitada por definitivo pois debugar as regras pode deixar
# o servidor muito lento
SecFilterDebugLevel 0
SecFilterDebugLog logs/dominio_protegido.com.br-modsec_debug_log
# A ação padrão tomada para requisições negadas é o status 500
SecFilterDefaultAction “deny,log,status:500″
# Escreva suas regras do mod_security aqui
# …
</VirtualHost>
Para fazer regras efetivas é necessário ter conhecimentos de cabeçalhos e corpos de requisições e respostas HTTP, e ter uma mente bem fértil para imaginar as falcatruas que usuários ou programas mal-intencionados podem fazer… boa sorte em suas construções!
Iniciando este blog, pretendo postar aqui notícias, conhecimentos adquiridos(não tão populares) que podem servir a outras pessoas, e o que mais eu achar pertinente.
A idéia é fazer um blog de tecnologia e utilizá-lo de forma ilimitada, espero que algo aqui seja útil para você.
Abraços,
FernandoCosta