IPv6 Nedir ve Konfigürasyonu Nasıl Yapılır

IPv6 (Internet Protocol version 6) IP adresleme sisteminin sonraki sürümüdür. IPv6, IPv4'ten daha yüksek miktarda adres alanı sunar ve daha iyi güvenlik özellikleri içerir. IPv6 adresleri, IPv4 adreslerinden daha uzun olarak 128 bit uzunluğunda olup, daha yüksek sayıda cihazın internete bağlanmasına olanak tanır. Bu nedenle, IPv6, internetin gelecekteki ihtiyaçlarını karşılamak için tasarlanmıştır.

IPv6 kullanılmasının birkaç nedeni vardır:

  1. Adres yokluğu: IPv4 adresleri, internetteki cihazların sayısının hızla artması nedeniyle tükenmeye başlamıştır. IPv6, daha fazla adres alanı sunarak bu sorunu çözmeye çalışır.
  2. Daha yüksek güvenlik: IPv6, IPv4'ten daha iyi güvenlik özellikleri içerir. Örneğin, IPv6, IPsec ile birlikte gelir ve cihazlar arasındaki iletişimi şifreler.
  3. Daha hızlı ağ performansı: IPv6, IPv4'ten daha az yer kaplar ve dolayısıyla daha hızlı ağ performansı sunar.
  4. Daha esnek yapı: IPv6, IPv4'ten daha esnek bir yapıya sahiptir ve dolayısıyla daha kolay yönetilir.
  5. IoT: Internet of Things (IoT) gibi cihazların sayısının hızla artması, IPv6'nın kullanılmasını gerekli kılmaktadır.
  6. Mobil cihazlar: Mobil cihazlar, IPv4 adresleri ile sınırlıdır ve dolayısıyla IPv6 kullanılması gerekmektedir.

Bu nedenler ve daha fazlası ile IPv6 kullanılması gereklidir.

IPv6 adres yapısı, 128 bit uzunluğunda bir dizidir ve 8 parçaya ayrılır. Her parça, 16 bit uzunluğunda bir hexadecimal sayıdır. Parçalar arasında iki nokta üst üste (:) kullanılır. Örnek bir IPv6 adresi: 2001:0db8:85a6:0000:0000:8a2e:0370:7335.

IPv6 adres yapısı, IPv4 adres yapısından farklıdır. IPv4 adres yapısı, 32 bit uzunluğunda bir dizidir ve 4 parçaya ayrılır. Her parça, 8 bit uzunluğunda bir sayıdır. Parçalar arasında nokta (.) kullanılır. Örnek bir IPv4 adresi: 192.168.1.1

IPv6 kullanılması, dünya genelinde hızla yaygınlaşmaktadır. Ancak, tüm ağlar ve cihazlar tamamen IPv6'ya geçmeden önce, geçiş bir süreç olacaktır. Bu süreç, IPv4 ve IPv6 arasında çalışan çoklu protokol desteği ve IPv4 adreslerinin tükenmeden önce IPv6'ya dönüştürülmesi gibi faktörlere bağlıdır. Ipv4 ve Ipv6'yı bir tablo ile karşılaştıralım.


IPv4'ün tükenmesiyle beraber IPv6 kullanımı gün geçtikçe artıyor. Ülkemizde bulunan operatörler müşterilerine IPv6 tahsis ediyor ve kullanım kurumsal bağlantılarda daha yoğun olmak üzere artarak devam ediyor. IPv6 kullanımıyla ilgili bilgi almak için aşağıdaki linkten faydalanabilirsiniz.

https://www.google.com/intl/en/ipv6/statistics.html#tab=per-country-ipv6-adoption

Cisco ve Huawei cihazlarda IPv6 konfigürasyonu ve kontrolü için gerekli komutların bazıları aşağıdaki gibidir.

Cisco

ipv6 enable

Interface altında IPv6 tanımlama

1. ipv6 address {ipv6-prefix/prefix-length | prefix-name sub-bits/prefix-length}


IPv6 static route tanımlama

1. ipv6 route { ipv6 address/mask }   gigabitethernet { value } { destination ipv6 address }


IPv6 BGP tanımlama

1. router bgp xxxxxx
2. neighbor { destination ipv6 address }
3. remote-as { value }
4. description { name }  
5. address-family ipv6 unicast
6. route-policy { policy name }  in
7. maximum-prefix { value } { value }
8. route-policy { policy name }  out
9. soft-reconfiguration inbound always


IPv6 prefix-list tanımlama

1. prefix-set { prefix name }
2.   { ipv6 address/mask }  ,
3.   { ipv6 address/mask }  ,
4.   { ipv6 address/mask }   
5. end-set


IPV6 Route Policy oluşturma

1. route-policy { policy name }
2. if destination in { prefix name } then
3. drop
4. elseif destination in { prefix name }then
5. set local-preference { value }
6. set community { value } additive
7. pass
8. endif
9. end-policy

Cisco IPv6 Kontrol Komutları

show ipv6 nat statistics
show ipv6 nat translations
show ipv6 nd destination
show ipv6 nd on-link prefix
show ipv6 nd raguard counters
show ipv6 nd raguard policy
show ipv6 nd secured certificates
show ipv6 nd secured counters interface
show ipv6 nd secured nonce-db
show ipv6 nd secured solicit-db
show ipv6 nd secured timestamp-db
show ipv6 neighbor binding
show ipv6 neighbors
show ipv6 nhrp
show ipv6 nhrp multicast
show ipv6 nhrp multicast stats
show ipv6 nhrp nhs
show ipv6 nhrp summary
show ipv6 nhrp traffic
show bgp ipv6
show bgp ipv6 community
show bgp ipv6 community-list
show bgp ipv6 dampened-paths
show bgp ipv6 filter-list
show bgp ipv6 flap-statistics
show bgp ipv6 inconsistent-as
show bgp ipv6 labels
show bgp ipv6 neighbors
show bgp ipv6 paths
show bgp ipv6 peer-group
show bgp ipv6 prefix-list
show bgp ipv6 quote-regexp
show bgp ipv6 regexp
show bgp ipv6 route-map
show bgp ipv6 summary
show bgp vpnv6 unicast
show ipv6 ospf
show ipv6 ospf border-routers
show ipv6 ospf database
show ipv6 ospf event
show ipv6 ospf flood-list
show ipv6 ospf graceful-restart
show ipv6 ospf interface
show ipv6 ospf neighbor
show ipv6 ospf request-list
show ipv6 ospf retransmission-list
show ipv6 ospf statistics
show ipv6 ospf summary-prefix
show ipv6 ospf timers rate-limit
show ipv6 ospf traffic
show ipv6 ospf virtual-links
show ipv6 pim anycast-RP
show ipv6 pim bsr
show ipv6 pim df
show ipv6 pim df winner
show ipv6 pim group-map
show ipv6 pim interface
show ipv6 pim join-prune statistic
show ipv6 pim limit
show ipv6 pim neighbor
show ipv6 pim range-list
show ipv6 pim topology
show ipv6 pim traffic
show ipv6 pim tunnel
show ipv6 policy
show ipv6 port-map
show ipv6 prefix-list
show ipv6 protocols
show erm statistics
show fm ipv6 pbr all
show fm ipv6 pbr interface
show fm ipv6 traffic-filter
show fm raguard
show ipv6 access-list
show ipv6 cef
show ipv6 cef adjacency
show ipv6 cef events
show ipv6 cef exact-route
show ipv6 cef neighbor discovery throttling
show ipv6 cef non-recursive
show ipv6 cef platform
show ipv6 cef summary
show ipv6 cef switching statistics
show ipv6 cef unresolved
show ipv6 cef vrf
show ipv6 cef with epoch
show ipv6 cef with source
show ipv6 cga address-db
show ipv6 cga modifier-db
show ipv6 destination-guard policy
show ipv6 dhcp
show ipv6 dhcp binding
show ipv6 dhcp conflict
show ipv6 dhcp database
show ipv6 dhcp guard policy
show ipv6 dhcp interface
show ipv6 dhcp pool
show ipv6 dhcp relay binding
show ipv6 eigrp events
show ipv6 eigrp interfaces
show ipv6 eigrp neighbors
show ipv6 eigrp topology
show ipv6 eigrp traffic
show ipv6 flow cache aggregation
show ipv6 flow export
show ipv6 general-prefix
show ipv6 inspect
show ipv6 interface
show ipv6 local pool
show ipv6 mfib
show ipv6 mfib active
show ipv6 mfib count
show ipv6 mfib global
show ipv6 mfib instance
show ipv6 mfib interface
show ipv6 mfib route
show ipv6 mfib status
show ipv6 mfib summary
show ipv6 mld groups
show ipv6 mld groups summary
show ipv6 mld host-proxy
show ipv6 mld interface
show ipv6 mld snooping
show ipv6 mld ssm-map
show ipv6 mld traffic
show ipv6 mobile binding
show ipv6 mobile globals
show ipv6 mobile home-agents
show ipv6 mobile host groups
show ipv6 mobile router
show ipv6 mobile traffic
show ipv6 mobile tunnels
show ipv6 mrib client
show ipv6 mrib route
show ipv6 mroute
show ipv6 mroute active
show ipv6 mtu
show ipv6 rip
show ipv6 route
show ipv6 route shortcut
show ipv6 route summary
show ipv6 route vrf
show ipv6 routers
show ipv6 rpf
show ipv6 snooping capture-policy
show ipv6 snooping counters
show ipv6 snooping features
show ipv6 snooping policies
show ipv6 source-guard policy
show ipv6 spd
show ipv6 static
show ipv6 traffic
show ipv6 tunnel
show ipv6 virtual-reassembly
show ipv6 virtual-reassembly features
show ipv6 wccp
show ipv6 wccp global counters
show isis ipv6 rib
show monitor event-trace vpn-mapper
show ospfv3 border-routers
show ospfv3 database
show ospfv3 events
show ospfv3 flood-list
show ospfv3 graceful-restart
show ospfv3 interface
show ospfv3 max-metric
show ospfv3 neighbor
show ospfv3 request-list
show ospfv3 retransmission-list
show ospfv3 statistic
show ospfv3 summary-prefix
show ospfv3 timers rate-limit
show ospfv3 traffic
show ospfv3 traffic neighbor
show ospfv3 virtual-links
show platform 6rd tunnel-endpt
show platform software ipv6-multicast
show platform software vpn
show tunnel 6rd
show tunnel 6rd destination
show tunnel 6rd prefix

Huawei

Interface altında IPv6 tanımlama

1. ipv6 enable
2. ipv6 address { ipv6 address/mask } 

 

IPv6 static route tanımlama

1. ipv6 route-static { ipv6 address ve mask }  interface { value } { destination ipv6 address }


IPv6 BGP tanımlama

1. BGP xxxxxx
2. peer { destination ipv6 address } as-number { value }
3. ipv6-family unicast
4. peer { destination ipv6 address } enable
5. peer { destination ipv6 address } route-policy { policy name } import
6. peer { destination ipv6 address } route-policy { policy name } export


IPv6 prefix-list tanımlama

1. ip ipv6-prefix { prefix name } index { value } permit { ipv6 address ve mask }  


IPv6 Route Policy oluşturma

1. route-policy { policy name } permit node { value }
2. if-match ipv6 address prefix-list { prefix name }
3. apply local-preference { value }
4. apply community { community id }

Huawei IPv6 Kontrol Komutları

display ipv6 interface
display ipv6 interface tunnel
display ipv6 neighbors
display ipv6 pathmtu
display ipv6 socket
display ipv6 statistics
display ipv6 routing-table
display ipv6 routing-table limit
display ipv6 routing-table protocol
display ipv6 routing-table statistics
display ipv6 routing-table time-range
display rawip ipv6 statistics
display snmp-agent trap feature-name ipv6 all
display tcp ipv6 authentication-statistics
display tcp ipv6 statistics
display tcp ipv6 status
display this ipv6 interface
display udp ipv6 statistics
display dhcpv6 client
display dhcpv6 client prefix
display dhcpv6 client statistics
display dhcpv6 duid
display dhcpv6 relay prefix-delegation
display dhcpv6 relay statistics
display dhcpv6 pool
display dhcpv6 relay
display dhcpv6 server
display dhcpv6 server group
display dhcpv6 statistics
display dns ipv6 dynamic-host
display ipv6 host
display isis ipv6 bfd interface
display isis ipv6 bfd session
display bgp ipv6 bfd session
display bgp ipv6 routing-table
display bgp ipv6 routing-table statistics
display ip ipv6-prefix
display ipv6 fib
display default-parameter tcp6
display icmpv6 statistics
display ipv6 attack-source overlapping-fragment
display rawip ipv6 statistics
display snmp-agent trap feature-name ipv6 all
display tcp ipv6 authentication-statistics
display tcp ipv6 statistics
display tcp ipv6 status
display this ipv6 interface
display udp ipv6 statistics

Windows bilgisayarlar için IPv6 konfigürasyonu aşağıdaki adımlar izlenerek yapılabilir:

  1. Başlamak için, Başlat menüsünde arama kutusuna "cmd" yazın ve "Command Prompt" uygulamasını seçin.
  2. Command Prompt açıldıktan sonra, "ipv6" yazın ve enter tuşuna basın. Bu, sisteminizdeki IPv6 yapılandırmasını gösterir.
  3. IPv6 adresini değiştirmek için "netsh interface ipv6 set address" komutunu kullanabilirsiniz. Örneğin, "netsh interface ipv6 set address interface=Ethernet address=2001:0db8:85a3:0000:0000:8a2e:0370:7334" komutu ile Ethernet arayüzü için adres değiştirebilirsiniz.
  4. Alt ağ maskesini değiştirmek için "netsh interface ipv6 set prefixlength" komutunu kullanabilirsiniz. Örneğin, "netsh interface ipv6 set prefixlength interface=Ethernet prefixlength=64" komutu ile Ethernet arayüzü için alt ağ maskesini 64 olarak değiştirebilirsiniz.
  5. Varsayılan ağ geçidini değiştirmek için "netsh interface ipv6 set route" komutunu kullanabilirsiniz. Örneğin, "netsh interface ipv6 set route interface=Ethernet next-hop=2001:0db8:85a3:0000:0000:8a2e:0370:7334" komutu ile Ethernet arayüzü için varsayılan ağ geçidini 2001:0db8:85a3:0000:0000:8a2e:0370:7334 olarak değiştirebilirsiniz.
  6. Değişiklikleri kaydetmek için "netsh interface ipv6 set global" komutunu kullanabilirsiniz. Örneğin, "netsh interface ipv6 set global randomizeidentifiers=disabled" komutu ile rastgele tanımlayıcıları devre dışı bırakabilirsiniz.
  7. Değişiklikleri geri almak için "netsh interface ipv6 reset" komutunu kullanabilirsiniz.

Not: Bu komutlar yönetici hakları gerektirir. Bu komutları çalıştırmadan önce Command Prompt yönetici olarak çalıştırmanız gerekir.

XAMPP için PHP Yazılım Upgrade Nasıl Yapılır

 PHP Yazılımını upgrade etmek için ilk olarak aşağıdaki URL'e gidilir ve yeni yazılım versiyonu bilgisayara indirilir. Burada XAMPP server üzerinde PHP yazılımını nasıl upgrade edeceğimizi yazacağız. Diğer uygulamalar da benzer şekilde yapılabilir. İşletim sistemi için uygun olan XAMPP yazılımı dosya seçilerek indirilmelidir.

https://www.apachefriends.org/download.html

Bilgisayarınıza indirdiğiniz yazılımı bilgisayarınızda bir klasöre açın. Sunucu üzerinde çalışan Apache servisini durdurun. Sunucudaki PHP yazılımının klasörünün adını değiştirin (Kesinlikle silmeyin) İndirip diske açtığınız klasördeki PHP klasörünü sunucuda eski PHP klasörünün olduğu dizine kopyalayın. Eksi PHP klasöründe bulunan php.ini dosyasını yeni klasör içindeki dosya ile değiştirin ve Apache servisini tekrar başlatın.

PHP içine daha önce modül yüklediyseniz Apache açılırken hata verecektir. Yüklediğiniz bu modülleri de aynı klasöre diğer klasörden kopyalayıp servisi tekrar açmayı denemelisiniz. Sorun devam ediyorsa geri dönüş yeni klasörü silip eski klasörün adını tekrar PHP yapmak şeklinde olacaktır. İşlem tamamlandıktan sonra versiyon testlerini info.php dosyasından yapabilirsiniz.

      

Oracle SQL ve Postgre SQL de Pivot Nasıl Yapılır

 Oracle SQL'de aşağıdaki gibi yaptığımız Pivot işlemini PostgreSQL'de yapabilmek için Crosstab komutu kullanılır. Yapacağımız örnekte dört kolona sahip bir tablo düşünelim. KolonBilgiler kolonu aynı kolona yazılmış bilgi başlıklarını, KolonDegerler kolonu bilgi başlıklarına karşılık gelen değerleri içersin. Çıktı olarak ilk iki kolonu tablodan gelecek diğer dört kolonu bilgi başlıklarının kolon olarak gösterileceği bir yapı olsun. Toplamda altı kolon oluşturacağız.

SELECT * FROM
(SELECT Kolon1, Kolon2, KolonBilgiler, KolonDegerler FROM Tablo_adı
) d PIVOT (
MAX(KolonDegerler )
FOR KolonBilgiler
IN (Bilgi1, Bilgi2, Bilgi3,Bilgi4
)) piv
WHERE .....

Yukarıdaki Oracle SQL Pivot sorgusunun Postgre DB karşılığı aşağıdaki gibidir.

SELECT *
FROM crosstab ('SELECT "Kolon1", "Kolon2", "KolonBilgiler", "KolonDegerler ", FROM "Tablo_adı" ORDER  BY 1,2'
, $$SELECT unnest('{Bilgi1, Bilgi2, Bilgi3,Bilgi4}'::text[])$$
) AS ct (Kolon1 text,  Kolon2 text, Bilgi1 text,
Bilgi2 text, Bilgi3 text, Bilgi4 text) 
WHERE .....

Burada dikkat edilmesi gereken konu bilgilerin ve bilgilerin altında seçilecek değer kolonu hariç diğer kolonların hepsinin ct içinde belirtilmesi gerekir. Belirtilmezse crosstab içinde uyumsuz kolon sayısı olduğu uyarısını alabilirsiniz.



Python IP Doğrulama (IPv4 IPv6 Public Private)

 Python içinde hazır gelen Ipaddress modülü bir IP adresini doğrulamak ve tanımlamak için bize yardımcı olacaktır. IP adresi IPv4, IPv6, Public veya private olabilir. Bu ayrımı küçük bir fonksiyon ile anlayabiliriz.

def validate_ip_address(ip_string):
    try:
        ip_object = ipaddress.ip_address(ip_string)
        if ipaddress.ip_address(ip_string).is_private == False:
            if ip_object.version == 4:
                print("IPv4")
                return "IPv4"
            else:
                print("IPv6")
                return "IPv6"
        else:
            print("The IP address is private")
            return "private"
    except ValueError:
        print("The IP address is not valid")
    return "NotValid"

validate_ip_address(192.168.0.1)

Bir IP adresinin Network IP'sini bulmak istiyorsak aşağıdaki kod bize yardımcı olacaktır.

ip_address=192.168.1.55/24
net_ip=ipaddress.ip_network(ip_address, strict=False)
print(net_ip)

Ayrıntılı bilgi için aşağıdaki adrese göz atabilirsiniz.

ipaddress — IPv4/IPv6 manipulation library

https://docs.python.org/3/library/ipaddress.html

Kaynak kod: https://github.com/python/cpython/blob/3.10/Lib/ipaddress.py

IP versiyon 4 - IP versiyon 6 - Public IP - Private IP 

IP Versiyon kontrolü.

IP bilgileri nasıl listelenir:

-------------------------------------------------
import ipaddress
 
# Initializing an IPv4 Network.
network = ipaddress.IPv4Network("192.168.1.0/24")

print(network)
 
# Network address of the network: 192.168.1.0
print("Network address of the network:", network.network_address)
 
# Broadcast address: 192.168.1.255
print("Broadcast address:", network.broadcast_address)
 
# Network mask: 255.255.255.0
print("Network mask:", network.netmask)
 
# with netmask: 192.168.1.0/255.255.255.0
print("with netmask:", network.with_netmask)
 
# with_hostmask: 192.168.1.0/0.0.0.255
print("with_hostmask:", network.with_hostmask)
 
# Length of network prefix in bits: 24
print("Length of network prefix in bits:", network.prefixlen)
 
# Total number of hosts under the network: 256
print("Total number of hosts under the network:", network.num_addresses)
 
# Overlaps 192.168.0.0/16: True
print("Overlaps 192.168.0.0/16:", network.overlaps(ipaddress.IPv4Network("192.168.0.0/16")))
 
# Supernet: 192.168.0.0/23
print("Supernet:", network.supernet(prefixlen_diff=1))
 
# The network is subnet of 192.168.0.0/16: True
print("The network is subnet of 192.168.0.0/16:",
      network.subnet_of(ipaddress.IPv4Network("192.168.0.0/16")))
 
# The network is supernet of 192.168.0.0/16: False
print("The network is supernet of 192.168.0.0/16:",
      network.supernet_of(ipaddress.IPv4Network("192.168.0.0/16")))
 
# Compare the network with 192.168.0.0/16: 1
print("Compare the network with 192.168.0.0/16:",
      network.compare_networks(ipaddress.IPv4Network("192.168.0.0/16")))


Python

Python Belli Bir Zaman Aralığında Çalıştırma

Python yazılımını belli saatler aralığında çalıştırmanız gerekirse aşağıdaki kodu bu amaçla kullanabilirsiniz. Kod aynı zamanda bir animasyon da içermektedir. Bist açılış kapanış saatleri arasında bir kod çalıştıracağınızı düşünelim. Kod işlem başladığında mevcut zaman aralık dışında ise ekrana animasyon çıktısı verir. Mevcut zaman aralık içerisinde ise yazılım bir sonraki adıma devam eder.

import time
import datetime
def time_in_range(start, end):
    current = datetime.datetime.now().time()
    return start <= current <= end

def typewriter(text, delay=0.1):
  for letter in text:
    print(letter, end='', flush=True)
    time.sleep(delay)
  print()

def starttime():
    start = datetime.time(9, 35, 0)
    end = datetime.time(18, 15, 0)

    result=time_in_range(start, end)
    while result==False:
        typewriter("#########################", 0.05)
        typewriter("########-BIST-########", 0.05)
        typewriter("####-"+str(datetime.datetime.now().time())+"-####", 0.05)
        result=time_in_range(start, end)
    
starttime()





Python Pandas Kullanımı

 Pandas en çok kullanılan modül olarak karşımıza çıkıyor. Bu bölümde Pandas'ın bazı önemli özelliklerinden bahsedeceğiz, pandas komutları ve kullanımını inceleyeceğiz. Pandas en kullanışlı data frame yöntemlerinden birisidir. Python code içerisinde bir database oluşturmak için kullanılır ve ram'de saklanır. Bir database'e veri yazıp sonra okumaktansa ram üzerinden bir dataframe oluşturup işlemleri bu df ile yapmak işleri çok hızlandıracaktır. Peki pandas nasıl kullanılır bakalım. İlk olarak pandas yükleyip import etmemiz gerekir. Yüklemek için;

# conda
conda install pandas
pip install pandas
# pip

Python kodumuza import etmek için;

import pandas as pd

kodu kullanılmalıdır. import komutu sonundaki as pd yeniden isimlendirmek için kullanılmaktadır ve pandas python içinde genelde pd kısaltmasıyla kullanılır, dataframe kısaltması da df şeklinde kullanılmaktadır. Basit boş bir dataframe oluşturmak için;

Data frame:

df=pd.DataFrame()

kodunu kullanabiliriz. Kodu oluşturmadan önce kolon isimlerini ve kaç adet kolon kullanacağımızı biliyorsak bu bilgilerle boş frameimizi oluşturabiliriz.

df=pd.DataFrame(columns =['kolon1','kolon2'])

Pandar df'ye genelde dictionary ile oluşturulur. Df'ye elimizdeki bir data ile oluşturmak için;

data={'kolon1': [21, 23, 24, 21], 'kolon2': [1,2,3,4]}

df = pd.DataFrame(data)

veya

data = []
data.append([21, 1, 'India'])
data.append([23, 2, 'India'])
data.append([24, 3, 'India'])
data.append([24, 4, 'India'])
df = pd.DataFrame(data, columns=['kolon1', 'kolon2', 'kolon3'])

Bir dataframe'e sabit değerli bir kolon eklemek için aşağıdaki komutu kullanabilirsiniz. Bu komut frame sonuna bir kolon ekler ve kolondaki tüm değerleri 10 yapar.

df["Percentage"] = 10

Ekleyeceğimiz kolonu sona değilde en başa veya belirli bir yere eklemek için aşağıdaki komutu kullanabilirsiniz. En başa eklemek için 0, sonraki kolon sıraları için bir artırarak kolonun yerini belirtebilirsiniz. Biz 2. sıraya (Yani 1. sıraya) bir kolon ekleyelim.

df.insert(1, 'Percentage', '10')

Data frame'i bir data ile oluşturduk buna data içeren bir kolon daha eklemek istersek;

kolon3 = ['Delhi', 'Bangalore', 'Chennai', 'Patna']

df['kolon3'] = kolon3

veya

df2 = df.assign(kolon3=['Delhi', 'Bangalore', 'Chennai', 'Patna'])

veya

Eklenecek olan kolon 2. sıraya yerleştirilecek ise;

df.insert(1, "kolon3", ['Delhi', 'Bangalore', 'Chennai', 'Patna'], True)

şeklinde kolonlar arasına yeni bir kolon yerleştirilebilir.

Pandas Frame'e Veri Ekleme:

df + 1 veya df.add(1) dataframe içindeki tüm numeric değerleri bir artırır.

df.div(10) tüm değerleri 10'a böler.

df - [1, 2] veya df.sub([1, 2], axis='columns') 1. kolondan 1, 2. kolonda 2 değerini çıkarır.

Bir pandas frame ile dictionary dataframe'i birleştirmek için append kullanılır.

df2 = {'kolon1': '15', 'kolon2': '23', 'kolon3': 'India'}

df = df.append(df2, ignore_index = True)

Bir Pandas frame ile başka bir pandas frame'i birleştirmek için concat kullanabilirsiniz.

df2 = pd.DataFrame({'kolon1': [11], 'kolon2' : [23],  'kolon3' : ['India']})

df = pd.concat([df, df2], ignore_index = True, axis = 0)

Pandas Veri Görüntüleme:

Pandas'da büyük tabloları ekranda görüntülemeye çalıştığınızda pandas size özet bir ekran çıkarır, tüm satır ve sütünları görmek istiyorsanız bazı ekler kullanmalısınız.

Tüm satırları görmek isterseniz;

pd.set_option('display.max_rows', None)
df = pd.read_csv("data.csv")
print(df)

kodunu kullanmalısınız. None yazan yere görmek istediğiniz satır sayısını yazabilirsiniz. Tüm sütünları görmek isterseniz;

pd.set_option('display.max_columns', None)
df = pd.read_csv("data.csv")
print(df)

None yazan yere görmek istediğiniz sütün sayısını yazabilirsiniz. 

Dataframe hakkında genel bilgi

df.info()

Sütünların bilgileri

df.describe()

İlk 5 satırı görmek için

df.head()

Son 7 satırı göster

df.tail(7)

Datafame içinde belirli bir satır ve sütünu görmek için;

df.loc[row, column]

index

Pandas listelerinizin yanında bir index gösterir, dosyaya yazarken bu indexin görünmesini istemiyorsanız;

    data = pd.read_sql(query, con=connection)
    data.to_csv('data.csv', index=False)

Bu şekilde index'i kapatabilirsiniz.

Pandas Framelerini Birleştirme:

Elimizde üç ader dataframe olduğunu düşünelim. Bu dataframelerin kolonları aynı ise bunları tek bir dataframe'de birleştirmek için:

frames = [df1, df2, df3]

result = pd.concat(frames)

Elimizde olan bir data frame'e bir başka dataframe'den ekleme yapacak isek append komutunu kullanabiliriz.

DataFrame.append(dataframe, ignore_index=False, verify_integrity=False, sort=None) 
ör;
result=pd.DataFrame()
result=result.append(df, ignore_index=True, verify_integrity=False, sort=None)

Duplicate verileri silme
    Single_List=Single_IP_List.drop_duplicates()
Bu komutta index'i de yeniden oluşturmak için parantez içine ignore_index=True yazılabilir veya aşağıdaki işlem yapılır.
    Single_List = Single_IP_List.reset_index(drop=True) #Duplicate veriler silindiği için index yeniden oluşturulur.
    print(Single_List)

Python Pandas kullanımı ve pandas komutları.

Diğer Konular;

Pandas DataFrame

Pandas tutorial

Pandas read_csv

Pandas groupby

Pandas merge

Pandas documentation

Pandas functions

Pandas plot

Pandas data manipulation

Pandas data analysis

PHP ile Özel Karekter Filtreleme

PHP kullanılırken form üzerinden özel karekterlerin sunucuya gönderilmesi bazı zafiyetlere neden olabilir. Zafiyetlerin ve güvenlik açıklarının engellenmesi için kullanıcılardan gelen tüm özel karekterler filtrelenmelidir. Özel karekterleri filtrelemediğiniz durumda verilerinizi koruyamayabilirsiniz. Form veya kullanıcıdan sunucuya gelen tüm veriler için mutlakan özel karekterlerin filtrelenmesi önerilir. Aşağıdaki kod özel bazı karekterlerin filtrelenmesini sağlar. Burada POST ile alınan bir veride arama yapılmaktadır, aynı işlem GET ile alınan veriye de uygulanabilir.

İlk olarak whide list uygulamak güvenlik açısından daha öenmlidir. Aşağıda gelen değerin içinde özel karekterleri filtreleyen ve IP adresini doğrulayan bir fonksiyon görüyorsunuz.

$raw_input = $_GET['IPV4'];

$IPv4 = htmlspecialchars($raw_input, ENT_QUOTES, 'UTF-8');

if  (filter_var($IPv4, FILTER_VALIDATE_IP))
{ }

Kullanıcı girdilerini doğru bir şekilde filtreleyin: Verileri htmlspecialchars() veya filter_input() gibi fonksiyonlarla filtreleyerek HTML özel karakterlerini ve diğer potansiyel zararlı karakterleri temizleyin.

$name = filter_input(INPUT_POST, $_POST["veri"], FILTER_SANITIZE_SPECIAL_CHARS);

veya

htmlspecialchars($_POST["veri"], ENT_QUOTES, 'UTF-8')

veya

if (preg_match('/[\'^£$%&*()}{@#~?><>,|=+¬-]/', $_POST["veri"]))
{
  $_POST["veri"] = ''"; //Değeri sıfırla
}
else
{
  // Herhangi bir değişiklik yapma.
}

Aşağıda bir başka fonksiyon örneği bulunmaktadır.

function RemoveSpecialChar($str) {
      // Using str_replace() function 
      // to replace the word 
      $res = str_replace( array( '\'', '"',
      ',' , ';', '<', '>', '?', '-', '='), ' ', $str);
      // Returning the result 
      return $res;
      }
$_POST["veri"] = RemoveSpecialChar($_POST["veri"]);


Aşağıda da GET ile yazılan başka bir fonksiyon bulunmaktadır.

if  (preg_match('/[\'^£$";%&*()}{@#~?><>,|=+¬-]/', $_GET["veri"]))
{
$_GET["veri"]="";
}
else
{
}


Array içinde bir karekter filtreleme yapılması gerekiyorsa aşağıdaki kod örneği kullanılabilir.

<?php
function filtre(&$value) {
 $value = htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}
    while($row = oci_fetch_assoc($parse)){

        array_walk_recursive($row, "filtre");

        $data[]=$row;
?>


Unutmayın güvenlik her şeyden önce gelir.



Python Konsol Animasyonları

 Python yazılımını konsol ekranında çalıştırıyorsanız açılışta veya bir çıktı beklerken kullanıcıya bir animasyon izletebilirsiniz. Bu bölümde birkaç animasyon paylaşıyorum.

Loading animasyonu

#!/usr/bin/env python
from time import sleep
def progress(percent=0, width=30):
    hashes = width * percent // 100
    blanks = width - hashes
    print('\r[', hashes*'#', blanks*' ', ']', f' {percent:.0f}%', sep='',
        end='', flush=True)
print('Yükleniyor...')
for i in range(101):
    progress(i)
    sleep(0.1)
print()

Dikey Sinüs

import os 
import sys
def console_frame(output):
os.system('clear' if os.name == 'posix' else 'CLS')
sys.stdout.write(output + "\n")
sys.stdout.flush()
import time
import math
for t in range(100):
console_frame("\n".join(["*" * (30 + int(30 * math.sin(.1 * x + .1 * t))) for x in range(30)])) # time-varying sine wave
time.sleep(.04)

Loading Çizgi Animasyon

import itertools
import threading
import time
import sys
done = False
#here is the animation
def animate():
    for c in itertools.cycle(['|', '/', '-', '\\']):
        if done:
            break
        sys.stdout.write('\rloading ' + c)
        sys.stdout.flush()
        time.sleep(0.1)
    sys.stdout.write('\rDone!')
t = threading.Thread(target=animate)
t.start()
#long process here
time.sleep(10)
done = True

Kalın çizgi

import time
def typewriter(text, delay=0.1):
  for letter in text:
    print(letter, end='', flush=True)
    time.sleep(delay)
  print()
typewriter("############")
typewriter("############", 0.05)



XAMPP Sunucu Konfigürasyonu (MySql+Apache+Php)

XAMPP sunucusu konfigürasyonunu kontrol panelden yaparken ini dosyasına yazma yetki sorunu ile karşılaşabilirsiniz.

XAMPP server error xampp-control.ini Access is denied

Bu hatayı açmak için kurduğunuz xampp klasörü içinde xampp-control.exe üzerine sağ klik yapıp Properties alanına girin, burada Compatibility sekmesine tıklayın. En altta Run this program as an administrator seçeneğini seçin ve Apply butonuna tıklayın. Windows artık konfigürasyon kaydederken, servis oluştururken veya startup'da servisleri başlatmak için yapılan konfigürasyonları sorunsuz yazacaktır ve bu özellikler kullanılabilir olur. 

Aşağıdaki videoda Windows 10 Xampp kurulumu ve ayarların nasıl  yapılacağı anlatılmaktadır.




Python Windows Mesaj Kutusu

Python kodu içerinsinde windows için bir hata mesajı oluşturmak istiyorsanız çok küçük bir kod ile bunu yapmanız mümkün. Yazılım çalışırken istediğiniz alana geldiğinde aşağıdaki kalın harflerle gösterilen kodları mesajın verileceği yere yerleştirmeniz yeterli olacaktır. İlk iki satırı kodun en başına koyabilirsiniz. Bu kod büyük kütüphane bağımlılığı olmadan windows mesajı göstermenizi sağlar.

import ctypes
MessageBox = ctypes.windll.user32.MessageBoxW
MessageBox(None, 'Dikkat!!! Mesaj 1...', 'Mesaj Başlığı 2', 0)
MessageBox(None, 'Dikkat!!! Mesaj 2...', 'Mesaj Başlığı 2', 0)

Bu kod Python versiyon 3.x. içindir Python versiyon 2.x, için MessageBoxW yerine MessageBoxA kullanmalısınız.

Daha gelişmiş mesaj ekranları kullanmak istiyorsanız Tkinter kütüphanesi sizin için çok kullanışlı olabilir. 

from tkinter import * 
from tkinter import messagebox
root = Tk()
root.geometry("300x200")
w = Label(root, text ='Mesaj Alanı', font = "50") 
w.pack()
messagebox.showinfo("showinfo", "Information")
messagebox.showwarning("showwarning", "Warning")
messagebox.showerror("showerror", "Error")
messagebox.askquestion("askquestion", "Are you sure?")
messagebox.askokcancel("askokcancel", "Want to continue?")
messagebox.askyesno("askyesno", "Find the value?")
messagebox.askretrycancel("askretrycancel", "Try again?")  
root.mainloop() 

Python Windows Mesage Box (popup)

Python List Comprehension

Python List Comprehension liste içinde yapılacak basit işlemlerin tek satırda yapılmasını sağlayan bir yöntemdir. Örneğin sayılar içinden pozitif sayıları bulan ve bir fazlasını yazan kodu klasik ve List Comprehension yöntemleri ile yapalım.

ör:

Klasik Yöntem:

sayilar=[1,2,3,4,5,0,-1,-2,-3,-4,-5]

pozitif=[]

for sayi in sayilar:

    if sayi >=0:

        pozitif.append(sayi+1)

pozitif

List Comprehension:

pozitif=[x +1 for x in sayilar if x >=0]

pozitif

Python String Buffer Tanımlama ve Flush

Python yazılımı içinde string buffer tanımlama ihtiyacı olursa bu parametreyi tanımlarken bazı durumlara dikkat etmek gerekir. String Buffer özelliği Buffer’da değiştirilebilir bir karekter dizisi oluşturur. Oluşturulan dizi String gibidir fakat ondan farkı değişebilir olmasıdır. Hafızada her seferinde yeni bir alan açılmadan var olan alan üzerinde değişiklik yapılabilir. StringBuffer dizisine (array) bileşen ekleyen, bileşen silen, uzunluğu değiştiren ve başka işleri yapan çok sayıda metot vardır. StringBuffer thread-safe yani synchronized ‘tır. Bu durum da StringBuffer’ı thread’li işlemlerde kullanılmasını güvenli yapar. String buffer şu şekilde tanımlanır.

from ctypes import create_string_buffer
item = create_string_buffer(buffer size)

Ör: item = create_string_buffer(128)

Bu şekilde tanımladığınızda bazı sorunlar ile karşılaşabilirsiniz. Aşağıdaki gibi tanımlamanız daha sorunsuz bir sonuç ortaya çıkaracaktır.

item = create_string_buffer('\000' * 128)

Bu tanım string buffer için yeterlidir fakat gönderdiğiniz değişken tipi tutarlı olmazsa Type Error hatası alabilirsiniz. Bunu da düzeltmek için aşağıdaki halini kullanabilirsiniz. 

create_string_buffer(('\000' * bufferSize).encode())

ör:

item = create_string_buffer(('\000' * 128).encode())

Python orjinal buffer size'a bakmak için aşağıdaki komut kullanılabilir.

import io
print('Original buffer size:', io.DEFAULT_BUFFER_SIZE)

Çıktısı:

Original buffer size: 8192

Buffer'daki bilgileri silmek için

import sys
sys.stdout.flush()

Kodu kullanılabilir. Bu kod buffer'da bulunan verinin silinmesini sağlar, tabiki çıkış yönündeki veriyi silecektir. Bir print işlemi yapıyorsanız bufferda kalan veri böylece silinmiş olur. Bir print çıktısı sonrası buffer silinmek isteniyorsa

print(veri, end =' ', flush = True)

Şeklinde de yazdırma sonrası buffer silinebilir.

DBeaver için Driver Nasıl Yüklenir

 DBeaver SQL yazılımı neredeyse tüm databaselere bağlanabilmektedir. Bağlantı yapabilmek için yazılım tanımlanan database'e ilk kez bağlanılıyorsa internetten driver indirilmesi gerekir. Java tabanlı jdbc driverı internet mevcutsa yazılım kendisi indirir. İnternet bağlantısı olmayan yerlerde bu driver'ı sizin bulup indirmeniz ve tanımlamanız gereklidir. Driver download etmek için aşağıdaki adreslerden faydalanabilirsiniz.

Driver Kaynak URL:

https://mvnrepository.com/ 

https://repo1.maven.org/

JDBC driverı *.jar uzantılı bir dosyadır. 

Ör: 

MySQL JDBC driverı = https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.30/mysql-connector-java-8.0.30.jar

Postgre SQL JDBC Driverı: https://repo1.maven.org/maven2/postgresql/postgresql/9.1-901.jdbc4/postgresql-9.1-901.jdbc4.jar

Oracle SQL JDBC Driverı : https://www.oracle.com/tr/database/technologies/appdev/jdbc-downloads.html

Bu dosyayı bilgisayarınıza indirdikten sonra DBeaver SQL yazılımını açın. Database > Driver Manager ekranına girin. İlgili database'i seçin ve Copy butonuna basın. Yeni bir isim verin ör:Mysql2 Libraries tabına girin ve ekli olan satırı kaldırın. Add File seçeneğinden indirdiğiniz driverı bulun ve seçin. Ok butonuna tıklayarak ekranı kapatın. Artık yeni driver'lı bağlantınız hazır. 

Database oluşturma ekranında yeni oluşturduğunuz database ismini seçerek bağlantıyı oluşturun. Database driver'ını kendiniz indirdiğiniz için internet bağlantısına ihtiyaç olmadan database bağlantısını sağlayabilirsiniz. İnternete bağlı olmayan sunucularda bu şekilde yazılımı kullanabilirsiniz. 

      

Spyder ve PyCharm için Python Versiyon Değişikliği

Kullandığınız Spyder veya PyCharm editörleri bilgisayarınızda buldukları default Python versiyonu ile çalışırlar. Bilgisayarınıza farklı bir Python versiyonu kurduğunuzda bu editörlerin bu versiyonla çalışması için bir değişiklik gerekiyor. Bir projeyi veya editörün default ayarlarını değiştirerek tüm projeleri farklı Python versiyonları ile yazabilirsiniz. Bir sonraki versiyon bir önceki versiyon özelliklerini desteklediğinden en son versiyonu yükledikten sonra editör defaultta bu versiyonda çalışmıyorsa aşağıdaki ayarlamayı yapmalısınız.

PyCharm Yazılımı için

Proje versiyonunu değiştirmek için:

File | Settings | Project: <project name> | Python Interpreter for Windows and Linux

PyCharm | Preferences | Project: <project name> | Python Interpreter for macOS

Default Python versiyonunu değiştirmek için:

File | New Projects Setup | Settings for New Project for Windows and Linux

File | New Projects Setup | Preferences for New Project for macOS

Spyder yazılımı için:

Tools | Preferences | Python Interpretor

Spyder için bu işlemi yaptıktan sonra yeni versiyon için aşağıdaki modülü indirmeyi unutmayın.

pip install spyder-kernels







Python'ı Komut Satırında Çalıştırmak

Python yazılımını kurarken Path bilgisini Enviroment'a ekleyen seçeneği seçmediyseniz windows işletim sisteminde komut satırında python veya pip yazdığınızda yazılım çalışmayacaktır. Bilgisayar içinde yerini bulup o klasöre girdikten sonra komut satırında çalıştırılabilir. Python ve uygulamalarını komut satırında çalıştırmak için sonradan da Path bilgisini girebilirsiniz. Bunun için;

Windows System Properties alanına girin. Bu alan Ayarlar > Advanced System Settings altındadır. Bu alana girdikten sonra Advanced sekmesini seçin. Sağ alt köşede bulunan Envirroment Variables butonuna tıklayın. System Variables alanına Python ve Python/script directorlerini Path değişkeni altına girin.

Path değişkenini seçin ve edit butonuna tıklayın. Listeye bilgisayarınızdaki yerlerini ekleyin.

Ör:

C:\Users\(kullanıcı Kılasörü)\AppData\Local\Programs\Python\Python310\

C:\Users\(kullanıcı Kılasörü)\AppData\Local\Programs\Python\Python310\Scripts

Ekledikten sonra bilgisayarınızı reboot etmeniz yeterli. Artık python komutlarını istediğiniz yerde yazabilirsiniz.

C:\Users>python

Python 3.10.7 (tags/v3.10.7:6cc6b13, Sep  5 2022, 14:08:36) [MSC v.1933 64 bit (AMD64)] on win32

Type "help", "copyright", "credits" or "license" for more information.

>>>


Oracle SQL Merge Komutu

Oracle Merge komutu ile bir tablodaki bilgilerle diğer bir tabloyu rahatlıkla güncelleyebilir, aynı komut içinde diğer tabloda veriler eksik ise bunları tamamlayabilirsiniz. Komutun kullanımı aşağıdaki gibidir.

MERGE INTO target_table 

USING source_table 

ON search_condition

    WHEN MATCHED THEN

        UPDATE SET col1 = value1, col2 = value2,...

        WHERE <update_condition>

        [DELETE WHERE <delete_condition>]

    WHEN NOT MATCHED THEN

        INSERT (col1,col2,...)

        values(value1,value2,...)

        WHERE <insert_condition>;


target_table : Verisi güncellenecek olan tablo

source_table : Verinin alınacağı tablo

search_condition : Eşleşme kriteri



Windows Sunucularda Bazı Önemli Komutlar

Windows sunucuda Sunucu veya Bilgisayarın Seri Numarasını öğrenmek için gerekli komut:

wmic bios get serialnumber

Sunucuda içi boş belli bir büyüklükte dosya oluşturmak isterseniz

fsutil file createnew <filename> <length>

ör:

fsutil file createnew c:\serkan.bin 4096

Komutunu kullanabilirsiniz.


Linux Komutları : İşletim Sistemi Bilgilerini Görme

 Linux işletim sistemiyle ilgili bilgi almak için;

$ uname -a

Linux computername01 3.10.0-1160.59.1.el7.x86_64 #1 SMP Wed Feb 16 12:17:35 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

Dağıtım versiyonu gibi ayrıntılı bilgi edinmek için ise;

$ cat /proc/version

Linux version 3.10.0-1160.59.1.el7.x86_64 (mockbuild@x86-vm-37.build.eng.bos.redhat.com) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Wed Feb 16 12:17:35 UTC 20xx

Komutları kullanılır. Bu bilgiler yeterli değil ise;

$ cat /etc/os-release
veya
$ cat /etc/*release

NAME="Red Hat Enterprise Linux Server"
VERSION="7.9 (Maipo)"
ID="rhel"
ID_LIKE="fedora"
VARIANT="Server"
VARIANT_ID="server"
VERSION_ID="7.9"
PRETTY_NAME="OpenShift Enterprise"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:redhat:enterprise_linux:7.9:GA:server"
HOME_URL="https://www.redhat.com/"
BUG_REPORT_URL="https://bugzilla.redhat.com/"

REDHAT_BUGZILLA_PRODUCT=
REDHAT_BUGZILLA_PRODUCT_VERSION=
REDHAT_SUPPORT_PRODUCT=
REDHAT_SUPPORT_PRODUCT_VERSION=

Komutunu kullanabilirsiniz. Ubuntu işletim sisteminin versiyonunu öğrenmek için

# lsb_release -a

No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 12.04.2 LTS
Release:        12.04
Codename:       precise

komutu kullanılabilir. 

Uname komutu ile ilgili açıklama;

UNAME(1)                                                                                         User Commands                                                                                         UNAME(1)

NAME
       uname - print system information

SYNOPSIS
       uname [OPTION]...

DESCRIPTION
       Print certain system information.  With no OPTION, same as -s.

       -a, --all
              print all information, in the following order, except omit -p and -i if unknown:

       -s, --kernel-name
              print the kernel name

       -n, --nodename
              print the network node hostname

       -r, --kernel-release
              print the kernel release

       -v, --kernel-version
              print the kernel version

       -m, --machine
              print the machine hardware name

       -p, --processor
              print the processor type or "unknown"

       -i, --hardware-platform
              print the hardware platform or "unknown"

       -o, --operating-system
              print the operating system

       --help display this help and exit

       --version
              output version information and exit




Python Mouse Hareketi Sağlayan Kod

 Aşağıdaki kod mouse kursörünün ekran üzerinde belirtilen koordinaya sol klik yapmasını sağlayan otomatik olarak tetiklenmesi gereken bir veya birden çok butona basmak için yazılmış bir koddur. Ekranın sol üst kısmı 0,0 olmak üzere pixel'ler belirtilerek butonlara tıklanabilir.


import win32api, win32con

import time

def click(x,y):

    win32api.SetCursorPos((x,y))

    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0)

    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0)

while True:

    click(100,100)

    time.sleep(5)

    click(200,200)

    time.sleep(5)

    click(300,300)

    time.sleep(5)

    click(500,500)

    time.sleep(5)

    click(600,600)


Diğer mouse hareketleri için;

https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-mouse_event


Server Üzerinde SSL ve TLS Versiyon Kontrolü

 Server'ın üzerinde aktif çalışan TLS versiyonunu aşağıdaki komutlarla kontrol edebilirsiniz. Güvenliğiniz için SSL bağlantıda TLS1.0 ve TLS1.1 kullanmamaya özen gösterin.

Linux Curl Komutları

TLS1.0 --> curl -v -s --tlsv1.0 https://domain -o /dev/null/ 2>&1

TLS1.1 --> curl -v -s --tlsv1.1 https://domain -o /dev/null/ 2>&1

TLS1.2 --> curl -v -s https://domain -o /dev/null/ 2>&1

Windows

curl https://domain -k -v --location-trusted --tlsv1.2 --ciphers 3DES -H "Connection: close"

curl https://domain -k -v --location-trusted --tlsv1.2 --ciphers AECDH-AES128-SHA

SSL versiyonunun desteklenip desteklenmediğini kotrol etmek için

curl https://domain -k -v --location-trusted --sslv3


Apache Sunucusu için SSL Nasıl Oluşturulur

 Apache web sunucusu için SSL sertifikasını aşağıdaki gibi oluşturabilirsiniz. Bu sertifikayı oluşturmak için OpenSSL kullanacağız. Https ile güvenli siteler yapmak için günümüzde mutlaka bu SSL sertifikasını oluşturmalı ve kullanmalısınız. Biz oluşturma işlemini XAMPP server için yapacağız, sizde XAMPP kullanmıyorsanız kendinize göre komutları uyarlayabilirsiniz. İlk olarak Apache bin klasörüne gidilir.

cd /E E:\xampp\apache\bin

Bazı parametreleri set edelim

set OPENSSL_CONF=E:\xampp\apache\conf\openssl.cnf

set RANDFILE=C:\Temp\.rnd

RSA private key Oluşturma

openssl genrsa -out server.key 1024

2048 şifreleme kullanabilirsiniz, sadece komutun sonundaki değeri değiştirmeniz yeterlidir. DS3 ile şifrelemek isterseniz aşağıdaki komutu kullanın.

openssl genrsa -des3 -out server.key 1024

Bu opsiyon size bir şifre soracaktır, uygun bir şifre ile şifreleyin.

CSR (Certificate Sign Request ) Oluşturma

openssl req -nodes -new -key server.key -out server.csr

Bu komutu girdikten sonra çıkan aşağıdaki alanları doldurun.

Country Name (2 letter code) [AU]:TR
State or Province Name (full name) [Some-State]:Istanbul
Locality Name (eg, city) []:Istanbul
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Şirket Adı
Organizational Unit Name (eg, section) []:Bölüm
Common Name (e.g. server FQDN or YOUR name) []:Domain
Email Address []:eporta adresi
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:Domain

Burada dikkat edilmesi gereken "An optional company name" alanınında doldurulmasıdır. Bu alanı doldurmazsanız bazı browser'lar da hata alınabilir. Apache\bin klasöründe oluşacak server.csr isimli CSR dosyasını kullanabilirsiniz.

CSR dosya içeriği nasıl kontrol edilir.

openssl req -in E:\XAMPP\apache\bin\server.csr server -noout -text

Tek Satırda KEY ve CSR Dosyası Oluşturma

İlk olarak bir openssl-san.cfg dosyası oluşturmamız gerekiyor. Dosya içeriği aşağıdaki gibi olmalı.

${URL_ADRESS}=domain adıdır.

------------------------------------

[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
C = TR
ST = IS
L = Istanbul
O = Sirket
OU = Bolum
CN = ${URL_ADRESS}
[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = ${URL_ADRESS}
DNS.2 = ${URL_ADRESS}.uzantısı
------------------------------------

Dosyayı openssl komutunu yazacağımız alana kopyalamalıyız. Açağıdaki komut ile Key ve CSR dosyalarını yukarıdaki konfigürasyona göre oluşturmuş oluruz.

openssl req -new -newkey rsa:2048 -nodes -out ${URL_ADRESS}.csr -keyout ${URL_ADRESS}.key -config openssl-san.cfg

Aşağıdaki komut ile içeriğini kontrol edebiliriz. 

openssl req -in dosya.csr server -noout -text

Kontrollerde bir sorun yoksa dosya.csr isimli dosyayı SSL alacağınız kişi veya kuruma gönderebilirsiniz. Kendiniz sertifika oluşturacaksanız yazının devamını takip ediniz.

Sertifika Oluşturma

Aşağıdaki komutu kullanarak sertifika oluşturabilirsiniz.

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Tek Adımda Sertifika Oluşturma:Opsiyonel

openssl req -nodes -new -x509 -keyout server.key -out server.crt

Sertifikayı uygulama

Apache Http.conf dosyasına aşağıdaki bölümü ekleyebilirsiniz.

<VirtualHost *:443>
     DocumentRoot E:/XAMPP/htdocs/
     ServerName Domain
     ServerAlias *.Domain
SSLEngine On
SSLCertificateFile "conf/ssl.crt/server.cer"
SSLCertificateKeyFile "conf/ssl.crt/server.key"
</VirtualHost>

yada aşağıdaki komut ile ekleyebilirsiniz. Dikkat etmeniz gereken konu konfigürasyondaki directory yeni oluşturduğunuz dosyaların yeri olmalıdır.

copy /Y server.crt e:\xampp\apache\conf\ssl.crt

copy /Y server.key e:\xampp\apache\conf\ssl.key

Apache sunucusunu yeniden başlatın.

SSL çalışır durumda.


Kaynak : https://benohead.com/blog/2014/05/07/generating-new-certificate-xampp-windows/

https://helpcenter.gsx.com/hc/en-us/articles/207831828-How-to-identify-the-Cipher-used-by-an-HTTPS-Connection

https://docs.microsoft.com/en-us/windows/win32/secauthn/protocols-in-tls-ssl--schannel-ssp-

Apache Sunucu Güvenliği

Apache sunucusunun güvenliği için aşağıdaki adımları takip etmek önemlidir:

  1. Güncel Tutun: Apache sunucunuzu ve kullanılan diğer yazılımları (PHP, MySQL vb.) güncel tutun. Güncellemeler, güvenlik açıklarını düzeltir ve saldırılardan korunmanıza yardımcı olur.
  2. Güvenlik Duvarı (Firewall): Sunucunuzda güvenlik duvarı kullanın ve yalnızca gerekli portlara izin verin. Güvenlik duvarı, zararlı trafikleri engeller ve saldırılardan korur.
  3. DoS ve DDoS Saldırılarına Karşı Koruma: Apache sunucusunun DoS (Hizmet Reddi) ve DDoS (Dağıtık Hizmet Reddi) saldırılarına karşı dayanıklı olmasını sağlayın. Yüksek trafikli saldırılara karşı önlem almak için uygulamalar ve servisler kullanın.
  4. SSL Sertifikası: Web sitesini HTTPS protokolüyle çalıştırmak için SSL sertifikası kullanın. SSL, veri iletimini şifreleyerek güvenliği artırır ve kullanıcı bilgilerini korur.
  5. Güçlü Parolalar ve Erişim Kontrolleri: Sunucu, yönetici paneli ve veritabanları için güçlü parolalar kullanın. Ayrıca, erişim kontrolleriyle sadece yetkilendirilmiş kişilerin sunucuya erişmesini sağlayın.
  6. İzin Ayarları: Dosya ve klasör izinlerini uygun şekilde yapılandırın. İzinlerin gereksiz yere açık olması güvenlik açıklarına neden olabilir.
  7. Giriş Logları: Apache sunucusunun giriş loglarını düzenli olarak inceleyin. Bu loglar, olası saldırıları ve güvenlik ihlallerini tespit etmenize yardımcı olabilir.
  8. IP Engelleme: Tehdit oluşturan IP adreslerini engellemek için güvenlik duvarında IP engelleme (IP blocking) kullanın.
  9. HTTP Başlık Güvenliği: HTTP başlık güvenliği önlemleri alın. Örneğin, HTTP başlıklarında sunucu ve teknoloji bilgisi vermeyin.
  10. Kendi Kendini İmha Eden Dosyalar: Özellikle yükleme dosyaları gibi geçici dosyaların sunucuda kalmasını önleyin.

Bu adımlar, Apache sunucunuzun güvenliğini artırmaya yardımcı olacaktır. Ancak, güvenlik sürekli bir çabadır ve düzenli olarak sunucu güvenlik testleri ve denetimleri yapmak önemlidir. Ayrıca, güvenlik uzmanlarından danışmanlık almak ve güvenlik en iyi uygulamalarını takip etmek de önemlidir.

 Apache sunucu güvenliği için bazı bilgileri kullanıcılardan saklamata fayda vardır. Bunun için ilk olarak .haccess dosyası oluşturarak işe başlamak gerekir. Bu dosya ile birçok güvenlik önlemini alabilirsiniz.

.htaccess dosyasını / dizininde oluşturunuz. Dosya içeriği;

IndexIgnore *
ErrorDocument 403 /error.html
ErrorDocument 404 /error.html
ErrorDocument 500 /error.html
ErrorDocument 502 /error.html
ErrorDocument 503 /error.html
ErrorDocument 504 /error.html

PHP uzantısını silmek için
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

HTML uzantısını silmek için
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]

Link sonundaki / işaretini silmek için
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [R=301,L]

Şeklinde olabilir.

Apache Mod Security Yükleme

İlk olarak aşağıdaki linklerden dosya indirilir.

https://www.apachehaus.com/cgi-bin/download.plx

veya

https://www.apachelounge.com/download/

Daha sonra zip dosyası açılır. Dosya içindeki dosya mod_security2.so apache\modules klasörüne kopyalanır.

yajl.dll dosyası apache\bin klasörüne kopyalanır. Aşağıdaki satır http.conf dosyasına eklenir.

LoadModule security2_module modules/mod_security2.so
<IfModule security2_module>
    SecRuleEngine on
    ServerTokens Min
    SecServerSignature " "
</IfModule> 

Server yeniden başlatılır.

Bu modul için diğer seçenekler;

<IfModule mod_security.c>
    # Turn the filtering engine On or Off
    SecFilterEngine On
    # The audit engine works independently and
    # can be turned On of Off on the per-server or
    # on the per-directory basis
    SecAuditEngine RelevantOnly
    # Make sure that URL encoding is valid
    SecFilterCheckURLEncoding On
    # Unicode encoding check
    SecFilterCheckUnicodeEncoding On
    # Only allow bytes from this range
    SecFilterForceByteRange 1 255
    # Cookie format checks.
    SecFilterCheckCookieFormat On
    # The name of the audit log file
    SecAuditLog logs/audit_log
    # Should mod_security inspect POST payloads
    SecFilterScanPOST On
    # Default action set
    SecFilterDefaultAction "deny,log,status:406"
    # Simple example filter
    # SecFilter 111
    # Prevent path traversal (..) attacks
    # SecFilter "\.\./"
    # Weaker XSS protection but allows common HTML tags
    # SecFilter "<( |\n)*script"
    # Prevent XSS atacks (HTML/Javascript injection)
    # SecFilter "<(.|\n)+>"
    # Very crude filters to prevent SQL injection attacks
    # SecFilter "delete[[:space:]]+from"
    # SecFilter "insert[[:space:]]+into"
    # SecFilter "select.+from"
    # Require HTTP_USER_AGENT and HTTP_HOST headers
    SecFilterSelective "HTTP_USER_AGENT|HTTP_HOST" "^$"
    # Only accept request encodings we know how to handle
    # we exclude GET requests from this because some (automated)
    # clients supply "text/html" as Content-Type
    SecFilterSelective REQUEST_METHOD "!^GET$" chain
    SecFilterSelective HTTP_Content-Type "!(^$|^application/x-www-form-urlencoded$|^multipart/form-data)"
    # Require Content-Length to be provided with
    # every POST request
    SecFilterSelective REQUEST_METHOD "^POST$" chain
    SecFilterSelective HTTP_Content-Length "^$"
    # Don't accept transfer encodings we know we don't handle
    # (and you don't need it anyway)
    SecFilterSelective HTTP_Transfer-Encoding "!^$"
</IfModule>

Http bağlantısını Https bağlantısına yönlendirme

Kullanıcıların kesinlikle 80 portundan sunucunuza gelememesi gereklidir. 80 portu güvenli olmadığı için aşağıdaki önlem alınabilir.

<VirtualHost *:80>
     ServerName adres.com
     ServerAlias *.adres.com
Redirect permanent / https://adres.com/
</VirtualHost>

<IfModule rewrite_module>
RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R,QSA]
</IfModule>


Google