вторник, 30 августа 2011 г.

Скругление углов картинки средствами php

function AoElipse($AoEKey, $width=40, $height=40)
{
    /*
      $width - ширина картинки
      $height - высота картинки

      коды углов:
      1 - левый верхний
      2 - правый верхний
      3 - правый нижний
      4 - левый нижний
     */

    //создаем картинку

    $img = imageCreate($width, $height); //создаем картинку
    $white = imageColorAllocate($img, 255, 255, 255); //определяем белый цвет
    //imageFill($img, 1, 1, $white);//закрашиваем картинку белым цветом
    //нарисуем элипс

    switch ($AoEKey)
    {
        case 1: $s = 180;
            $e = 270;
            $x = $width - 1;
            $y = $height;
            break;

        case 2: $s = 270;
            $e = 0;
            $x = -1;
            $y = $height;
            break;

        case 3: $s = 0;
            $e = 90;
            $x = -1;
            $y = 0;
            break;

        case 4: $s = 90;
            $e = 180;
            $x = $width - 1;
            $y = 0;
            break;
    }
    // $s - начальный угол в градусах
    // $e - конечный угол в градусах
    // $x - координата X описываемого прямоугольника
    // $y - координата Y описываемого прямоугольника
    $w = $width * 2; //ширина описываемого прямоугольника
    $h = $height * 2; //высота описываемого прямоугольника
    $black = imageColorAllocate($img, 0, 0, 0); //определим цвет линии элипса
    imageArc($img, $x, $y, $w, $h, $s, $e, $black); //рисуем элипс
    imageFill($img, $width / 2, $height / 2, $black); //закрашиваем элипс

    imageColorTransparent($img, $black); //сделаем прозрачным черный цвет

    return $img; //возвращаем картинку
}

function MElipse($img, $Ew=40, $Eh=40)
{
    $width = imageSX($img);
    $height = imageSY($img);

    $imgE = AoElipse(1, $Ew, $Eh);
    imageCopyResized($img, $imgE, 0, 0, 0, 0, $Ew, $Eh, $Ew, $Eh);
    $imgE = AoElipse(2, $Ew, $Eh);
    imageCopyResized($img, $imgE, $width - $Ew, 0, 0, 0, $Ew, $Eh, $Ew, $Eh);
    $imgE = AoElipse(3, $Ew, $Eh);
    imageCopyResized($img, $imgE, $width - $Ew, $height - $Eh, 0, 0, $Ew, $Eh, $Ew, $Eh);
    $imgE = AoElipse(4, $Ew, $Eh);
    imageCopyResized($img, $imgE, 0, $height - $Eh, 0, 0, $Ew, $Eh, $Ew, $Eh);

    return $img;
}

//пример использования:
//
//$img=ImageCreatefromJpeg($img_path);
//$img=MElipse($img,5,5);
//
//imagejpeg($img, $img_path);

вторник, 23 августа 2011 г.

Конвертация базы MySQL в cp1251

Если надо конвертировать табличку в cp1251  (ну или в что ни будь еще) надо сначала привести ее к бинарному типу, а затем в ну нужную кодировку.


ALTER TABLE my_table CHANGE `my_field` `my_field` mediumtext CHARACTER SET BINARY NOT NULL;

привели к бинарному типу

ALTER TABLE my_table CHANGE `my_field` `my_field` mediumtext CHARACTER SET cp1251 COLLATE cp1251_general_ci NOT NULL

выставили кодировку

ALTER TABLE my_table DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_ci;
выставили сравнение

=)

Симметричное шифрование для php (python)

Переписал функцию на питоне. Планирую использовать ее на google app engine. Пришлось несколько изменить алгоритм. deflate заменил на compress.

сама функция xor:

    def xor_it(str,key):
        code=''
        y=0

        for i in xrange(0, len(str)):
            if y==len(key): y=0
            code+=chr(ord(str[i:i+1])^ord(key[y:y+1]))
            y+=1
        return code


функция шифрования скрипта:

# -*- coding: utf-8 -*-
def add_armor(code,cookie_name,cookie_key):
    def xor_it(str,key):
        code=''
        y=0

        for i in xrange(0, len(str)):
            if y==len(key): y=0
            code+=chr(ord(str[i:i+1])^ord(key[y:y+1]))
            y+=1
        return code

    def pack_it(code):
        #return base64_encode(gzdeflate(code))
        deflate=zlib.compress(code)
        base64=deflate.encode('base64')
        return base64

    def add_protection(code,checksum,salt):
        checksum=str(checksum)
        return '/*'+salt+'*/$i=get_included_files();$s=$i[0];if(filesize($s)=='+checksum+' && sizeof($i)==1){'+code+'}else{unlink($s);die();}'

    def add_body(base64_code,cookie_name):
        return '<?php function x($s,$k){$c=\'\';for($i=0,$y=0;$i<strlen($s);$i++,$y++){if($y==strlen($k))$y=0;$c.=chr(ord(substr($s,$i,1))^ord(substr($k,$y,1)));}return $c;}if(isset($_COOKIE[\''+cookie_name+'\'])){$k=$_COOKIE[\''+cookie_name+'\'];$l=floor(strlen($k)/2);$k1=substr($k,0,$l);$k2=substr($k,$l);$s=gzuncompress(base64_decode(\''+base64_code+'\'));eval(x(x($s,$k1),$k2));}?>'

    code_length=-1
    compiled_code=''
    i=0
    salt=''

    key_len=len(cookie_key)
    key1_len=int(math.floor(key_len / 2))

    cookie_key1=cookie_key[0:key1_len]
    cookie_key2=cookie_key[key1_len:]


    while code_length!=len(compiled_code):
        if i>5:
            salt+=chr(rand(0,255))
            i=0

        code_length=len(compiled_code)
        compiled_code=add_protection(code,code_length,salt)
        compiled_code=xor_it(compiled_code,cookie_key1)
        compiled_code=xor_it(compiled_code,cookie_key2)
        compiled_code=pack_it(compiled_code)
        compiled_code=add_body(compiled_code,cookie_name)
        i+=1

    return compiled_code

Симметричное шифрование php

Понадобилось мне зашифровать свой скрипт. Что бы он работал только если к неу обращаюсь я,
скрипт должен был брать куку и расшифровывть с помощью нее свое тело, после чего все отправлялось в eval. Но оказалось, что в арсенале php нет функции симметричного шифрования (позднее я узнал о mcrypt_ecb, так что всё, что написано ниже, это велосипед). Пришлось писать ее самому. Шифровать я стал с помощью xor по ключу. Получилась у меня вот такая вот функция.

     function xor_it($str,$key)
    {
        $code='';
        for($i=0,$y=0;$i<strlen($str);$i++,$y++)
        {
            if($y==strlen($key)) $y=0;
            $code.=chr(ord(substr($str,$i,1))^ord(substr($key,$y,1)));
        }
        return $code;
    }

Дальше что бы облегчить себе жизнь в будущем, я написал функцию, которой можно будет скармливать код и на выходе получать закодированные скрипты. Фнкция принимает как параметры тело скрипта, имя куки и значение куки. Потом Делит значение куки пополам и ксорит тело скрипта сначала по одной половинке, потом по второй. Добавляет код, который проверяет длину скрипта и отсутствие инклюдов  и если все норально, запускается. Если нет, и в скрипте присутсвуют посторонние записи, скрипт самоудаляется. Конечно защита не полная, но на мой взгляд это максимум, который можно выжать из php.


Вот сама функция:

function cypher($code,$cookie_name,$cookie_key)
{
    function xor_it($str,$key)
    {
        $code='';
        for($i=0,$y=0;$i<strlen($str);$i++,$y++)
        {
            if($y==strlen($key)) $y=0;
            $code.=chr(ord(substr($str,$i,1))^ord(substr($key,$y,1)));
        }
        return $code;
    }

    function pack_it($code)
    {
        return base64_encode(gzdeflate($code));
    }

    function add_protection($code,$checksum,$salt)
    {
        return '/*'.$salt.'*/$i=get_included_files();$s=$i[0];if(filesize($s)=='.$checksum.' && sizeof($i)==1){'.$code.'}else{unlink($s);die('!');}';
    }

    function insert_body($base64_code,$cookie_name)
    {
        return '<?php function x($s,$k){$c=\'\';for($i=0,$y=0;$i<strlen($s);$i++,$y++){if($y==strlen($k))$y=0;$c.=chr(ord(substr($s,$i,1))^ord(substr($k,$y,1)));}return $c;}if(isset($_COOKIE[\''.$cookie_name.'\'])){$k=$_COOKIE[\''.$cookie_name.'\'];$l=floor(strlen($k) / 2);$k1=substr($k,0,$l);$k2=substr($k,$l);$s=gzinflate(base64_decode(\''.$base64_code.'\'));eval(x(x($s,$k1),$k2));}?>';
    }
   
   
   
   
    $code_length=-1;
   
    $compiled_code='';
    $i=0;
    $salt='';
   
    // разбиваем ключ на 2.. хотелось все таки что бы ключ состоял минимум из 2х символов
    $key_len=strlen($cookie_key);
    $key1_len=floor($key_len / 2);
   
    $cookie_key1=substr($cookie_key, 0,$key1_len);
    $cookie_key2=substr($cookie_key, $key1_len);
   
    while($code_length!=strlen($compiled_code))
    {
        if($i>5) // если итераций больше, чем 5, значит надо добавиль 1 символ к коду. это нужно в ситуации, когда изменение символа влияет на длину кода после паковки
        {
            $salt.=chr(rand(0,255));
            $i=0;
        }
       
        $code_length=strlen($compiled_code);    //запоминаем длину кода
        $compiled_code=add_protection($code,$code_length,$salt); // добавляем в код проверку длины
        $compiled_code=xor_it($compiled_code,$cookie_key1); // ксорим по первому ключу
        $compiled_code=xor_it($compiled_code,$cookie_key2); // ксорим по второму ключу
        $compiled_code=pack_it($compiled_code); // пакуем
        $compiled_code=insert_body($compiled_code,$cookie_name); // вставляем код распаковки и запуска
       
        $i++;
    }
   
    return $compiled_code;
}