Posts

WordPress Güvenlik Önlemleri

WordPress Kurulum Esnasındaki Güvenlik Önlemleri

1) Veritabanı kullanıcı şifresini güçlü oluşturun. Büyük harf, küçük harf, sayı ve özel karakter içermeli.

2) Veritabanı ismi ve kullanıcı ismi basit ve tahmin edilebilecek isimler yani database, db, admin, veritabanı gibi isimler olmasın.

3) WordPress, kurulum ekranında bir ön eki sormaktadır. Varsayılan olarak wp_ ön eki vardır. Bu veritabanındaki tabloların en ekidir. Varsayılandan farklı bir ön eki kullanın.

4) Kullanıcı adı ve şifre seçiminde admin, administrator’den farklı bir isim seçin. Bunlar varsayılan olduğu için ilk olarak denenmektedir. Aynı şekilde şifreyi de büyük harf, küçük harf, sayı ve özel karakter içerek şekilde oluşturun ki güçlü olsun. Mail adresi admin@siteadi.com gibi admin içeren bir mail olmasın.

WordPress Kurulumdan Sonraki Güvenlik Önlemleri

1) .htaccess dosyanıza aşağıdaki kodları ekleyin.

# .htaccess dosyasına erişimi engelle
<files .htaccess>
order allow,deny
deny from all
</files>
# sunucu imzasını kaldır
ServerSignature Off
# dosya yükleme boyutunu 10mb ile sınırlandır
LimitRequestBody 10240000
# wpconfig.php dosyasına erişimi engelle
<files wp-config.php>
order allow,deny
deny from all
</files>
# wp-load.php dosyasına erişimi engelle
<files wp-load.php>
order allow,deny
deny from all
</files>
# dizin listelemeyi iptal et
Options All -Indexes

2) wp-config.php dosyasında eşsiz anahtarlar kısmı denen bir yer vardır. Eğer oraya hiç dokunmadıysanız aşağıdaki gibi bir görünümle karşılaşacaksınız.

define('AUTH_KEY', 'eşsiz karakter kümenizi buraya yerleştirin');
define('SECURE_AUTH_KEY', 'eşsiz karakter kümenizi buraya yerleştirin');
define('LOGGED_IN_KEY', 'eşsiz karakter kümenizi buraya yerleştirin');
define('NONCE_KEY', 'eşsiz karakter kümenizi buraya yerleştirin');
define('AUTH_SALT', 'eşsiz karakter kümenizi buraya yerleştirin');
define('SECURE_AUTH_SALT', 'eşsiz karakter kümenizi buraya yerleştirin');
define('LOGGED_IN_SALT', 'eşsiz karakter kümenizi buraya yerleştirin');
define('NONCE_SALT', 'eşsiz karakter kümenizi buraya yerleştirin');

Burası çok önemlidir. Cookie ve parola kayıtlarını bunlarla şifrelemektedir. Buraya ekleyeceğiniz kodlar için http://api.wordpress.org/secret-key/1.1/salt adresini ziyaret ettiğinizde WordPress size gerekli kodları verecektir. Kopyalayıp yapıştırmanız yeterlidir.

3) Eklentileri mümkün olduğunca az kullanın. Hem sitenizi yavaşlatacaklardır hem de saldırıya açık olma durumlarını artıracaklardır.

4) Tema ve eklentileri mümkün olduğunca WordPress gibi güvenilir kaynaklardan edinin ya da siz yazın. Warez tema ya da eklentileri kesinlikle kullanmayın.

5) Bu yazımdaki güvenlik açığını kapatın.

En önemlisi ise WordPress‘inizi devamlı güncelleyin.

WordPress Yazı Sürümlerini Silmek, Kapatmak

WordPress yazı sürümleri denilen bir özellik bulunmaktadır. Yayınladığınız bir yazınızda değişiklik yaptığınızda her değişiklikten önceki sürümünü ayrı bir şekilde kayıtlı tutmaktadır. Fakat bu bazen sinir bozucu ve zararlı olabilmektedir. Mesela bir yazıda 10 kez değişiklik yaptığınızda, 10 adet eski yazı sürümü olacaktır. Sitenizin içeriği arttıkça veritabanınızın şişmesine ve yavaşlamasına sebep olacaktır. Bundan dolayı burada size bu sürümleri silmeyi, kapatmayı ve limit koymayı göstereceğim.

WordPress Yazı Sürümlerini Kapatmak

WordPress yazı sürümlerini kapatmak için wp-config.php dosyanıza aşağıdaki kodu yerleştirmeniz yeterli olacaktır. Bu kodu, <?php ve ?> tagları arasında boş bir satıra eklemeyi unutmayın.

define('WP_POST_REVISIONS', false);

WordPress Yazı Sürümlerine Limit Koymak

WordPress yazı sürümlerine limit koymak için gene wp-config.php dosyanıza aşağıdaki kodu yerleştirmeniz yeterli olacaktır. Sayısını istediğiniz şekilde belirleyebilirsiniz. Burada son 3 sürüm olarak limit konmuştur.

define('WP_POST_REVISIONS', 3);

WordPress Yazı Sürümlerini Silmek

WordPress yazı sürümlerinizi veri tabanından temizlemek için basit bir yol bulunmaktadır. Çoğu yerde bunu eklentilerle yaptırsalar da ben bunu doğru bulmamaktayım. WordPress’i en az eklenti ile kullanmak en mantıklı olanıdır.

Aşağıdaki sql sorgusunu ister phpMyAdmin üzerinde çalıştırın isterseniz başka yöntemler kullanın farketmez. Yazı sürümleri silinecektir.

DELETE a,b,c
FROM wp_posts a
LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id)
LEFT JOIN wp_postmeta c ON (a.ID = c.post_id)
WHERE a.post_type = 'revision'

Php Ders 3 – Veri Tipleri

Php’de, diğer dillerde de olduğu gibi, verinin farklı türleri vardır. Bu veri türlerinin değişik kullanım alanları vardır.

  • Integer: “Tüm Numaralar”
  • Float: “4.2 gibi sayılar”
  • String: “Metinler”
  • Array: “Diziler birden fazla data tiplerini bulundurabilir.”
  • Boolean: “İkili değer sistemidir. True, False gibi.”
  • Constant: “Değiştirilemez sabitlerdir.”
  • Objeler: “OOP sisteminin objeleridir.”

Integer

Sayılardır. Bu verilerle matematiksel işlemler yapılabilir.

<?php
$degisken1 = 5;
$degisken2 = 10;
echo $toplam = $degisken1 + $degisken2;
?>

String

Metinlerdir. Yazı olarak her şey kullanılabilir. İçerisindeki sayılarla matematiksel işlemler yapılamaz. Bu veride toplama işlemi yaparsak yan yana koyma işlemi yapacaktır. Mesela 1+1 yaparsak sonucu 11 olacaktır. String veri içerisinde html kodları yazabiliriz. Bunu html kodlarını yazdırmak için de kullanabiliriz.

<?php
$string = "<p>Merhaba Dünya</p>";
echo $string;
?>

Float

Bu veri tipi ise ondalıklı sayılardır.

<?php
$float = 1.5;
?>

Boolean (Bool)

Sadece yanlış (false) ya da doğru (true) değerleri alabilen veri tipidir. 1 doğru, 0 yanlış, boş yanlış ve verinin içeriği boşluk karakteri bile olsa dolu ise doğru tanımı almaktadır Php’de. Mesela isset() fonksiyonu içine konulan şeyin var olup olmadığını kontrol ederken empty() fonksiyonu ise içinde veri var mı yok mu diye kontrol eder.

<?php
$booltrue = TRUE;
$booltrue2 = 1;
$booltrue3 = "Merhaba Dünya";
$boolfalse = False;
$boolfalse2 = 0;
$boolfalse3 = "";

Constants

Bu veriler değiştirilemez sabitlerdir. Bir defa tanımını yaparsınız ve bir daha o tanımdan başkasına değiştirilemez. İsimleri büyük harf olmak zorundadır.

<?php
define("ISIM", "Erhan");
echo ISIM;
?>

Array

Diziler içerisinde birden fazla veri taşıyabilen bir veri türüdür. İçerisinde istediğimiz sayıda veri koyabiliriz. Değişik tanımlamaları vardır.

<?php
$array = array("Erhan", "Kılıç", 1987, false);

Bir diğer eleman tanımlama yöntemi ise aşağıdaki gibidir. Bu yöntemde en son sıraya veri eklemektedir.

$array[] = "Nasılsınız";

Dizinin içindeki verilere ise anahtarları ile ulaşabiliriz. Dizilerde verilerin yerini temsil eden anahtarlar 0’dan başlar. Mesela ilk dizimizdeki ilk veriye ulaşmak için aşağıdaki gibi hareket ederiz;

<?php
echo $array[0];

Associative Array

Bu dizide ise anahtarları kendimiz belirliyoruz.

<?php
$array = array(
"isim" => "Erhan",
"soyad" => "Kılıç",
"yas" => 28
);
 
echo "İsim: " . $array["isim"] . "<br/>Soyad: " . $array["soyad"];

Sonraki Ders: Php Ders 4 – Operatörler

Php Ders 2 – Değişkenler

Değişkenin en basit tanımı, istediğimiz verileri saklı tutması için kullanılan yapılardır. Boş bardağa benzetebilirsiniz. Bardağa ne istersek onu koyabiliriz.

Php‘de değişenlerin isimleri $ işareti ile başlar. İsimde türkçe karakter, boşluk, tire (-), özel karakterler kullanamayız. Örnek bir değişken tanımlama yapalım;

<?php
$isim = "Erhan";
$yer = "Türkiye";
$tam_isim ="Erhan Kılıç";
$isim = $tam_isim;
$yil = 2015;
?>
<!DOCTYPE html>
<html>
<head>
<title>Erhan Kılıç</title>
</head
<body>
<h1><?php echo $isim ?></h1>
<h3>Location: <?php echo $yer ?></h3>
</body>
</html>

Php‘de kodlarımızın sonuna (;) işareti koyarız. Bu o satırda kodun sonlandığını gösterir. Tabi aynı satırda farklı kodlar yazabiliriz. Örneğimizde görüldüğü üzere değişkenlere istediğimiz şekilde tanımlama yapabiliyoruz. Birbirlerine eşitleme yapabiliyoruz. Sayı tanımlaması yaparken tırnak işaretine ihtiyaç duymuyoruz. Bir sonraki dersimizde veri tiplerini anlatacağım. O vakit daha detayına inmiş olacağız.

Kod yazdıkça ve çalışmamız büyüdükçe, hangi kodu ne amaçlı yazdığımızı hatırlamak ve başkasının da okumasını kolaylaştırmak için yorum yazabiliriz. Yorumlar Php yorumlayıcı tarafından es geçilen yazılardır. İçerisinde Php kodu bile olsa es geçecektir. Örnek olarak yorum olan kodlar yazalım;

<?php
// Bu benim ismim.
$isim = "Erhan";
 
// $yer = "Türkiye";
/* Yer: Türkiye
bla bla bla
*/
$tam_isim ="Erhan Kılıç";
$isim = $tam_isim;
?>

Tek bir satırı yorum yapmak için başına (//) koymamız yeterlidir. Birden fazla satırı yorum yapmak için ya her satırın başına (//) koymalıyız ya da daha kolay olan bir yöntemi uygularız. Başına (/*) işareti, sonuna ise (*/) işareti koyarız.

Php‘de çalışma şekli yukarıdan aşağıya doğrudur. Yani yukarıda bir değişkene değer verdikten sonra aşağıda başka bir değer verdiğimizde, değişkenin son içeriği aşağıda verdiğimiz değerdir. Ama o değeri verdiğimiz satıra kadar olan kısımda ilk değer geçerlidir.

Php‘de satırlardaki boşluklar da görmezden gelinmektedir. Yani iki satır arasındaki boşluklar Php için bir anlam ifade etmemektedir. Fakat aşağıdaki gibi değişken tanımlamalarında boşluklar için aynı durum geçerli değildir.

<?php
$degisken = " Merhaba ";
?>

Sonraki Ders: Php Ders 3 – Veri Tipleri

PHP Ders 1 – PHP Nedir?

Php sunucu taraflı çalışan bir programlama dilidir. 1995 yılında yayınlanmıştır ve o zamanki açılımı (Kişisel Web Sayfası) Personal Home Page’dir. Şimdi ise açılımı Hypertext Preprocessor.

Sunucu taraflı çalışan demek, Html içine entegre edilmiş kodların istemcinin (tarayıcı vs) isteklerini sunucu tarafından işledikten sonra istemciye html olarak sunmaktır. İşlem tam olarak aşağıdaki gibidir;

Server-Vs-Client

Bilgisayarımız ile sunucuya bir istek (HTTP Request) göndeririz. Sunucu bu isteğe cevap vermeden önce isteğin olduğu sayfadaki Php kodlarını çalıştırır ve sonucunu bir Html sayfa olarak bize gönderir. Biz de tarayıcımızda görüntüleriz.

İlk örneğimizi yapalım;

<body>
<p>
Hello <?php echo "World"; ?>
</p>
</body>

<?php tagı Php kodlarının başladığını belirtir. ?> ise Php kodların bittiğini belirtir. Echo kodumuz ise ekrana tırnak işaretleri arasındakini yazdırmaya yarar. Echo “World”; yazdığımızda sayfa önizlemesinde Hello World gözükür. Php kodları gözükmez. Sayfa kaynağında da gözükmez. Çünkü sunucu Php kodunu işler ve Html kodu olarak istemciye geri dönüş yapar.

Php kodlarını gene php uzantılı dosyalarda çalıştırabiliriz. Aynı zamanda, sunucunun, Php dilini yorumlayabilmesi için, Php‘nin yüklü olması gerekmektedir.

Php çalışma ortamı oluşturmak için bilgisayarınıza php yüklemeniz gerekmektedir. Php yüklediğinizde, yazdığınız kodları terminalden çalıştırabilecek durumda olursunuz. Mesela “php program_dosyasi.php” gibi bir komutla çalıştırabilirsiniz. Fakat php, web ortamında çalışmak için uygun olduğundan, web sayfalarını görüntülemek için web sunucusu kurmanız gerekmektedir. Windows ortamı için XAMPP kurmanızı tavsiye ederim. İnternette kurulumu ile ilgili bir sürü kaynak bulabilirsiniz. Eğer ubuntu gibi linux dağıtımı kullanıyorsanız, ubuntu’ya lamp kurulumu yazımı okuyabilirsiniz.

Sonraki Ders: Php Ders 2 – Değişkenler

WordPress Temasına Pluginsiz Sonsuz Scroll Ekleme

Bu yazımda size wordpress temasına plugin kullanmadan sonsuz scroll eklemeyi anlatacağım. Bu yazım makale en doğru makale olacaktır. Çünkü daha önce kendim sonsuz scroll eklemek için araştırm yaptığımda ya plugin kullanılarak anlatan makaleler ya da index.php dosyasında çalışan ama category.php ya da author.php gibi dosyalarında doğru çalışmayan yöntemler anlatan makaleler bulmuştum.  Diğer dosyalarda doğru çalışmıyorlardı. Çünkü örnek verirsem kategori dosyasında 2. sayfa ve sonrasının yazılarını yüklerken kategoriye göre yüklemiyordu. Tüm sayfaları yüklüyordu.

Bu işlemleri yaparken AdminLteWpTheme‘nin kaynak kodlarına bakabilirsiniz. Orada bunun çalışan halinin kodları mevcuttur.

Öncelikle aşağıdaki kodları functions.php dosyasına ekliyoruz.

//Infinite Scroll
function wp_infinitepaginate(){
 $loopFile = $_POST['loop_file'];
 $paged = $_POST['page_no'];
 $action = $_POST['what'];
 $value = $_POST['value'];
 
 if($action == 'author_name'){
 $arg = array('author_name' => $value, 'paged' => $paged, 'post_status' => 'publish' );
 }elseif($action == 'category_name'){
 $arg = array('category_name' => $value, 'paged' => $paged, 'post_status' => 'publish' );
 }elseif($action == 'search'){
 $arg = array('s' => $value, 'paged' => $paged, 'post_status' => 'publish' );
 }else{
 $arg = array('paged' => $paged, 'post_status' => 'publish');
 }
 # Load the posts
 query_posts( $arg );
 get_template_part( $loopFile );
 
 exit;
}
add_action('wp_ajax_infinite_scroll', 'wp_infinitepaginate'); // for logged in user
add_action('wp_ajax_nopriv_infinite_scroll', 'wp_infinitepaginate'); // if user not logged in

Bir ajax isteği geldiği zaman bu fonksiyonumuz çalışacak, loop oluşturacak ve loop dosyamızı çağıracaktır. Fonksiyonumuzda bazı POST verileri alıyoruz.

“loop_file” bizim loop dosyamızın ismidir. Bu dosyamız html kodlarını oluşturacaktır. Daha sonra ise javascript ile append edeceğiz.

“page_no” sayfa numarasıdır. Bununla hangi sayfanın yazılarını çekeceğimizi belirliyoruz.

“what” ise neye göre sayfaları istediğimizdir. Kategori mi, yazar mı, arama mı gibi.

“value” ise eğer kategori, yazar gibi isteklerde kategori slug ismi, yazar nicename gibi veriyi içerir.

If sorgulaması ile burada ne istediğimize göre query_posts için parametrelerimizi oluşturuyoruz. Daha sonra query_posts ile loop oluşturulup get_template_part ile loop dosyamızı çağırıyoruz.

add_function fonksiyonları ile wp-admin/wp-ajax.php‘ye bir ajax isteği yollandığın fonksiyonumuzun çalıştırılmasını sağlıyoruz. Ajax isteği yollarken action postu içerisinde infinite_scroll gönderiyoruz. Yani başka isimler ve fonksiyonlar ile farklı farklı ajax işlemleri oluşturabilirsiniz.

Daha sonra ise loop dosyamızı oluşturacağız. İsmini burada istediğiniz gibi verebilirsiniz ama unutmayın, “loop_file” postunda onun ismini göndermelisiniz. Ben loop.php ismini verdim. Burada index.php dosyasından direk loopunuzu kopyalayabilirsiniz. Ben AdminLteWpTheme‘nin içindekinden örnek olarak koyuyorum buraya.

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
 <!-- timeline time label -->
<li class="time-label">
 <span class="bg-green"><?php the_time('d.m.Y ') ?></span>
 </li>
 <!-- /.timeline-label -->
 <!-- timeline item -->
<li>
 <i class="fa fa-newspaper-o bg-blue"></i>
<div class="timeline-item">
 <span class="time"><i class="fa fa-clock-o"></i> <?php the_time('H:i') ?></span>
<h3 class="timeline-header"><a href="<?php the_permalink() ?>" alt="<?php the_title(); ?>" title="<?php the_title(); ?> "><?php the_title(); ?></a></h3>
<div class="timeline-body">
<div class="row">
<div class="col-lg-3 col-sm-4 col-xs-6">
 <a href="<?php the_permalink() ?>" title="<?php the_title(); ?>">
 <?php $resim_yolu = wp_get_attachment_image_src( get_post_thumbnail_id(), 'medium'); if ( has_post_thumbnail() ) { ?>
 
 <img src="<?php echo $resim_yolu[0]; ?>" class="img-responsive" alt="<?php the_title(); ?>" title="<?php the_title() ?>" />
 <?php } ?>
 </a>
 </div>
<div class="col-lg-9 col-sm-8 col-xs-6">
 <?php the_excerpt_rss(); ?>
<div style="margin-top: 10px">
 <a class="btn btn-primary btn-xs" href="<?php the_permalink() ?>" title="<?php the_title(); ?>">Read more</a>
 </div>
 </div>
 </div>
 </div>
<div class="timeline-footer">
 <i class="fa fa-user"></i> <a href="<?php echo esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ); ?>" title="<?php the_author(); ?>"><?php the_author(); ?></a> | <i class="fa fa-folder-open"></i> <?php the_category(', ') ?> | <i class="fa fa-comments"></i> <?php comments_number('0 comment', '1 comment', '% comments' );?>
 </div>
 </div>
 </li>
 <!-- END timeline item -->
 <?php endwhile; ?>
<?php endif; ?>

En son olarak da index.php, category.php gibi dosyalarımızda javascript kodlarımızı yazmalıyız.

<script type="text/javascript">
 jQuery(document).ready(function($) {
 var count = 2;
 var total = <?php echo $wp_query->max_num_pages; ?>;
 $(window).scroll(function(){
 if ($(window).scrollTop() == $(document).height() - $(window).height()){
 if (count > total){
 return false;
 }else{
 loadArticle(count);
 }
 count++;
 }
 });
 
 function loadArticle(pageNumber){
 $('a#inifiniteLoader').show('fast');
 $.ajax({
 url: "<?php echo admin_url(); ?>admin-ajax.php",
 type:'POST',
 data: "action=infinite_scroll&page_no="+ pageNumber + '&loop_file=loop',
 success: function (html) {
 $('li#inifiniteLoader').hide('1000');
 $("ul.timeline").append(html);
 }
 });
 return false;
 }
 
 });
</script>

Count değişkeni bizim sayfa numaramızdır. İlk başta 2 çünkü ilk başta 2. sayfanın yazıları yüklenecek. Her ajax isteğinde bir sayı artırılmakta. Total değişkenimiz ise toplam sayfa sayımızdır. Bu sayede her sayfa aşağıya indiğinde çalışmayacak şekilde ayarlayacağız.

$(window).scroll(function(){} ); fonksiyonu ile sayfa aşağıya inince ajax isteği göndermesini sağlayacağız ve count değişkenini bir artıracağız. Tabi count değişkenimiz total değişkenimizden daha büyük olduğu sürece diye bir If sorgusunu yazıyoruz ki gereğinden fazla çalışmasın.

loadarticle() fonksiyonumuz ile ilk başta yükleme iconunun gözükmesini sağlıyoruz. Daha sonra ise ajax isteğini göndermekte. data verisinde gönderilerek post verilerini inceleyebilirsiniz. Kategori, yazar gibi yerlerde de what ve value verilerini eklemeyi unutmuyoruz. Örnek olarak category.php dosyasındakini yazıyorum. Orada what ve value verilerini görebilirsiniz.

Umarım bu yazım işinize yaramıştır.

<script type="text/javascript">
 jQuery(document).ready(function ($) {
 var count = 2;
 var total = <?php echo $wp_query->max_num_pages; ?>;
 $(window).scroll(function () {
 if ($(window).scrollTop() == $(document).height() - $(window).height()) {
 if (count > total) {
 return false;
 } else {
 loadArticle(count);
 }
 count++;
 }
 });
 
 function loadArticle(pageNumber) {
 $('a#inifiniteLoader').show('fast');
 $.ajax({
 url: "<?php echo admin_url(); ?>admin-ajax.php",
 type: 'POST',
 data: "action=infinite_scroll&page_no=" + pageNumber + '&loop_file=loop&what=category_name&value=<?php echo $yourcat->slug; ?>',
 success: function (html) {
 $('li#inifiniteLoader').hide('1000');
 $("ul.timeline").append(html);
 }
 });
 return false;
 }
 
 });
</script>