.htaccess ile dizin koruma (Şifreleme)

#

Sal, 01 Oca 2008 08:11:46

 

Apache ile dizini password protected yapmak bir kaç yolla başarılabilir. bu serimizde sizlere .htaccess dosyası ile dizin ve dizin içeriklerini nasıl kullanıcı adı ve şifre ytöntemi ile koruyabilecegimizi anlatmaya çalısacagım.

 

Dizini koruma altına almadan önce korumak istediginiz dizini alltına .htaccess dosyasını yaratmanız gerekir. Bu dosya Web İşleticisi (httpd) tarafından dizine access vermeden önce okunur ve ona göre contentler istemciye sunulur. Bu sistemle istediginiz dizinin altına .htaccess dosyasını bırakıp dizine ait birçok işlemler yapabilirsiniz bunlardan biriside dizini kullanıcı adı ve şifre yöntemi ile dizin contentlerini koruamaktır.


Bu işlemi gerçeklestirmeden önce birkac .htaccess dosyasına birkac parametre atmak zorundasınız.  Bu parametreler apache (httpd) sunucuya dizini koruyabilmesi için kullanması gereken bilgileri sunacaktır. 

 .htaccess dosyası

AuthUserFile /korunacak/dizinin/şifre/dosyası/.htpasswd #Şifrenin Tutuldugu Dosya
AuthName "Lütfen Kullanıcı adı ve Şifrenizi Giriniz "  #Kullanıcıya Sunulan Mesaj
AuthType Basic                                                                        # Authentcation Tipi.

Dikkat edeceginiz bir unsur şifre dosyasını web sunucu tarafından ulaşılabilinecek bir yerde bulundurmamanızdır.  Bu dosyayı dilediginiz yere bırakabilirsiniz  ama FTP veya SSH yöntemiyle ulaşabileceginiz bir dizinin altına bırakmalısınız .

Bu dosyada Kullnaıcı isimleri ve encrypt edilmiş Kullanıcı şifeleri bulunmaktadır.

Eger bu dizine herhangi bir user'ın ulaşabilmesini istiyorsanız (Sistemde Bulunan herhangi bir Unix User'ı).

require valid-user   #valid-user bir apache keywordu olup tum kullanıcıları dahil eder 

  Egerki belirli bir kullanıcay ait olmasını istiyorsanız. 

require user eren  #Sadece Eren isimli kullanıcının erişbilecegini gösterir.

 

Gelelim .htpasswd dosyasına.  Şimdiye kadar apacheye bu dizinin kullanışının şifreli oldugunu, Kullanıcıya göostermek istedigimiz mesajı  hangi kullanıcıların erişebilecegini ve şifre dosyasını nerde bulabilecegini soyledik fakat bir sonraki basamak kimlerin bu dizine girebilecegini söyledik.

.htpasswd dosyası irkac satırdan oluşup her satırda kullancının ismi ve ":" iki nokta ile ayrılmıs şifresi bulunur. 

kullanıcı_ismi:lfPCwKyTtOxig    
eren:ZaTcBPzPq28XQ


 htpasswd executable dosyasını kullanarak bu şifreleri yaratabilir veya htpasswd executable'a hangi dosyaya kaydedebilecegini söyleyebilirsiniz. 

 

 Bu Gecelik (pardon sabahlık) yine bu kadar  ve yine uyumadım hatta yılbaşı akşamı dışardan geldikten sonra bi maiileriimi kotrol edeyim dedim ama saat sabahın 6 'sı yatma zamanı geli 1-2 saatligine.  :)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5799 defa izlendi | Bu Bloga Yorum Yazın


J2ME ile SMTP

#

Sal, 25 Ara 2007 06:24:40

 

Bu Blogumda  J2ME(Java 2 Micro Edition) ile nasıl SMTP servere baglanıp email Mesajı atabilecegimizi açıklamaya çalısacam.

 

J2ME ile SMTP Servere baglanabilmek için javax.microedition.io.Connector classını javax.microedition.io.StreamConnection class'ına cast ederek baglantı saglayacagız.

 

SMTP Server baglantımızı bu şekilde Kurabiliriz

 

StreamConnection connection;
connection = (StreamConnection)Connector.open("socket://" + "smtp.yourdomain.com" + ":25", Connector.READ_WRITE);

 

//SMTP Stream Connectionından DataInputStream ve DataOutputStream çekelim

 

DataOutputStream  out = c.openDataOutputStream();
DataInputStream in = c.openDataInputStream();

 

SMTP Server ile Baglantımız şu anda hazır halde bulunmaktadır  ve input ve utput için beklemektedir. Bundan Sonraki yapacagımız SMTP Protocolunü inceleyip protokol kurallarına uyarak Sockete yazıp ve Socket ten Responsalerı okumalıyız. Fakat bunu yapmadan önce birkaç tane Helper methodu yaratıp

 işmizi kolaylaştırmak lazım.

 

//Verilen Stringi DataOutputStream'ine yazar

private void write(DataoutputStream out, String s)throws java.io.IOException
{

      out.write(s.getBytes(
"utf-8"));
}

 

 //Birsonraki Line Feed'e Kadar Okur

 

private String readline(DataInputStream in)throws java.io.IOException {

    StringBuffer s = new StringBuffer();
   
int i;
   
while ((i=in.readUnsignedByte()) != -1 && (i != '\n')){
        s.append((
char) b);
    }

   
return new String(s);
}

 

 

//Bir Sonraki Input kommandına Kadar Okur ve Input kommandının bitmesi Server'ın input için Hazır olması demektir.
private void skipInput()throws java.io.IOException{
   
int avail;
   
while (in.available() != 0) {
        readResponse();

    }

}

 

Ve sıra Mesajımızı Gondermekte.

Connection Parametrelerinin connect() adlı bir  methodda bulundugunu farz edelim.

 

connect();
readResponse();

write(out,
"HELO pensioner.su\r\n");
skipInput();

write(out,
"MAIL FROM: <eren@domain.tls>\r\n");
readResponse();

write(out,
"RCPT TO: you@domain.tls\r\n");
readResponse();

write(
"DATA\r\n");
readResponse();

write(
"From: <eren@domain.tls>\r\n" +
 
"To: you@omin.tls\r\n" +
 
"Subject: My J2ME SMTP Blog \r\n" +
 
"Content-Type: text/plain;\r\n" +
 
"\tcharset=\"utf-8\"\r\n" +
 
"\r\nBu Bir Test Mesajıdır Lütfen panik yaratmayın.\r\n" +
 
"\r\n.\r\n"
  );

readResponse();
write(
"RSET\r\n");
write(
"QUIT\r\n");
skipInput();

 

 Uymanız gereken e önemli kurallardan biri Yeni Satırın CRLF (Carriage Return + Line Feed) şeklinde yer almasıdır.

 

CRLF  = "\r\n"
LF    = "\n"

 

 

 

 

 

2575 defa izlendi | Bu Bloga Yorum Yazın


Ruby ile Recursively Dizin Okumak

#

Sal, 25 Ara 2007 01:20:07

 

 

Birçok karşılastıgım sorulardan birisi ruby Dizindeki dosyaları kullanıcıya gonderdiginde ulundugun (full path) dizinin ismini gondermiyor

 

mesela:

 


Dir.foreach(dir){ | file |

puts path

#Eger Dizin . veya .. ise devam et

            next if file == "." || file == ".."

            # Dosya Bulundu bu Dosya ile Yapmak istediginiz işlemleri Gercekleştirin

            end

}

 

 

Sadece Okunan dizinde bulunan dosyların isimlerini  basename olarak yazar. 

 

ve Recursive olarak dizini okumak icin kendi pathımızı tutmamız lazım. veya Dir.cwd() komutunu kullanmamız gerekmektedir.  Fakat ben Bulundugumuz dizini kullanarak Doya ismini full path a cevirmeyi tercih ederim.

 

 

      def recurse_dir(dir)

            Dir.foreach(dir){ | file |

                  path = File.join(dir,file)

                  #puts path

#Eger Dizin . veya .. ise devam et

                  next if file == "." || file == ".."

                        # Dosya Bulundu bu Dosya ile Yapmak istediginiz işlemleri Gercekleştirin

                  end

            }

      end

 

 

 

 

 

 

 

2148 defa izlendi | Bu Bloga Yorum Yazın


Perl ve Sendmail

#

Sal, 25 Ara 2007 00:53:38

Aşagıdaki Örnekler nasıl Sendmail komutunu File Handle olarak açıp email gönderebileceginizi Gösterir

Birinci Örnekte alıcı adresi File Handle tarafından atanmıstır fakat 2. Örnekte alıcı adresi direk olarak

snedmail komutuna parametre olarak atanmıştır.

 

 

 

    #!/usr/bin/perl

      # Perl ve Sendmaili Kullanarak Mail göderme

    unless(open (MAIL, "|/usr/sbin/sendmail -t")) {

          print "error.\n";

          warn "Error starting sendmail: $!";

    }

    else

          print MAIL "From: gönderen\@sizinsite.com\n";

          print MAIL "To: alıcı\@sizinsite.com\n";

            print MAIL "Reply-to: cevapadresi\@sizinsite.com\n";

          print MAIL "Subject: Örnek Konu\n\n";

          print MAIL "Bu Bir Test Mesajıdır lütfen panik yapmayın";

          close(MAIL) || warn "Sendmaili Kapatırken Hata Oluştu: $!";

          print "Emailiniz Gönderildi \n";

    }

 

     

 

 

veya Sendmail Komutunu Açarken Mesajın kime Gönderilecegini Belirte bilirsiniz.

 

 

 

    #!/usr/bin/perl

      # Perl ve Sendmaili Kullanarak Mail göderme

    unless(open (MAIL, "|/usr/sbin/sendmail alıcı\@sizinsite.com")) {

          print "Hata.\n";

          warn "Sendmail'i Çalıştırırken hata oluştu: $!";

    }

    else{

          print MAIL "From: gönderen\@sizinsite.com\n";

          print MAIL "Subject: Örnek Konu\n\n";

            print MAIL "Reply-to: cevapadresi\@sizinsite.com\n";

          print MAIL "Bu Bir Test Mesajıdır lütfen panik yapmayın";

          close(MAIL) || warn "Sendmaili Kapatırken Hata Oluştu: $!";

          print "Emailiniz Gönderildi \n";

    }

           

      veya Sendmail Modulunü de kullanabilirsiniz.

      örnegin

 

 

     

       #!/usr/bin/perl

      # Perl ve Sendmaili Modulunü Kullanarak Mail gönderme

      use Sendmail

     

      $mailer = new SendMail();

    $mailer = new SendMail("127.0.0.1"); #SMTP Server Adresi

    $mailer = new SendMail("127.0.0.1",   "25"); # Eger SMTP Server default portta çalışmıyorsa portu set edebilirsiniz.

      $mailer->From("gönderen@sizinsite.com");

      $mailer->Subject("Örnek Konu");

      $mailer->To("alıcı@sizinsite.com");

      $mailer->ReplyTo("cevapadresi@sizinsite.com");

      $mailer->setMailBody("Bu Bir Test Mesajıdır lütfen panik yapmayın");

     

      #ve mesajı yolluyoruz

      if ($mailer->sendMail() != 0) {

       # Hata Oluştu

       print $mailer->{'Hata Oluştu'}."\n";

    }

            #mail Objectini Sıfırlayalım.

       $mailer->reset();

     

 

 

 

 

 

            Tabiki Perl ile mail yollama bu yöntem ile kalmamaktadır. 

      Bu yöntemlerden bazıları

             Mail::Lite

             Mail:Mailer

             gibi Modulleride Kullanıp Mail Yollayabilirsiniz.

2733 defa izlendi | Bu Bloga Yorum Yazın


Java, RMI, ve PKI bazlı login.

#

Pzt, 24 Ara 2007 21:53:17

 

Aralık yayını Blogumda sizlere Enterprise Network Management Platformu için kullandıgımız RMI Secure Login ve bu Platformda uyguladımız yaklaşımı sizlerlere aktarmak amacıyla duzenledim.

 

Bazı güvenlik ve  Copyright sebeplerinden dolayı tüm kodu sizlerle paylaşayamacagım, fakat elimden geldigi kadar stub v örneklerle açıklayamaya çalısacagım.

 

 

İlk Olarak RMI Stub Interface lerimizi Kurmamız Lazım

 

Gördiginiz gibiInterfaceimize 3adet method vardır. getChallengeKey() Sever tarafıdan verilmis bir random String dir.   Server bu String i Cachler ve client  login olmaya çalıştıgında boyle bir keyi verp vemedimi diye bakar.  Güvenlik için yarattıgınız keylerin validity periodu Yarım saati geçmemeli bu replay bazlı hacking in önune geçecektir.

 

 

public interface SecureRMILogin extends Remote  {

    public String getChallengeKey(String myID);

         public String authenticate(String challenge,String signature, String alias);

 

    public Object doSomeAction(String someKey, boolean force);

 

Elbette client herhangi bir SSL yardımı ile RMI Servere baglanmadıgı için Keyler  plain Text olarak transfer edilmektedir ve Bu Keyler dışardan Networku dinleyen herhangi birisi tarafından kolaylıkla elde edilebilir ve Raplay Teknigi ile Kullanılabilir.  Bu konuda daha fazla ayrıntılı bilgiyi gelecek blogumda sizlerle paylaşmaya çalışacagım. (RMI with Custom Socket Factory)

 

 

 vede implementation olarak.  

 

public class SecureRMILoginImpl extends UnicastRemoteObject implements SecureRMILogin{

 ......./Other Methods

 

/**
 * Bu Method da ise Her Clienta ait unique bir challenge Key Yaratın mesela hostName+id+imestamp(MD5)ve bu ID yi dısarı aktarılmış ID listesine ekleyin bu ID yarım saat gecerli olmalı (ilk Kullanım icin )
* @return Challenge Key

 */

    public String getChallengeKey(String myID){

 

            ........
        return
challengeKey;
        } 

 

/**
 * Bu Method da kendinize ait bir SessionCredentials Class ı yaratın.
 
* ve erişmesi serbest olan tüm clientlar için bi Session ID,si
 * yaratarak bir nevi Session Containerine aktarın.

 * @return Session ID

 */

         public String authenticate(String challenge,String signature, String alias){
         

    PublicKey key = ....... //get your public Key

 

    Signature signatureObj = Signature.getInstance(key.getAlgorithm());
    signatureObj.initVerify(key);

    signatureObj.update(buffer,0,buffer.
length);
    boolean allowed = signatureObjverify(signature);

    if (allowed){
       
sessionID = ....... Unique Session ID Mechanism.

      SessionCredentials credentials = new SessionCredentials(sessionID,challenge,signature,true);

      sessions.put(sessionID, credentials);  //Sessio mecanizması

}

      return sessionID;  //Clienta Yeni Session ID sini gonderin ve herhangi bir metodu cagırırken bu Session IDsini kullanıp authenticated oldugunuzu elirtin.

 

 

      public boolean isAuthenticated(String sessionID){

            if(sessions.containsKey(sessionID)){

                  return true;

            }

            return false;

      }

 

 

    public Object doSomeAction(String SessionID, String someAction, boolean force){

            if (!isAuthenticated(sessionID))

            {

                  throw new SecurityException("Method Call Denied");

            }

 

        ..... Client is Authenticated  .......


        }
 

Sessionları tutmak icin HashMap Kullanablilirsiniz.

 

 

private HashMap<String, SessionCredentials > sessions = new HashMap<String, SessionCredentials>();

 

Elbette bu kısıma Session Timeout Mekanizmasınıda atmalısınız, eger client belirli (örnegin 30 Dakika gibi bir ) süre boyunca Baglantı kurmadıysa Session ID sini Invalidate etmelisiniz.

 

eger HashMap Kullanıyorsanız ayrı bir thread yaratıp her dakikada bir idle Sessionları kontrol edip HashMapten silebilirsiniz 

 

@Override
public void run() {

    super.run();

    running = true;

    while(running){

    for(Iterator<String> e =     hashMap.keySet().iterator(); e.hasNext();){

    String key = e.next();

    SessionCredentials credentials =  hashMap.get(key);

            .... Calculate Session Timeouts

        }

    }

}

 

 

 

 

 

 

14366 defa izlendi | Bu Bloga Yorum Yazın


Uzerine.com  ©2005 Uzerine.com
Ana Sayfa | Bize Ulaşın | Gizlilik Sözleşmesi | Kullanım Şartları | Üye Girişi