Kategori arşivi: PHP

PHP kod örnekleri, php hakkında güncel bilgiler, php güvenlik ipuçları, php’de güvenli kod yazma teknikleri, php programlama dili hakkında önemli bilgiler ve ipuçları

PHP Startup: Unable to load dynamic library newrelic.so

Newrelic kullanıyordunuz sonra bir gün bununla işiniz bitti kaldırdınız ama PHP’de inatla aşağıdaki uyarıyı mı görüyorsunuz.

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php5/20121212
/newrelic.so' - /usr/lib/php5/20121212/newrelic.so: cannot open shared object file:
No such file or directory in Unknown on line 0

Aşağıdaki adımı uygulayın

sudo rm -rf /etc/php5/cli/conf.d/newrelic.ini
sudo rm -rf /etc/php8.0/cli/conf.d/newrelic.ini
sudo rm -rf /etc/php8.1/cli/conf.d/newrelic.ini
sudo rm -rf /etc/php8.2/cli/conf.d/newrelic.ini

ve PHP’yi yeniden başlatın. Sorununuz çözülecek hadi hayırlı olsun.

PHP’de Cross Site Scripting (XSS) Filtreleme Nasıl Yapılır?

En temel filtreleme şekli

filter_var($input, FILTER_SANITIZE_STRING);

Regexp kullanarak xss ataklarının filtreleme işlemi

function xss_clean($data)
{
        // Fix &entity\n;
        $data = str_replace(array('&','<','>'), array('&','<','>'), $data);
        $data = preg_replace('/(&#*\w+)[\x00-\x20]+;/u', '$1;', $data);
        $data = preg_replace('/(&#x*[0-9A-F]+);*/iu', '$1;', $data);
        $data = html_entity_decode($data, ENT_COMPAT, 'UTF-8');

        // Remove any attribute starting with "on" or xmlns
        $data = preg_replace('#(<[^>]+?[\x00-\x20"\'])(?:on|xmlns)[^>]*+>#iu', '$1>', $data);

        // Remove javascript: and vbscript: protocols
        $data = preg_replace('#([a-z]*)[\x00-\x20]*=[\x00-\x20]*([`\'"]*)[\x00-\x20]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2nojavascript...', $data);
        $data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2novbscript...', $data);
        $data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*-moz-binding[\x00-\x20]*:#u', '$1=$2nomozbinding...', $data);

        // Only works in IE: <span style="width: expression(alert('Ping!'));"></span>
        $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?expression[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
        $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?behaviour[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
        $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[^>]*+>#iu', '$1>', $data);

        // Remove namespaced elements (we do not need them)
        $data = preg_replace('#</*\w+:\w[^>]*+>#i', '', $data);

        do
        {
                // Remove really unwanted tags
                $old_data = $data;
                $data = preg_replace('#</*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|title|xml)[^>]*+>#i', '', $data);
        }
        while ($old_data !== $data);

        // we are done...
        return $data;
}
final class xCleaner {

    public static function clean( string $html ): string {

        return self::cleanXSS(

            preg_replace(

                [

                    '/\s?<iframe[^>]*?>.*?<\/iframe>\s?/si',
                    '/\s?<style[^>]*?>.*?<\/style>\s?/si',
                    '/\s?<script[^>]*?>.*?<\/script>\s?/si',
                    '#\son\w*="[^"]+"#',

                ],

                [
                    '',
                    '',
                    ''
                ],

                $html

            )

        );

    }

    protected static function hexToSymbols( string $s ): string {

        return html_entity_decode($s, ENT_XML1, 'UTF-8');

    }

    protected static function escape( string $s, string $m = 'attr' ): string {

        preg_match_all('/data:\w+\/([a-zA-Z]*);base64,(?!_#_#_)([^)\'"]*)/mi', $s, $b64, PREG_OFFSET_CAPTURE);

        if( count( array_filter( $b64 ) ) > 0 ) {

            switch( $m ) {

                case 'attr':

                    $xclean = self::cleanXSS(

                                        urldecode(

                                            base64_decode(

                                                $b64[ 2 ][ 0 ][ 0 ]

                                            )

                                        )

                                );

                    break;

                case 'tag':

                    $xclean = self::cleanTagInnerXSS(

                                        urldecode(

                                            base64_decode(

                                                $b64[ 2 ][ 0 ][ 0 ]

                                            )

                                        )

                                );

                    break;

            }

            return substr_replace(

                $s,

                '_#_#_'. base64_encode( $xclean ),

                $b64[ 2 ][ 0 ][ 1 ],

                strlen( $b64[ 2 ][ 0 ][ 0 ] )

            );

        }
        else {

            return $s;

        }

    }

    protected static function cleanXSS( string $s ): string {

        // base64 injection prevention
        $st = self::escape( $s, 'attr' );

        return preg_replace([

                // JSON unicode
                '/\\\\u?{?([a-f0-9]{4,}?)}?/mi',                                                                    // [1] unicode JSON clean

                // Data b64 safe
                '/\*\w*\*/mi',                                                                                            // [2] unicode simple clean

                // Malware payloads
                '/:?e[\s]*x[\s]*p[\s]*r[\s]*e[\s]*s[\s]*s[\s]*i[\s]*o[\s]*n[\s]*(:|;|,)?\w*/mi',    // [3]  (:expression) evalution
                '/l[\s]*i[\s]*v[\s]*e[\s]*s[\s]*c[\s]*r[\s]*i[\s]*p[\s]*t[\s]*(:|;|,)?\w*/mi',         // [4]  (livescript:) evalution
                '/j[\s]*s[\s]*c[\s]*r[\s]*i[\s]*p[\s]*t[\s]*(:|;|,)?\w*/mi',                                 // [5]  (jscript:) evalution
                '/j[\s]*a[\s]*v[\s]*a[\s]*s[\s]*c[\s]*r[\s]*i[\s]*p[\s]*t[\s]*(:|;|,)?\w*/mi',       // [6]  (javascript:) evalution
                '/b[\s]*e[\s]*h[\s]*a[\s]*v[\s]*i[\s]*o[\s]*r[\s]*(:|;|,)?\w*/mi',                     // [7]  (behavior:) evalution
                '/v[\s]*b[\s]*s[\s]*c[\s]*r[\s]*i[\s]*p[\s]*t[\s]*(:|;|,)?\w*/mi',                      // [8]  (vsbscript:) evalution
                '/v[\s]*b[\s]*s[\s]*(:|;|,)?\w*/mi',                                                              // [9]  (vbs:) evalution
                '/e[\s]*c[\s]*m[\s]*a[\s]*s[\s]*c[\s]*r[\s]*i[\s]*p[\s]*t*(:|;|,)?\w*/mi',        // [10] (ecmascript:) possible ES evalution
                '/b[\s]*i[\s]*n[\s]*d[\s]*i[\s]*n[\s]*g*(:|;|,)?\w*/mi',                                 // [11] (-binding) payload
                '/\+\/v(8|9|\+|\/)?/mi',                                                                          // [12] (UTF-7 mutation)

                // Some entities
                '/&{\w*}\w*/mi',                                                                                   // [13] html entites clenup
                '/&#\d+;?/m',                                                                                      // [14] html entites clenup

                // Script tag encoding mutation issue
                '/\¼\/?\w*\¾\w*/mi',                                                                         // [21] mutation KOI-8
                '/\+ADw-\/?\w*\+AD4-\w*/mi',                                                         // [22] mutation old encodings

                '/\/*?%00*?\//m',

                // base64 escaped
                '/_#_#_/mi',                                                                                       // [23] base64 escaped marker cleanup
             
            ],

            // Replacements steps :: 23
            ['&#x$1;', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''],

            str_ireplace(

                ['\u0', '&colon;', '&tab;', '&newline;'],
                ['
final class xCleaner {
public static function clean( string $html ): string {
return self::cleanXSS(
preg_replace(
[
'/\s?<iframe[^>]*?>.*?<\/iframe>\s?/si',
'/\s?<style[^>]*?>.*?<\/style>\s?/si',
'/\s?<script[^>]*?>.*?<\/script>\s?/si',
'#\son\w*="[^"]+"#',
],
[
'',
'',
''
],
$html
)
);
}
protected static function hexToSymbols( string $s ): string {
return html_entity_decode($s, ENT_XML1, 'UTF-8');
}
protected static function escape( string $s, string $m = 'attr' ): string {
preg_match_all('/data:\w+\/([a-zA-Z]*);base64,(?!_#_#_)([^)\'"]*)/mi', $s, $b64, PREG_OFFSET_CAPTURE);
if( count( array_filter( $b64 ) ) > 0 ) {
switch( $m ) {
case 'attr':
$xclean = self::cleanXSS(
urldecode(
base64_decode(
$b64[ 2 ][ 0 ][ 0 ]
)
)
);
break;
case 'tag':
$xclean = self::cleanTagInnerXSS(
urldecode(
base64_decode(
$b64[ 2 ][ 0 ][ 0 ]
)
)
);
break;
}
return substr_replace(
$s,
'_#_#_'. base64_encode( $xclean ),
$b64[ 2 ][ 0 ][ 1 ],
strlen( $b64[ 2 ][ 0 ][ 0 ] )
);
}
else {
return $s;
}
}
protected static function cleanXSS( string $s ): string {
// base64 injection prevention
$st = self::escape( $s, 'attr' );
return preg_replace([
// JSON unicode
'/\\\\u?{?([a-f0-9]{4,}?)}?/mi',                                                                    // [1] unicode JSON clean
// Data b64 safe
'/\*\w*\*/mi',                                                                                            // [2] unicode simple clean
// Malware payloads
'/:?e[\s]*x[\s]*p[\s]*r[\s]*e[\s]*s[\s]*s[\s]*i[\s]*o[\s]*n[\s]*(:|;|,)?\w*/mi',    // [3]  (:expression) evalution
'/l[\s]*i[\s]*v[\s]*e[\s]*s[\s]*c[\s]*r[\s]*i[\s]*p[\s]*t[\s]*(:|;|,)?\w*/mi',         // [4]  (livescript:) evalution
'/j[\s]*s[\s]*c[\s]*r[\s]*i[\s]*p[\s]*t[\s]*(:|;|,)?\w*/mi',                                 // [5]  (jscript:) evalution
'/j[\s]*a[\s]*v[\s]*a[\s]*s[\s]*c[\s]*r[\s]*i[\s]*p[\s]*t[\s]*(:|;|,)?\w*/mi',       // [6]  (javascript:) evalution
'/b[\s]*e[\s]*h[\s]*a[\s]*v[\s]*i[\s]*o[\s]*r[\s]*(:|;|,)?\w*/mi',                     // [7]  (behavior:) evalution
'/v[\s]*b[\s]*s[\s]*c[\s]*r[\s]*i[\s]*p[\s]*t[\s]*(:|;|,)?\w*/mi',                      // [8]  (vsbscript:) evalution
'/v[\s]*b[\s]*s[\s]*(:|;|,)?\w*/mi',                                                              // [9]  (vbs:) evalution
'/e[\s]*c[\s]*m[\s]*a[\s]*s[\s]*c[\s]*r[\s]*i[\s]*p[\s]*t*(:|;|,)?\w*/mi',        // [10] (ecmascript:) possible ES evalution
'/b[\s]*i[\s]*n[\s]*d[\s]*i[\s]*n[\s]*g*(:|;|,)?\w*/mi',                                 // [11] (-binding) payload
'/\+\/v(8|9|\+|\/)?/mi',                                                                          // [12] (UTF-7 mutation)
// Some entities
'/&{\w*}\w*/mi',                                                                                   // [13] html entites clenup
'/&#\d+;?/m',                                                                                      // [14] html entites clenup
// Script tag encoding mutation issue
'/\¼\/?\w*\¾\w*/mi',                                                                         // [21] mutation KOI-8
'/\+ADw-\/?\w*\+AD4-\w*/mi',                                                         // [22] mutation old encodings
'/\/*?%00*?\//m',
// base64 escaped
'/_#_#_/mi',                                                                                       // [23] base64 escaped marker cleanup
],
// Replacements steps :: 23
['&#x$1;', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''],
str_ireplace(
['\u0', '&colon;', '&tab;', '&newline;'],
['\0', ':', '', ''],
// U-HEX prepare step
self::hexToSymbols( $st ))
);
}
}
', ':', '', ''], // U-HEX prepare step self::hexToSymbols( $st )) ); } }

PHP-FPM Güvenlik Eklentisi Sorunu

Hata loglarında aşağıdaki gibi birşey görüyorsanız ne yapmanız gerekiyor?

2020/02/14 17:40:34 [error] 32684#32684: *7 FastCGI sent in stderr: "Access to the script '/home/mertcangokgoz.com/public/wp-admin/css/login.min.css' has been denied (see security.limit_extensions)" while reading response header from upstream, server: mertcangokgoz.com, request: "GET /wp-admin/css/login.min.css HTTP/1.1", upstream: "fastcgi://unix:/var/run/php/php7.3-fpm.sock:", host: "mertcangokgoz.com", 

has been denied (see security.limit_extensions) gördüğünüzde istemsizce şaşırabilirsiniz. Çoğu zaman bu hata ile karşılaşıldığında web siteleriniz yayında olmayıp “Access Denied.” hatasını verebilir.

Çözüm ise NGINX tarafında yapacağımız ufak bir değişiklik olacak

location ^/(wp-admin|wp-login.php) {
       include configs/php_fastcgi.conf;
}

Bu sayede PHP-FPM üzerindeki security.limit_extensions ayarını kurcalamanıza gerek yok.

İşlemden sonra kullandığınız PHP servisini yeniden başlatmayı unutmayınız.

SSH İle PHP’ye ionCube Loader Eklentisi Nasıl Kurulur

Bu makalede PHP de kullanılmak üzere ionCube Loader eklentilerinin nasıl kurulacağını göstereceğim, fazlaca bir şekilde bu konu ile alakalı istek geliyordu. Bütün PHP 7 serisi için kurulumları göstermeye çalışacağım. PHP 5 serisi artık ömrünü tamamladığı için anlatmaya gerek bile yok

ionCube ile şifrelenmiş dosyaları kullanmanızı önermem, kodları açık kaynak olarak teslim almanız önemli yazılımcı desteği kestiğinde gereken aksiyonları alabilmelisiniz.

Bu noktada ionCube Loader ile şifrelenmiş dosyaların kırılması işlemleri için bir takım servislerden faydalanabilirsiniz.

Resmi sitesinde bulunan kurulum aracı ile kurabileceğiniz gibi benim anlatacağım şekilde elle kurabilirsiniz. Bu şekilde kurulum yaparsanız sadece ihtiyacınız olan sürüm kurulacaktır.

PHP 7.3 İçin ionCube Loader Kurulumu

Bahsi geçen PHP 7.3 serisi için gerekli olan eklentiyi resmi web adresinden indiriyoruz.

cd /tmp/
wget https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz
tar xzf ioncube_loaders_lin_x86-64.tar.gz
cp ioncube/ioncube_loader_lin_7.3.so /etc/php/7.3/fpm/extensions/ionCubeLoader/
bash -c 'echo "zend_extension=/etc/php/7.3/fpm/extensions/ionCubeLoader/ioncube_loader_lin_7.3.so" > /etc/php/7.3/fpm/conf.d/20-ioncube.ini'
systemctl restart php7.3-fpm.service

PHP 7.2 İçin ionCube Loader Kurulumu

Bahsi geçen PHP 7.2 serisi için gerekli olan eklentiyi resmi web adresinden indiriyoruz.

cd /tmp/
wget https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz
tar xzf ioncube_loaders_lin_x86-64.tar.gz
cp ioncube/ioncube_loader_lin_7.2.so /etc/php/7.2/fpm/extensions/ionCubeLoader/
bash -c 'echo "zend_extension=/etc/php/7.2/fpm/extensions/ionCubeLoader/ioncube_loader_lin_7.2.so" > /etc/php/7.2/fpm/conf.d/20-ioncube.ini'
systemctl restart php7.2-fpm.service

PHP 7.1 İçin ionCube Loader Kurulumu

Bahsi geçen PHP 7.1 serisi için gerekli olan eklentiyi resmi web adresinden indiriyoruz.

cd /tmp/
wget https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz
tar xzf ioncube_loaders_lin_x86-64.tar.gz
cp ioncube/ioncube_loader_lin_7.1.so /etc/php/7.1/fpm/extensions/ionCubeLoader/
bash -c 'echo "zend_extension=/etc/php/7.1/fpm/extensions/ionCubeLoader/ioncube_loader_lin_7.1.so" > /etc/php/7.1/fpm/conf.d/20-ioncube.ini'
systemctl restart php7.1-fpm.service

PHP ile Link Kısaltma Nasıl Yapılır

Başkalarının sistemlerini kullanmak yerine geçtiğimiz günlerde kendi php Link kısaltma servisimi yazmaya karar verdim kara cuma indiriminden aldığım domain ile yola koyuldum link kısaltmalarının mantığını bildiğim için zor olmadı kısaca anlatmak gerekirse

  1. Uzun olan link kullanıcıdan input yardımıyla alınır
  2. Veritabanı oluşturulur ve bu linkler veritabanına kısaltılmış url yapıları ile birlikte kayıt edilir
  3. kısa link yapısını oluşturmak için istenilen bir algoritma kullanılabilir yada kendi algoritmanızı oluşturabilirsiniz.
  4. kısaltılan url daha sonra herhangi bir kural yardımıyla tekrar yönlendirilir genellikle 301 olarak yönlendirme yapılır.

yazarken fazla kod kullanmayalım hızlı, güvenli ve etkili olsun diye arayüze pek önem vermedim. Güvenli olsun diye hem web server tarafında hemde veritabanı tarafında kullanıcıya dair hiçbir bilgi tutmadım site içerisinde analiz kodları dahi bulunmuyor.

Veritabanı için mysql seçtim ve bu projemide her zaman ki gibi github üzerinden yayınladım isteyen herkes destek olabilsin diye. Kodlar ise şu şekilde

Dosya: ajax.php

<?php
//include database connection details
include('database.php');

if (isset($_POST['url']) && !empty($_POST['url']) && preg_match_all('/(ftp|http|https)://(w+:{0,1}w*@)?(S+)(:[0-9]+)?(/|/([w#!:.?+=&%@!-/]))?/', $_POST['url'])) {
    //get random strong string for URL
    $command3 = "SELECT * FROM urls WHERE url_link= '" . urlencode($_POST['url']) . "';";
    $control_database = mysqli_query($connect, $command3);
    //check database
    if ($control_database == FALSE) {
        return FALSE;
    }
    //find same url and read short code
    if (mysqli_num_rows($control_database) > 0) {
        $row = mysqli_fetch_assoc($control_database);
        $site_url = "?s=" . $row["url_short"];
        echo json_encode(array("url" => $server_name . $row["url_short"], "site_url" => $server_name . $site_url));
    } else {
        $short = substr(bin2hex(openssl_random_pseudo_bytes(6, $short)), 3, 5);
        //$short = substr(str_shuffle(uniqid(sha1(md5(mt_rand((double)microtime()*1000000))))), 3, 5);
        $url_data = mysqli_real_escape_string($connect, $_POST['url']);
        $command2 = "INSERT INTO urls (url_link, url_short, url_date) VALUES('" . urlencode($url_data) . "','$short','" . time() . "')";
        mysqli_query($connect, $command2);
        $url = $server_name . $short;
        $site_url = $server_name . "?s=$short";
        echo json_encode(array("url" => $url, "site_url" => $site_url));
    }
}

Dosya: index.php

<?php
/**
 * Created by PhpStorm.
 * User: mertcan
 * Date: 27.11.2015
 * Time: 23:14
 */

//include database connection details
include('database.php');

//redirect to real link if URL is set
if (!empty($_GET['url'])) {
    $filter_url = filter_var($_GET['url'], FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
    $command1 = "SELECT url_link FROM urls WHERE url_short = '" . $filter_url . "'";
    $redirect = mysqli_fetch_assoc(mysqli_query($connect, $command1));
    $redirect = urldecode($redirect["url_link"]);

    header('HTTP/1.1 301 Moved Permanently');
    header("Location: " . $redirect);
}
?>
<!DOCTYPE html>
<html lang="en" class="no-js" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>0w1 — URL Shortener Services</title>
    <!-- Google Main Meta -->
    <meta charset='utf-8'>
    <meta name="robots" content="noindex, nofollow">
    <meta name="google-site-verification" content="LPdSncuoqCucWsdFo_mdfpsmmjXdmUUFxm3x_2-5Bik"/>
    <meta name="description" content="Secure, fast and anonymous url Shortener Services for free">

    <!-- Meta -->
    <meta content="minimum-scale=1.0, width=device-width, maximum-scale=0.6667, user-scalable=no" name="viewport">
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta http-equiv="Content-Language" content="en">
    <meta name="author" content="Mertcan GOKGOZ, admin@mertcangokgoz.com, https://mertcangokgoz.com/"/>

    <!-- Jquery -->
    <script src="inc/jquery-1.11.3.min.js"></script>

    <!-- Latest compiled and minified CSS -->
    <link rel="stylesheet" href="inc/bootstrap.min.css">

    <!-- Optional theme -->
    <link rel="stylesheet" href="inc/bootstrap-theme.min.css">

    <!-- Latest compiled and minified JavaScript -->
    <script src="inc/bootstrap.min.js"></script>

    <!-- Costum Javascript code -->
    <link rel="stylesheet" href="costum.css">

    <!-- Costum Javascript code -->
    <script language="JavaScript">
        $(document).ready(function () {
            $("#send").click(function () {
                $('.alert').remove();
                var check = document.getElementById('longurl').value;
                var MatcUrl = /(ftp|http|https)://(w+:{0,1}w*@)?(S+)(:[0-9]+)?(/|/([w#!:.?+=&%@!-/]))?/;
                if (MatcUrl.test(check)) {
                    $.ajax({
                        type: "post",
                        url: "ajax.php",
                        data: $("#shortener").serialize(),
                        success: function (data) {
                            var json = JSON.parse(data);
                            $('.result').append('<div class="alert alert-success" role="alert">Short Url:<a target="_blank" href="' + json.url + '">' + json.url + '</a> <br> 
                            Site Url <a target="_blank" href="' + json.site_url + '">' + json.site_url + '</a> 
                            </div>');
                        }
                    });
                } else {
                    $('.result').append('<div class="alert alert-danger"><a href="#" class="close" data-dismiss="alert" aria-label="close">×</a><strong>Error!</strong> Invalid url.</div>');
                    return false;
                }
            });
        });
    </script>
    <!-- Content -->
    <link rel="author" href="//plus.google.com/103305118431759296457/posts"/>
    <link rel="publisher" href="//plus.google.com/103305118431759296457/posts"/>
</head>
<body style="font-family: Arial,sans-serif,Verdana !important;">
<!--[if lt IE 8]>
<p class="chromeframe">outdated</p>
<![endif]-->
<div class="container">
    <div class="header col-md-6 center">
        <h1 class='title'>0w1</h1>

        <p class='desc'>URL Shortener Service</p>
    </div>
    <div class="well content">
        <div class="row">
            <div class="col-md-12">
                <div class="form-group">
                    <form method="post" action="" id="shortener" onsubmit="return false">
                        <div class="input-group input-group-lg">
                            <span class="input-group-addon" id="sizing-addon1">URL to Shorten:</span>
                            <input type="text" name="url" id="longurl" class="form-control" placeholder="URL"
                                   aria-describedby="sizing-addon1">
                            <span class="input-group-btn">
                                 <button type="submit" id="send" class="btn btn-success">Shorten</button>
                            </span>
                        </div>
                    </form>
                </div>
            </div>
        </div>
        <div class="row">
            <div class="col-md-6 center">
                <div class="result">
                    <?php if (!empty($_GET['s'])): ?>
                        <div class="alert alert-success" role="alert">Short Url:<a
                                href="<?php echo $server_name; ?><?php echo $_GET['s']; ?>"
                                target="_blank"><?php echo $server_name; ?><?php echo $_GET['s']; ?></a><br>
                            Site Url:<a href="<?php echo $server_name; ?>?s=<?php echo $_GET['s']; ?>"
                                        target="_blank"><?php echo $server_name; ?>?s=<?php echo $_GET['s']; ?></a><br>
                        </div>
                    <?php endif ?>

                </div>
            </div>
        </div>
    </div>
</div>
<div id="footer">
    <ul>
        <li><a href="mailto:admin@mertcangokgoz.com">Feedback</a></li>
        <li><a href="https://github.com/MertcanGokgoz/simple-url-shortener">Github</a></li>
    </ul>
</div>
</body>
</html>

Dosya: database.php

<?php
/**
 * Created by PhpStorm.
 * User: mertcan
 * Date: 27.11.2015
 * Time: 23:14
 */
ini_set('display_errors', 0);

function Database_Connector()
{
    $server = "localhost";
    $username = "database_username";
    $password = "database_password";
    $database_name = "database_name";

    $connection = new mysqli($server, $username, $password, $database_name);
    return $connection;
}

$server_name = "http://" . $_SERVER['HTTP_HOST'] . "/";

$connect = Database_Connector();
$command = "CREATE TABLE IF NOT EXISTS `urls` (
  `url_id` int(11) NOT NULL AUTO_INCREMENT,
  `url_link` varchar(255) NOT NULL,
  `url_short` varchar(6) NOT NULL,
  `url_date` int(10) NOT NULL,
  PRIMARY KEY (`url_id`),
  UNIQUE KEY `url_id` (`url_id`,`url_short`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;";
// Perform queries
mysqli_query($connect, $command);

Proje ve yapılan diğer işlemlerin tamamına ulaşmak için Github hesabım üzerinden gereken dosyalara ulaşabilirsiniz. Projeyi geliştirmeye devam edeceğim. Güvenli bir link kısaltma servisi olarak hem kendim hemde çevremdekilerin kullanmasını umuyorum.

Projeyi Toplu bir şekilde indirmek için Tıklayın