17
Jan 12

PHP escaping inputs and filtering outputs

I’ve spent more time than probably necessary lately to find the best solution to escaping inputs and filtering outputs from your PHP script.

I made the mistake of “over sanitizing” user inputs by first running them through PHP’s filter_var function immediately when capturing the request, then running the data through mysql_real_escape_string(), and then passed it off to PDO, which automatically escapes the bound parameters for you. I ran into problems with special characters, namely single and double quotes because filter_var would convert them to their html_entities or ascii equivalents and store them in the database as such while other data in the application escaped the quotes with a backslash. Rather than go through all the tests I ran, I’ll provide the solution I found that handles inputs best.

Do not convert quotes or any special characters to their ascii equivalents by using htmlspecialchars() or filter_var($var, FILTER_SANITIZE_STRING)
Use PDO or mysql_real_scape_string prior to inserting into the database
When outputting the data, use stripslashes() and htmlentities().

The htmlentities() is important so characters such as a double quote followed by a greater than sign won’t break your html input. If they’re converted to their ascii character, they’ll still print properly and won’t break your html. Also, it’s worth noting that if you enter the value “nick\s” in an input field and save it to the database, the value will be stored as “nick\\s” and when you use stripslashes() on this, only one of the two backslashes will be removed, which is the desired behavior.

Kaynak: http://nickbartlett.com/wordpress/php-escaping-inputs-and-filtering-outputs/


01
Jan 12

HTML5 ile Drag & Drop Upload

HTML ve PHP ile kolayca sürükle bırak yaparak sunucuya dosya yüklemek için güzel bir kod.

HMTL5 ile dosya uploadı yapmak istediğim bir uygulama yazmam gerektiğinde elimde olan bu çok beğendiğim kodu kullanmak için wp’e eklemek istedim. Olurda bir gün bu tarz birşeye ihtiyaç duyarım nerede diye aramayım.

Dosyayı ne olur ne olmaz ben html5-file-upload‘ı buraya upload edeyim ve yine de kaynağını da ekleyim.


11
Dec 11

Resin JavaEE web server

Java tabanlı web sitelerini genelde Tomcat ya da Oracle iPlanet web sunucularında çalıştırıyorum.

Ama Tomcat sayfaları render ederken biraz sorun çıkarmaya başladı. Sayfaların daha doğru render edilmesi ve gereksiz zaman kayıplarından kurtulmak için alternatif ve ücretsiz çözümler aradım. Çözüm olarak Resin Java EE web sunucu görünüyor. Yönetim paneldinden uygulamalar yönetilebiliyor, sorun giderme ve istatistiklerden faydalanabiliniyor. Hemen hemen tüm sistemlerde çalışabilmektedir.

Kurulum için gerekli tgz uzantılı dosyayı indirip extract ettikten sonra terminal ekranında aşağıdaki komutu çalıştırdım.

mac:resin-pro-4.0.24 serkon$ ./configure

Sonuç:

Resin Configuration summary:

  RESIN_HOME  : /usr/local/share/resin-4.0.24
      root    : /var/www
      conf    : /etc/resin
      log     : /var/log/resin
      plugins : common resin_os resin resinssl
  JAVA_HOME: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

    + 64-bit JNI in -I/System/Library/Frameworks/JavaVM.framework/Headers
    + JNI CFLAGS:
    + poll() for keepalives
    +
        OpenSSL include: /usr/include
        OpenSSL lib:
        OpenSSL libraries:  -lssl -lcrypto
mac:resin-pro-4.0.24 serkon$ make
mac:resin-pro-4.0.24 serkon$ make install
bash-3.2# bin/resin.sh start

ile sunucu başlatılır.

Daha sonra yönetim ekranı şifrelerini belirlemek için 127.0.0.1:8080 adresine girilir ve alttaki alanda kullanıcı adı ve şifre üretilir. Gelen açıklamadaki adımlardan birini yapmak yönetim ekranına girmek için yeterlidir. Ben resin.properties içerisine ürettiğim şifreleri girdim. Resin’i indirmek için bu adrese gidilir.


25
Nov 11

StringEscapeUtils ile HTML Encoding

Java ile html inputların encodingini değiştirmeye yarayan StringEscapeUtils, database veya bir dosyaya veri girmeden önce kullanılanır.

Kullanıcı tarafından gönderilebilecek kötü amaçlı HTML Tag’ları bu sayede değiştirilmiş olur. < > ‘ \ / =.< gibi karakterler filtreye uğrayarak değiştirilir.
Import edilmesi gereken kütüphane:

< %@page import="org.apache.commons.lang3.StringEscapeUtils"%>

Uygulama için gerekli kod:

try{
	String in = "<div><script>alert(1);</script></div>"; // Some fake input
	String o = StringEscapeUtils.escapeHtml3(in);
	//escaped = escaped.replaceAll("\\n", "
");
	out.print(o);
}
catch(Exception e){
	out.print(e);
}

Çıktısı şu şekilde olacaktır;

<div><script>alert(1);</script></div>

Ancak DB’de şu şekilde tutulacaktır;

&lt;div&gt;&lt;script&gt;alert(1);&lt;/script&gt;&lt;/div&gt;

23
Nov 11

sun.net.smtp.SmtpClient ile Mail Gönderme

Hiçbir extra kütüphane kullanmadan Java SE ile beraber gelen mevcut kütüphanelerden faydalanarak mail göndermek için sun.net.smtp.SmtpClient mail kullanılabilir.

Okuduklarımdan hatırladığım kadarı ile JDK 1.0 dan beri desteğinin olmaması, ileriki JDK lar içerisinde olmayabileceği de düşünülürse, kullanmak biraz riskli olabilir. Bu adresten SmtpClient Class’ına ait dokumantasyona ulaşılabilir.

Java ile mail gönderme konusunda daha önceden hazırlarmış olduğum bir makale vardı. Bu sadece sun.net.smtp.SmtpClient’e acil ihtiyaç duyabileceğim durumlar olabilir düşüncesiyle ve diğerlerine göre daha kolay olmasından dolayı bloga koyma ihtiyacı duydum.

Import edilmesi gereken kütüphane zaten mevcut;

<%@ page import="sun.net.smtp.SmtpClient, java.io.*" %>

Kod ise;

 String from="test@mailadresi.com";
 String to="test@mailadresi.com";
 try{
     SmtpClient client = new SmtpClient("10.1.1.111");
     client.from(from);
     client.to(to);
     PrintStream message = client.startMessage();
     message.println("To: " + to);
     message.println("Subject:  Sending email from JSP!");
     message.println("This was sent from a JSP page!");
     message.println();
     message.println("Cool beans! :-) ");
     message.println();
     message.println();
     client.closeServer();
  }
  catch (IOException e){
     out.println("ERRORs SENDING EMAIL:"+e);
  }

Hepsi bu kadar.


22
Nov 11

JSP için Simple Captcha

Captcha, web sitesinde yer alan formların defalarca sunucuya gönderilmesini engellemek ve siteyi ziyaret eden kullanıcının makinamı olduğunu anlamak için oluşturulmuş bir mekanizma olarak tarif edilebilir.

Bir üyelik formunun makina tarafından otomatik olarak doldurulup gönderilebileceği düşünülürse gelen isteğin makina olup olmadığını anlamak için güvenlik kodunun her defasında farklı üretilmesi ve makina tarafından çözülemeyecek düzeyde olması gerekir. Güvenlik kodu olmasa idi makina, sunucuya dilediği kadar kullanıcı yaratma talebinde bulunabilirdi.

Bu gibi güvenlik amaçlarına hizmet eden captcha uygulamasının birden çok örneği vardır ve bir çoğu kırılabilmektedir. Başarılı bulduğum ve kullanımının kolay olduğunu düşündüğüm bir örneği eklemek istedim. http://www.jroller.com/mlconnor/entry/simple_captcha_jsp adresinde örnek bir JSP Captcha yer almaktadır. Kullanımı kolay ve modifiye edilebilir.

Dosyaya buradan da erişilebilir.


16
Nov 11

PHP ile Mail Gönderimi ve XSS Önlemi

Aşağıdaki kod parçaları kullanılarak gönderilecek maillerin içerisine XSS atağı yapılıp yapılmadığı kontrol edilebilir.

XSS kontrolu

“From” taqı, “Mime” tagından önce tanımlanmalıdır. Sadece Content tagı sonuna “\r\n” alır. Diğerleri “\n”.Buna gönderilecek olan email’in yapısı aşağıdaki gibi olmalıdır.

<?php
$headers = 'From: You <you@example.com>' . "\n";
$headers .= 'MIME-Version: 1.0' . "\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
?>

Yukarıdaki mantıktan yola çıkarak ilk fonksiyonda girdide birden çok new line karakteri var ise false değeri döner. İkinci fonksiyon, sadece bir yeni satır karakteri öncesinde şüpheli dizeleri eşleştirir.

<?php
/**
* Check single-line inputs:
* Returns false if text contains newline character
*/
function has_no_newlines($text){
	return preg_match("/(%0A|%0D|\\n+|\\r+)/i", $text) == 0;
}

/**
* Check multi-line inputs:
* Returns false if text contains newline followed by
* email-header specific string
*/
function has_no_emailheaders($text){
	return preg_match("/(%0A|%0D|\\n+|\\r+)(content-type:|to:|cc:|bcc:)/i", $text) == 0;
}
?>

Eksiz Mail Gönderimi

$eol = "\r\n";
$to = "webmaster <serkan.konakci@mailadresi.com>";
$ref = $_SERVER ['HTTP_REFERER'];
$subject = "WEB: $ref";
$headers = '';
$headers .= "From: Serkan KONAKCI<serkan.konakci@mailadresi.com>" . "\n";
$headers .= 'Bcc: konakci@mailadresi.com' . "\n";
$headers .= "Message-ID: <" . time () . ">"  . "\n";
$headers .= 'MIME-Version: 1.0' . "\n";
$headers .= "Content-Type: text/html; charset=UTF-8" . $eol; //iso-8859-1
$headers .= "Content-Transfer-Encoding: 8bit" . $eol;
$comment = "";
$comment .= "Referer URL: " . $ref . "<br />\n";
$comment .= (isset ( $_POST ['comment'] )) ? wordwrap ( filter_var ( $_POST ['comment'], FILTER_SANITIZE_STRING ) ) : '';
//echo $comment;
if (empty ( $_SESSION ['gkod'] ) || empty ( $_POST ['captchainput'] ) || (trim ( strtolower ( $_POST ['captchainput'] ) ) != $_SESSION ['gkod'])){
    echo "captcha";
    }
else {
    try {
        mail ( $to, $subject, $comment, $headers );
        echo "true";
    } catch ( Exception $e ) {
        echo "mail";
    }
}

Birden Çok Dosya Gönderimi

Aşağıdaki kod ile birden çok dosya maile ekleyerek posta gönderilebilir.

<?php
function multi_attach_mail($to, $files, $sendermail){

    // email fields: to, from, subject, and so on
    $from = "Files attach <".$sendermail.">";
    $subject = date("d.M H:i")." F=".count($files);
    $message = date("Y.m.d H:i:s")."\n".count($files)." attachments";
    $headers = "From: $from";

    // boundary
    $semi_rand = md5(time());
    $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";

    // headers for attachment
    $headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\"";

    // multipart boundary
    $message = "--{$mime_boundary}\n" . "Content-Type: text/plain; charset=\"iso-8859-1\"\n" . "Content-Transfer-Encoding: 7bit\n\n" . $message . "\n\n";

    // preparing attachments
    for($i=0;$i<count($files);$i++){
        if(is_file($files[$i])){
            $message .= "--{$mime_boundary}\n";
            $fp =    @fopen($files[$i],"rb");
            $data =    @fread($fp,filesize($files[$i]));
            @fclose($fp);
            $data = chunk_split(base64_encode($data));
            $message .= "Content-Type: application/octet-stream; name=\"".basename($files[$i])."\"\n" .
            "Content-Description: ".basename($files[$i])."\n" .
            "Content-Disposition: attachment;\n" . " filename=\"".basename($files[$i])."\"; size=".filesize($files[$i]).";\n" .
            "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n";
        }
    }
    $message .= "--{$mime_boundary}--";
    $returnpath = "-f" . $sendermail;
    $ok = @mail($to, $subject, $message, $headers, $returnpath);
    if($ok){ return $i; } else { return 0; }
}
?>

Kaynak: http://www.php.net/manual/en/ref.mail.php


02
Nov 11

Google Chrome Standalone indirme

Google Chrome’u standalone installer şeklinde yüklemek için adres satırının sonuna &standalone=1 yazmak yeterli oluyor.

İnterneti olmayan bir makinada kurulumu offline yapmak gerektiğinde standalone installer devreye giriyor. Bunun için uygun paketin indirileceği sayfaya geldikten sonra sonuna aşağıdaki gibi &standalone=1 yazmak yeterli oluyor. Bu sayede hem güncel sürüm indirilmiştir hemde interneti olmayan diğer makinaya Chrome kurulabilir.

http://www.google.com/chrome?platform=win&hl=tr&standalone=1

31
Oct 11

A/B Testi nedir?

Aşağıdaki makaleyi web sitesi performans göstergesi üzerine araştırma yaparken buldum. Konunun uzmanı gayet güzel ve açıklayıcı bir dil ile ne demek olduğunu özetlemiş. Vermiş olduğu bilgiler için teşekkürler.

Web sitenizi optimize etmek, ziyaretçilerinizin gerçekleştirmesini istediğiniz işlemleri (sitenizden bir şey satın almak, bültene abone olmak ya da sitenize kayıt olmak gibi) daha yüksek oranda gerçekleştirmelerini sağlamak (uluslar arası adıyla conversion’ı arttırmak) istiyorsanız A/B testleri sizin için iyi bir fikir olabilir. Örnek olarak Amazon ve Google gibi devlerin bu tip testleri sürekli olarak gerçekleştirdiklerini biliyoruz. Sitelerinde yapmak istedikleri değişiklikleri önce ziyaretçilerinin bir kısmıyla test edip sitenin performansını arttırdığından emin olduktan sonra uygulamaya sokuyorlar. Bu tip şirketler A/B ve MVT testlerini şirket politikalarının bir parçası yaptıklarından sürekli devam eden bir değişim ve gelişimi sağlamaktalar (biz fark etsek de fark etmesek de).
Günümüzde trend iki yılda bir sil baştan yepyeni bir site dizaynı etmek değil bu tip testlerle siteyi adım adım ama ayakları yere sağlam basarak geliştirmek. Çünkü A/B ya da MVT testleri gibi istatistiki metotlar kullandığınızda neyin daha iyi işlediğini, neyin aslında sitenizi iyileştirmekten ziyade daha da kötü yaptığını bilimsel verilerle görebiliyorsunuz.

Web sitenizde bir değişiklik yapmak istiyorsanız iki kere düşünün. Çünkü A/B ve MVT testlerinde görülüyor ki yapılacak değişikliklerin;

• 1/3’ü hiçbir işe yaramıyor
• 1/3’ü sitenin performansını arttırmak yerine azaltıyor
• Ve sadece 1/3’ü sitenizi daha verimli yapıyor
İşte tam da bu yüzden sitenizde bir değişiklik yapmadan önce test etmek çok önemli.

Konumuza geri dönelim. A/B testleri ile bir sayfanın iki (ya da daha fazla) değişik versiyonu test edilir. İki değişik tasarımdan hangisinin daha başarılı olduğu ya da bir sayfa elemanın hangi versiyonunun daha verimli olduğu A/B testleri kullanılarak belirlenebilir. Bir sayfa elemanı diyorum çünkü birden fazla sayfa elemanını aynı anda test etmeye Multivariate (MVT) testleri diyoruz. MVT testlerini hakkında daha geniş bilgiyi ilgili makalede okuyabilirsiniz.
Öte yandan sitenizin ihtiyaçlarına göre aynı sayfanın ya da aynı sayfa elemanının ikiden fazla versiyonunu test etmek isteyebilirsiniz. Böyle testlere A/B/n testi diyoruz. Yani isteğinize göre her harf bir sayfa versiyonu olmak üzere A/B/C/D .. testlerini uygulayabilirsiniz.
A/B testleri sayesinde iki sayfa şablonu arasından hangisinin daha verimli olduğunu bulabilirsiniz. Menü’nun, banner’ların, resimlerin ve diğer öğelerin yerlerini değiştirerek hangi şablonun sitenizin amaçlarına daha iyi hizmet ettiğini, daha verimli çalıştığını kolaylıkla görebilirsiniz. Yeni bir sayfa düzenine geçmeden önce yapılacak değişikliklerin gerçekten işe yarayıp yaramayacağı anlayabilirsiniz. Testler istatistiksel kesinlikte olacağından hangi tasarımın daha verimli olacağına objektif verilerle karar verilebilir.


Kısaca: Yukarıdaki örnekteki gibi aynı sayfanın elemanlarının yerleri ve/veya içeriklerini değiştirerek oluşturduğunuz varyasyonlardan hangisinin daha iyi performans gösterdiğini bulmanızı sağlar.
A/B testing diğer test metotlarıyla karşılaştırıldığında en basit ve en çabuk sonuç alınan testlerdir. Eğer siteniz çok yoğun trafik alan bir site değilse, bu test sizin için en uygun seçim olabilir. Test edilen varyasyonların sayısı arttıkça gereken trafik ve süre de o ölçüde artar.
A/B testleri yapmanızı sağlayacak birçok ücretli ve ücretsiz araç mevcut. Google Website Optimizer ücretsiz araçlara; Omniture Test&Target ise ücretli araçlara örnek olarak verilebilir. Sitenizin trafiği ve testinizin içeriğine göre amaçlarınıza uygun bir araç seçmek için yeterince opsiyonunuz var.

Kaynak : http://www.usabilitynedir.com/2010/04/ab-testi-nedir.html


08
Oct 11

Windows’da SSH Komutunu Kullanmak

Windows’un kabiliyetsiz komut satirini kullanarak ssh ile bir sunucuya baglanmak istedigimde bana SSH komutunu tanimadigini soyledi. Power Shell’i calistirdim o da olmadi. Bir iki arastirma neticesinde OpenSSH for Windows ile minimum duzeyde bir OpenSSH sunucusu ve kullanicisi kurmayi basardim.

OpenSSH for windows paketi tam olarak SSH/SCP/SFTP destegi vermektedir. Konu ile ilgili detayli bilgi icin http://sshwindows.sourceforge.net adresi ziyaret edilebilir.

Kurulum paketini indirip kurduktan sonra ufak bir iki degisiklik yapmak gerekmektedir (Detayli bilgi icin bu pdf incelenmelidir).

Command promt uzerinde sag klik ile Run As Administrator denilerek Command penceresi acilir:

Start > All programs > Accessories > Command Prompt 

Bu ekranda iken adres OpenSSH in kurulumunun yapildigi adrese degistirilir.

cd 'C:\Program Files (x86)\OpenSSH\bin'

Bin klasorunun altina eristikten sonra

.\mkgroup.exe -l >> ..\etc\group

Daha sonra

.\mkpasswd.exe -l >> ..\passwd

komutlari girilir ve OpenSSH servisi baslatilir.

net start opensshd

Artik komut satirindan SSH ile dilenilen yere baglanilabilir veya makinaniza baglanabilirler.