cwbe coordinatez:
101
792011
2663954
2663960

ABSOLUT
KYBERIA
permissions
you: r,
system: public
net: yes

neurons

stats|by_visit|by_K
source
tiamat
K|my_K|given_K
last
commanders
polls

total descendants::
total children::19
3 ❤️


show[ 2 | 3] flat


urza0
ondrish0
lbnd0
tux0
mono0
michael czer...0
mx0
::0
-sXero-0
freezy0
Robin0
joseph0
rigor0
fifteen0
||0
bon0
janko_hrasko0
Michael[Lock...2
z13

technologicko | programovaco | geekovsky pseudoblog

mx


technology | code | brainstorm | algorithm



eye|mx personal blog





  • 0000010100792011026639540266396003402036
    Synapse creator 01.10.2007 - 01:09:55 (modif: 01.10.2007 - 01:10:14) level: 1 UP New Hardlink Content changed
    podla toho, co potrebujes...
    ja napriklad ak potrebujem zrusit vsetko a vypisat len error, by som pouzil exception, ktora by mala barikadu az na nejakom najhlavnejsom skripte a tam by vypisalo potrebny error document... napriklad:

    mam code.php, co je hlavny skript, ktory je inkludovany vsetkym ostatnym a je v nom case, ktory hovori, co sa bude diat (inak velmi uzitocna vec)... v pseudokode nieco taketo:

    ---
    core.php
    ---
    try {
    ob_start();
    switch ($PAGE) {
    case 'index':
    include_once dirname(__FILE__).'/pages/index.page.php';
    break;
    }
    ob_end_flush();
    } catch (Exception $e) {
    ob_end_clean();
    $tpl_error_msg = $e->message;
    include_once dirname(__FILE__).'/templates/error.tpl.php';
    }

    ---
    index.page.php
    ---
    if (!$check) {
    throw new Exception('Something went wrong.');
    }


    ------
    ps: vlastne to takto robim skoro pravidelne ;)
  • 0000010100792011026639540266396002975771
    mx 09.03.2007 - 10:58:53 level: 1 UP New
    pokial potrebujete zistit kolko messages je v queue, nezistil som sposob, ako to spravit cez JMS, je mozne pouzit nativne java classy WsMQ; nejak takto -- v principe velmi jednoduche:

    --

    package com.exstream.jms;

    import com.ibm.mq.MQC;
    import com.ibm.mq.MQQueue;
    import com.ibm.mq.MQQueueManager;

    public class JMSQueuePoller {
    public static void main(String[] args) throws Exception {
    MQQueueManager manager = new MQQueueManager("QM_prg_harpy");
    MQQueue queue = manager.accessQueue("DLGQ_OUT", MQC.MQOO_INQUIRE);
    System.out.println("REM> " + queue.getCurrentDepth());
    }
    }
  • 0000010100792011026639540266396002974306
    mx 08.03.2007 - 17:28:36 level: 1 UP New
    jeden maly postreh, zase raz... ono sa to sice da velmi jednoducho aj vygooglit, ale aj tak...
    WebSphereMQ generuje default message vo formate MQRFH2, co je message s pridanym RFH2 headerom, tzn, aplikacie, ktore ocakavaju plain-text message s tym maju problem. Obist sa to da tak, ze sa ako queue (URI) nastavi targetClient na hodnotu 1, tzn. napriklad...

    Queue queue = session.createQueue("queue://QueueManagerName/QueueName?targetClient=1");

    ... to je len vec, ktora ma dnes celkom zaujala a nie je nejak extremne dokumentovana -- resp, vo WSMQ online books som to nenasiel.
  • 0000010100792011026639540266396002745992
    Synapse creator 10.11.2006 - 02:47:33 (modif: 10.11.2006 - 02:48:14) level: 1 UP New Hardlink Content changed
    mas 5 krabic
    v kazdej moze byt papierik s cislom, alebo cislom krabice, v ktorom sa cislo nachadza
    oznacme si krabice cislami 1 az 5
    pozrieme sa do krabice 1 a tam je cislo "2"
    v krabici 2 je papierik s napisom, hodnotu najdes v krabici 4
    v krabici 3 je papierik s napisom hodnotu najdes v krabici 2
    v krabici 4 je cislo "3"
    krabica 5 je prazdna
    --
    nech mame premennu typu int
    krabica 1 predstavuje "int k1" kde k1 = 2
    krabica 2 predstavuje "int* k2" (takze ukazovatel na hodnotu, v nasom pripade krabicu 4), takze int* k2 = &k4 = 4, a hodnotu ziskame dereferencovanim *k2 = 3
    krabica 3 je "int** k3" (ukazovate na ukazovatel na hodnotu, v nasom pripade na krabicu 2, ktora ukazuje na krabicu 4), takze int** k3 = &k2 = 4, hodnotu ziskame **k3 = 3
    krabica 4 je "int k4", k4 = 3
    krabica 5 je NULL, moze to byt napriklad int* k5 = NULL, tzn. ukazovatel, ktory ukazuje na nic, keby sme ho chceli pouzit, dopustime sa chyby

    -- povedane v C --
    #include <stdio.h>
    int main(int argc, char* argv[]) {
    int k1 = 2;
    int k4 = 3; // krabica k4 je definovana skor kvoli tomu, aby sme na nu mohli odkazovat
    int* k2 = &k4; // *k2 = 3
    int**k3 = &k2; // **k3 = 3
    int* k5 = NULL; // k5 = NULL, *k5 = chyba

    printf("k1: %d, k2: %d, k3: %d, k4: %d, k5: (null)\n",
    k1, *k2, **k3, k4);

    return (0);
    }

    --
    lepsia analogia ma v rychlosti, po troske vina a o tejto nocnej hodine nenapadla :)
    more children: (1)
  • 0000010100792011026639540266396002740124
    mx 07.11.2006 - 15:17:59 level: 1 UP New
    ... potreboval som pozastavit beh programu na 5 sekund ... toto skoncilo v zdrojaku:


    DWORD dwTickBegin = GetTickCount();
    while (GetTickCount() < dwTickBegin + 5000)
    Sleep(100);


    ... uz sa nekomentujem.
    more children: (2)
  • 0000010100792011026639540266396002731249
    mx 03.11.2006 - 09:20:08 level: 1 UP New
    kedze vsade sa kazdy vytesuje zo std::string, spravil som si jeden rychly "benchmark", softwareovi teoretici ma mozu spindat, ze to nie je uplne reprezentativne, ale mne to stacilo... tu su vysledky... pre tych, ktorych to zaujima:

    release>bm_cstr.exe
    100000 additions in 20 msec (26904606, 26904626) -- 0.00020 per add
    release>bm_stdstr.exe
    100000 additions in 170 msec (26907120, 26907290) -- 0.00170 per add

    testovaci program:

    #define __STDSTRING

    #include <string>
    #include <stdio.h>
    #include <windows.h>

    using namespace std;

    int main(int argc, char* argv[]) {
    DWORD tick_begin, tick_end;
    tick_begin = GetTickCount();

    #ifdef __STDSTRING
    string dest;
    string src("test1");
    for (int x = 0; x < 100000; x++) dest = src + "test2";
    #else
    char* dest = (char*)malloc(1024);
    memset(dest, 0, 1024);
    char* src = "test1";
    for (int x = 0; x < 100000; x++) {
    memset(dest, 0, 1024);
    strcat(dest, (char*)&src);
    strcat(dest, "test2");
    }
    free(dest);
    #endif
    tick_end = GetTickCount();

    printf("100000 additions in %u msec (%u, %u) -- %.5f per add\n", tick_end - tick_begin,
    tick_begin, tick_end, (tick_end - tick_begin) / 100000.0);

    return (0);
    }
  • 0000010100792011026639540266396002722573
    mx 30.10.2006 - 11:15:53 (modif: 31.10.2006 - 10:31:06) level: 1 UP New Content changed
    sice vytvarat mutexy s NULL DACL je mierne nebezpecne, pouzil som v jednom VB projekte (uprave existujuceho, inak by som sa VB ani len nechytil) presne tento pristup... tu je zdrojak vytvarania (otvarania) takeho mutexu (pointa je, aby fungoval medzi roznymi usermi):


    ' WinAPI structures
    Private Type ACL
    AclRevision As Byte
    Sbz1 As Byte
    AclSize As Integer
    AceCount As Integer
    Sbz2 As Integer
    End Type

    Private Type SECURITY_DESCRIPTOR
    Revision As Byte
    Sbz1 As Byte
    Control As Long
    Owner As Long
    Group As Long
    Sacl As ACL
    Dacl As ACL
    End Type

    Private Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
    End Type

    ' WinAPI constants
    Private Const MUTEX_ALL_ACCESS = 2031617
    Private Const SECURITY_DESCRIPTOR_REVISION = (1)

    ' Mutex related WinAPI imports
    Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (lpMutexAttributes As SECURITY_ATTRIBUTES, ByVal bInitialOwner As Long, ByVal lpName As String) As Long
    Private Declare Function OpenMutex Lib "kernel32" Alias "OpenMutexA" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal lpName As String) As Long
    Private Declare Function InitializeSecurityDescriptor Lib "advapi32.dll" (pSecurityDescriptor As SECURITY_DESCRIPTOR, ByVal dwRevision As Long) As Long
    Private Declare Function SetSecurityDescriptorDacl Lib "advapi32.dll" (pSecurityDescriptor As SECURITY_DESCRIPTOR, ByVal bDaclPresent As Long, pDacl As Long, ByVal bDaclDefaulted As Long) As Long
    ...
    Dim MutexHandle As Long
    ...
    ' Opening mutex with NULL DACL
    MutexHandle = OpenMutex(MUTEX_ALL_ACCESS, 0, "VBMUTEX05")
    If MutexHandle = 0 Then
    Select Case Err.LastDllError
    Case 2&
    ' Preparation of NULL SECURITY_DESCRIPTOR
    Dim MutexAtts As SECURITY_ATTRIBUTES
    MutexAtts.bInheritHandle = False
    MutexAtts.nLength = Len(MutexAtts)
    Dim SecDesc As SECURITY_DESCRIPTOR
    Dim SecInitRes As Boolean
    SecInitRes = InitializeSecurityDescriptor(SecDesc, _
    SECURITY_DESCRIPTOR_REVISION)
    If Not SecInitRes Then
    ' ERROR initializing SD
    Exit Sub
    End If
    Dim SetSDRes As Boolean
    SetSDRes = SetSecurityDescriptorDacl(SecDesc, _
    True, ByVal 0&, False)
    If Not SetSDRes Then
    ' ERROR creating DACL-SD
    Exit Sub
    End If
    MutexAtts.lpSecurityDescriptor = VarPtr(SecDesc)

    ' Creating the mutex with NULL DACL
    MutexHandle = CreateMutex(ByVal MutexAtts, 0, "VBMUTEX05")
    Case Else
    ' ERROR: Unknown
    Exit Sub
    End Select
    End If
    ' SUCCESS
    ...


    zaujimave je na tom podla mna hlavne predavanie lp* parametrov WinAPI funkciam cez VarPtr(NazovPremennej).
  • 0000010100792011026639540266396002722474
    mx 30.10.2006 - 10:18:05 level: 1 UP New
    pre vsetkych, ktori su nuteni pouzivat WinAPI vo Visual Basicu, velmi uzitocna vec:

    http://www.vbforums.com/attachment.php?s=106444fe2e138055cec766c99042870b&attachmentid=26572
    http://www.redheadedlefty.com/vbforums/Win32api_2.zip

    prve je viewer a druhe datafile s WinAPI deklaraciami, definiciami konstant a struktur z winapi pre visual basic
  • 0000010100792011026639540266396002718116
    mx 27.10.2006 - 16:05:53 level: 1 UP New
    Kedze som nuteny v praci upravit jednu aplikaciu vo VB6 na multithread synchronizaciu, potreboval som nastudovat pouzitie Mutexov vo VB... kto by take nieco potreboval, tu ma zakladne Declares a Const na bezne pouzitie:

    ' Mutex related WinAPI imports
    Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (lpMutexAttributes As Any, ByVal bInitialOwner As Long, ByVal lpName As String) As Long
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Private Declare Function OpenMutex Lib "kernel32" Alias "OpenMutexA" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal lpName As String) As Long
    Private Declare Function ReleaseMutex Lib "kernel32" (ByVal hMutex As Long) As Long
    Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

    ' WinAPI constants
    Const MUTEX_ALL_ACCESS = 2031617
    Const WAIT_OBJECT_0 = 0&
    Const WAIT_TIMEOUT = 258&


    pri volani potom treba Long-y predavat ako:

    MutexHandle = CreateMutex(ByVal 0&, 0, "VBMUTEX02")
  • 0000010100792011026639540266396002701960
    mx 19.10.2006 - 22:53:20 level: 1 UP [1K] New
    Prvy helper (pre-build event do MSVC, pripadne inych kompilatorov) je na svete...


    ** BuildTools::AutoVersion 0.9.5.20 (c)2006 Miroslav Hudak
    ** Usage: AutoVersion.exe [options] <sources-path>
    <sources-path>
    Path to source files of your project. All other files
    provided in switches are relative to this path.

    Options:
    -ms Version modify string
    In form '1.2.3.4' where each number stands for:
    1 - Major; 2 - Minor; 3 - Release; 4 - Build
    and can be substituted for:
    * No Action, leave as it is
    + Increment version number
    - Decrement version number
    <num> Set to <num> constant
    e.g. '*.*.*.+' will increase build number each run
    -vh Version header file name (default 'APP_VERSION.h')
    -vr Version resource file name (default 'APP_VERSION.rc')
    -vdef Define name for storing version number (default 'APP_VERSION')


    Download @ http://www.maniax.sk/AutoVersion.0.9.5.20.zip
    Z cisla verzie je zrejme, ze je to len BETA, ale ja to pouzivam pri kompilaciach a funguje to bez problemov. Odporucam nastavit len na RELEASE build konfiguracie. A samozrejme, je potrebne mat v projekte includnuty VERSIONINFO resource.

    Moje nastavenie release pre-build event:

    del "$(InputDir)\$(IntDir)\$(InputName).res"
    c:\Btools\AutoVersion.exe -vr "$(InputName).rc" -ms *.*.*.+ "$(InputDir)"

    (ten 'del' maze .res subor, aby ho musel znova prekompilovat, asi sa to da donutit rekompilovat aj inak, ale nedosiel som na to ako :)

    Zaroven pracujem na postbuild eventoch pre archivaciu a podobne.
    (a mne je jasne, ze take nieco uz existuje, ale chcem mat vlastne -- aspon si to viem upravit v momente, ked potrebujem :))
    more children: (1)
  • 0000010100792011026639540266396002700856
    mx 19.10.2006 - 15:02:13 level: 1 UP New
    predpokladam, ze pre kazdeho administratora mssql to bude samozrejme, ale pre tych, ktori nemaju 10 certifikatov a len sem tam sa s mssql stretnu to moze byt usefull...

    Moj problem spocival v tom, ze pri zapise do databazy z jednej aplikacie cez ODBC (MSSQL ODBC Driver) mi pri vkladanie datumu v tvare 'YYYY-MM-DD HH:MM:SS' vyhlasilo "Arithmetic overflow", alebo podobnu chybu. Pritom z MSSQL Enterprise Managera mi vsetko vkladalo uplne bez problemov.
    Skusal som pridat data cez ODBC konektor PHPcka, ale pisalo to tu istu chybu. Na modifikovanom skripte - ktory vkladal datum v tvare 'DD-MM-YYYY HH:MM:SS' (tzn. viacmenej bezny format pre CE) - vsetko bezalo spravne, takze chyba bola jednoznacne niekde v locale.
    Dalsi test bol zmenit collation celej databazy, nepomohlo ani SQL_Latin_1_CI_AS ani Latin_1_General_CI_AS (ci nejake take podobne), taktiez nepomohlo ani zmenenie Regional Settings na English... nakoniec po niekolkych hodinach hladania som prisiel na skvele nastavenie hlboko v nastaveni jednotlivych loginov (kedze MSSQL ma 'logins', potom 'DB users') a dany login mal nastaveny jazyk 'Slovak' a prislo mi jasne, ze tam musi mat 'English'...

    Takze, ak mate podobny problem, tak:
    Server > Security > Logins > double-click na login name > General > Default language ... a tam staci vybrat tu spravnu...

    snad to niekomu pomoze :)
  • 0000010100792011026639540266396002694341
    mx 16.10.2006 - 14:51:40 level: 1 UP New
    len sem musim dat jednu citaciu k specifikacii XMP formatu:
    "If a DTD is required, be aware that RDF provides many equivalent ways to express the same model. Thus the safest approach is to use a DTD describing any possible RDF. We don’t know of a standard DTD fragment to do this."

    pointa je v tom, ze uz viacero ludi sa stazovalo, ze aplikacie (tie od adobe) zapisuju doslovne ako sa im chce, takze jedina spravna implementacia sa zda byt bruteforce nad vsetkymi moznostami a break pri najdeni spravnej...
  • 0000010100792011026639540266396002678750
    Synapse creator 08.10.2006 - 20:29:34 level: 1 UP New Hardlink
    je to programovanie, ale davam to schvalne sem:

    Go To Statement Considered Harmful
    Edsger W. Dijkstra

    http://www.acm.org/classics/oct95/

    -- oplati sa precitat uz len pre zaujimavost :)
  • 0000010100792011026639540266396002668154
    mx 03.10.2006 - 13:02:12 (modif: 03.10.2006 - 13:33:59) level: 1 UP [2K] New Content changed


    .about
    prezentacia novej verzie havok 4 physical engine, ktory bude pouzity v hrach pre next-gen PC/konzoly, vyuzivajuc GPU sucasnych high-end grafickych kariet.
    odporucam pozriet aj nehernej verejnosti

    .video
    http://www.youtube.com/watch?v=wWjSJ0PHqf8

    .info
    Havok's modular suite of tools puts power in the hands of creators, making sure they can reach new standards of realism and interactivity, while mitigating the overall cost and risks associated with creating today's leading video games and movies.
    more children: (3)
  • 0000010100792011026639540266396002667967
    mx 03.10.2006 - 11:42:22 level: 1 UP New
    este jedna poznamka k lockovaniu... je celkom elegantny sposob, ako zistit ake locky ma dana transakcia (a tym padom to vieme vyuzit aj specificky na queries):


    BEGIN TRAN
    [SQL_QUERY ktoru chceme zanalyzovat]
    EXEC sp_lock
    SELECT object_name([ID z vysledku ObjID volania sp_lock]) UNION
    [dalsie objectnames]...;
    COMMIT


    idealne je to vykonavat v Query Analyser-i
  • 0000010100792011026639540266396002667830
    mx 03.10.2006 - 11:02:02 (modif: 03.10.2006 - 11:23:14) level: 1 UP New Content changed
    v praci som narazil na jeden (celkom zaujimavy) problem nad ms sqlserver, s ktorym zase nemam az take prenikave skusenosti, tak mi chvilku trvalo, kym som ho vyriesil. mozno bude niekoho zaujimat a niekomu sa bude hodit (myslim, ze je to jedna z beznejsich chyb). popisem priklad z praxe, kazdy, kto vie o com hovorim, by si tam mal najst potrebnu informaciu:

    podmienky:

    - majme tabulku J a tabulku V, ktore obsahuju informacie o ulohe. v J su standartne informacie o ulohe a vo V su premenne nabindovane k J cez J.id.
    - majme dva druhy procesov:
    1) update process - UPDATE queries v transakcii:

    BEGIN TRAN
    UPDATE J ...
    UPDATE V ...
    UPDATE V ...
    ...
    UPDATE V ...
    COMMIT

    2) select process - SELECT query nad J

    SELECT COUNT(*) from J ...

    - majme takychto procesov pustenych niekolko (produkcna prevadzka bola cca 2 UPDATE + 2 SELECT viacmenej simultanne, ja som to testoval v 4/2 pri intervaloch spustania rand(0, 1000) milisekund)

    nastava problem: DEADLOCKu nad SELECT query (process typu #2)

    riesenie: skusal som vsetko, do primitivnych zaobalovaciek selectu do transakcie, cez read uncommited transakcie cez isolation level nad query, pomohlo - zda sa - nieco velmi trivialne, zakazanie uzamykania selectu pri count(*), co nam je vlastne aj tak jedno, kedze pri tom mnozstve poziadaviek tie cisla nemusia byt 100% presne a to, ze sa objavi odchylka je aj tak malo pravdepodobne. Takze spravna syntax SELECT query v procese typu #2 je:

    SELECT count(*) from J (NOLOCK) where ...


    test: 30000 update query v kazdom zo 4 procesov + 1200 select query v kazdom z 2 procesov bez deadlocku (inokedy mi to uz najneskor pri selecte#200 hodilo deadlock... takze dufam, ze je to ok



    EDIT

    nakoniec som - podla mojho nazoru - vybral este lepsie riesenie z ponukanych.
    kedze NOLOCK funguje ako read uncommitted (tzn, berie do uvahy vsetko, aj neCOMMITnute riadky), existuje este jedna lepsia alternativa a to READPAST, ktora neberie do uvahy nic, co je locknute (tzn, riadky, ktore su prave spracovavane ignoruje). v tomto pripade mi to pride rozumnejsie, kazdopadne COUNT(*) je ako taky dost nespolahlivy a nikdy by sa nemal pouzivat ako dolezity udaj.

    moja finalna query:

    SELECT count(*) from J (READPAST) where ...

    more children: (1)
  • 0000010100792011026639540266396002664128
    mx 01.10.2006 - 16:29:51 (modif: 01.10.2006 - 17:00:15) level: 1 UP [7K] New Content changed
    este jeden, uz velmi technicky clanok, ako objasnenie autentifikacie, ktora bola pouzita v predchadzajucej demonstracii.
    Taktiez je k dispozicii krajsia PDF verzia: http://www.hudak.info/kyb-crammd5.pdf




    Implementácia CramMD5 autentifikácie


    PHP / JavaScript

    mx, 2006-10-01


    Úvod


    Základný problém prihlasovania sa cez http protokol (pri absencii https), prípadne pri prihlasovaní sa na služby tretích strán, je možnosť odchytenia plaintext hesla, či už na strane poskytovateľa internetového pripojenia (prípadne na trase od klienta na server), alebo priamo na serveri zo strany implementátora služby.


    Riešením by bolo, neprenášať heslo v plaintext tvare a tým zamedziť uloženiu a následnému zneužitiu hesla.



    Teoretické východiská


    CramMD5 autentifikácia je založená na predspracovaní hesla na strane klientskej stanice. Základom je skriptovací jazyk (najčastejšie použitý JavaScript), ktorý vytvorí na základe vstupných dát poskytnutých serverom MD5 hash, ktorý sa použije na porovnanie hesla na strane serveru. Tento hash sa potom prenesie v plaintext forme nezašifrovanou linkou a tým zamedzí odchyteniu plaintext hesla. Takýto hash je potom v závislosti na implementácii platný pre dané spojenie, prípadne obmedzený aj špecificky na IP adresu.



    Implementačné detaily


    Riešenie CramMD5 autentifikácie sa skladá z klientskej a serverovej časti.



    Klientská časť


    V prípade, že nie je používateľ autentifikovaný, zobrazuje sa – ako v každej klasickej webovej aplikácii – prihlasovací formulár. V prípade CramMD5 autentifikácie je rozšírený o niekoľko skriptov a skryté polia, obsahujúce kontrolné informácie. (Ako konkrétne príklady implementácie použijem zdrojový kód demonštrácie sociálnych sietí.)




    <form action="" method="POST" onSubmit="return (SecOnSubmit())">

        <b>ID: </b><input name="sec_login" />

        <b>PWD:</b><input id="SecPwd" name="sec_password" type="password" />



        <input id="SecCraMD5" name="sec_cramd5" value="0" type="hidden" />

        <input id="SecCraMD5Hash" name="sec_cramd5_hash" value="<?php echo md5(uniqid(rand(), true)); ?>" type="hidden" />


        <input type="submit" value="Submit Credentials" />

        

        <script language="JavaScript"><!--

            // will hide the warning if javascript enabled and sets sec_cramd5 to 1

            document.getElementById('SecCraMD5').value = '1';

        //--></script>

    </form>



    Okrem vstupných polí sec_login a sec_password môžeme vidiet aj skryté polia sec_cramd5 a sec_cramd5_hash. Ich význam je nasledovný:



    • sec_cramd5 obsahuje informáciu o dostupnosti CramMD5 mechanizmu. Použije sa pritom jednoduchý trik s nastavením hodnoty poľa pomocou JavaScriptu. V momente, ked JavaScript nastaví pole na hodnotu „1“, môžeme si byť istí, že JavaScript je dostupný a CramMD5 autentifikácia bude použitá.

    • sec_cramd5_hash je hash, ktorý generuje server unikátne pre každé zobrazenie login formuláru. V tejto implementácii je použitý jednoduchý model, ktorý dovoľuje potenciálnemu útočníkovi zachytiť aj tento hash a poslať ho spolu s odchyteným MD5 hashom hesla na server, čím ho samozrejme autentifikuje. Pokiaľ by sme mali záujem o vyššiu úroveň bezpečnosti, môžeme do sec_cramd5_hash zaobaliť informácie o session vygenerovanej na serveri a po prihlásení túto session zrušiť, čím sa už ďalší používateľ s týmito informáciami neprihlási. Taktiež do hashu vieme zaobaliť IP adresu počítača, z ktorého klient stránku vyžiadal (čo môže byť problematické pri firemných sieťach s proxy servermi).



    Po odoslaní takéhoto formulára sa vykoná onsubmit handler SecOnSubmit(), ktorého zdrojový kód vyzerá nasledovne:



    function SecOnSubmit() {

        var pwdObj = document.getElementById('SecPwd');

        var hashObj = document.getElementById('SecCraMD5Hash');

        

        pwdObj.value = hex_md5(hashObj.value + hex_md5(pwdObj.value));

        return (true);

    }



    Je to multiplatformový JavaScript kód, ktorý zozbiera informácie z formulára, zavolá externý skript, ktorý vygeneruje MD5 hash z vložených údajov a prepíše výsledkom pole password vo formulári. Týmto postupom si zabezpečíme, že v prípade funkčnosti CramMD5 autentifikácie prejde z poľa sec_password len náš hash a v konečnom dôsledku si uľahčíme spracovanie na strane serveru.


    V prípade, že CramMD5 nie je podporovaný, handler sa nevykoná a na server je poslané plaintext heslo taktiež cez pole sec_password spolu s informáciou v sec_cramd5, že autentifikácia nie je podporovaná.



    Serverová časť



    <?php

        
    include_once dirname(__FILE__).'/passwordList.class.php';



        class
    ESecException extends Exception { /* blank */ }


        

        class
    CSec {

            static public function
    authenticate

                
    ($in_PwdFile, $in_ID, $in_Password, $in_CraMD5, $in_CraMD5_Hash) {


            

                
    $pwd_Hash = CPasswordList::getPasswordById($in_PwdFile, $in_ID);

                if (!
    $pwd_Hash) throw new ESecException('User unknown.');


                

                if (
    $in_CraMD5 == '1')

                    
    $sec_Hash = CSec::generateCraMD5Hash($pwd_Hash, $in_CraMD5_Hash);

                else {


                    
    $sec_Hash    = $pwd_Hash;

                    
    $in_Password = md5($in_Password);

                }

                

                return (
    $sec_Hash == $in_Password);


            }

            

            static public function
    generateCraMD5Hash($in_Pwd_Hash, $in_CraMD5_Hash) {

                return (
    md5($in_CraMD5_Hash.$in_Pwd_Hash));

            }


        }

    ?>




    Serverová časť je – ako vidieť na listingu – v tomto prípade veľmi priamočiara, na základe kontrolných údajov vyberie vhodnú metódu autentifikácie a vytvorí požadovaný porovnávací hash. Následne vo výsledku volania funkcie rozhodne o zhode / nezhode hashu a pošle logickú informáciu ako výsledok. Prihlasovací mechanizmus následne rozhodne o ďalšom postupe.


    V tejto časti môže byť taktiež implementované bezpečnostné vylepšenie, napríklad kontrola IP adresy, alebo spolupráca s databázou, alebo sessions.



    Využitie mechanizmu


    CramMD5 nájde uplatnenie všade tam, kde je podstatná bezpečnosť hesiel a istota používateľov aj bez možnosti preskúmať serverovú časť aplikácie. Technológia zabezpečí, že pri splnení všetkých požiadaviek, nie je používateľovo heslo odosielané na server v žiadnom prípade (pokiaľ nie je požiadavka na zmenu hesla, v tom prípade je nutné posielať toto heslo minimálne v tvare MD5 hashu na uloženie do databázy).


    more children: (2)
  • 0000010100792011026639540266396002663256
    mx 01.10.2006 - 00:41:24 (modif: 02.10.2006 - 10:16:51) level: 1 UP [54K] New Content changed
    este pred tym, ako to cele niekoho odplasi, odporucam pozriet si minimalne to demo, at least je to celkom zabavne sa o sebe nieco dozvediet (zatial mi kazdy potvrdil, ze tie data su presne), takze demo aplikacia je tu:
    http://www.hudak.info/infl_demo

    k dispozicii ako pdf @ http://www.hudak.info/infl_demo/kyb-soc-net.pdf

    a tu je samotny clanok, ktory to cele popisuje (snazil som sa to napisat nie prilis technicky)




    Využitie sociálnych sietí
    nad databázou užívateľov kyberia.sk



    ©2006-09-30 mX

    Úvod


    Základom na napísanie tohto článku bol proof-of-concept jednej teórie, ktorá je založená na článku publikovanom na serveri Gamasutra, pojednávajúcom o aplikácii sociálnych sietí v komunikácii NPC postáv v hernom svete. Táto implementácia vyžadovala vytvorenie hodnôt vzťahov jednotlivých postáv, čo bola v navrhovanej implementácii práca game designera, prípadne náhodne rozdelenie vzťahov medzi postavami.


    Nasledovný problém bol, ako nadefinovať rozdelenie vzťahov jednotlivých postáv tak, aby reflektovali nejaký sociálny vzor – dve postavy, ktoré sa navzájom akceptujú by mali mať tretiu, ktorá je im obom blízka a akceptujú ju taktiež – pričom treba predpokladať aj stav, že tento predpoklad neplatí.


    Riešením bolo, nájsť vzorku reálnych vzťahov existujúcich osôb a využiť ju v nasledovných výpočtoch. Ako dostupná a dostatočne rozmanitá vzorka sa zdala byť užívateľská základňa serveru kyberia.sk. Keďže po zanalyzovaní vzorky, vytvorení a následnom naimplementovaní základných vzorcov a postupov začali vznikať zmysluplné výsledky (overované spoluprácou s niekoľkými osobami, nad ktorých dátami analýzy prebiehali), prišiel som na ideu rozšíriť toto zbieranie údajov na ďalšie spracovanie na jednoduchú demonštráciu sily verejne dostupných údajov, ktorá je zhrnutá v tomto článku.


    Zdroje údajov


    Základnými údajmi využívanými na analýzu boli verejne dostupné údaje zo serveru kyberia.sk, ktoré si každý užívateľ môže nájsť vo výstupoch systému. Ja som v rámci minimalizácie záťaže na systém využil možnosť prístupu priamo na databázu a vykonal niekoľko databázových požiadaviek, ktoré mi vrátili požadované údaje. Výsledkom zberu dát boli nasledovné súbory (z každého súboru poskytnem aj prvých 10 riadkov, aby bolo zrejmé, že neboli spracovávané nijaké súkromné údaje).



    user_list.in


    Súbor obsahuje zoznam všetkých užívateľov systému kyberia.sk s ich user_id. Slúži na vytriedenie nesprávnych záznamov v databáze a na zobrazenie korektných používateľských mien.



    user_id login
    207 \t
    1645402
    2560 alyosha\t
    1493201 ONO
    2588 t0mix
    2352207 .
    1087140 hellish
    1670555 lubo
    1168554 pietro

    user_access.in


    Súbor obsahuje vzťahy jednotlivých usernodes a detaily o vzťahoch.



    node_id user_id node_bookmark node_permission last_visit visits given_k
    104 107 no NULL 2006-07-03 22:31:11 5 no
    104 123 no NULL 2006-08-12 02:24:10 0 no
    104 138 no NULL 2005-05-24 12:53:56 2 no
    104 146 no NULL 2005-04-13 23:07:22 3 no
    104 155 no NULL 2005-06-04 23:58:31 1 no
    104 193 no NULL 2005-02-01 22:15:24 0 no
    104 213 no NULL 2005-09-18 17:20:11 0 no
    104 252 no NULL 2006-07-13 18:20:15 1 no
    104 313 no NULL 2006-06-24 12:44:28 0 no

    user_friends.in


    Súbor obsahuje všetky friend nody každého užívateľa systému.



    node_parent node_creator
    433 433
    495 495
    781 781
    120 798
    666 940
    1100 1100
    1165 1165
    1170 1170
    1246 1246


    SQL požiadavky na zber údajov


    Na vygenerovanie súborov boli použité SQL požiadavky vykonané nad databázou systému.


    sql_user_list



    select user_id, login
    from users;

    sql_user_friends



    select node_parent, node_creator
    from nodes
    where node_parent in
    (select user_id
    from users);

    sql_user_access



    select node_id, user_id, node_bookmark, node_permission, last_visit, visits, given_k
    from node_access
    where node_id in
    (select user_id
    from users);


    Teoretické východiská


    Teória tejto demonštrácie je založená na vybudovaní siete vzťahov medzi jednotlivými usernodami a následným vypočítaním váh na základe takto definovaných vzťahov a parametrov. Množstvo premenných, s ktorými som mohol pracovať bolo obmedzené údajmi, ktoré som si vyžiadal od databázy, ako aj výpočtovou náročnosťou celého procesu.


    Následným analyzovaním a skúšaním hodnôt váh som dospel k rozdeleniu, ktoré poskytovalo na testovacej vzorke zmysluplné a dostatočne presné výsledky, ktoré sa ukázali byť platné aj na ďalších testovaných usernodách.


    Systém váh berie do úvahy nasledovné údaje:


    Priamy vzťah „usernode1 is friend of usernode2“


    Znamená to situáciu, keď sa usernode1 pridala do zoznamu priateľov v usernode2. Takýto vzťah určil základné prepojenia v budovanej sieti a nastavil každú reláciu usernode1 › usernode2 na počiatočnú váhu 2.


    Nepriamy vzťah „usernode1 visited/is listed in usernode2“


    Situácia, pri ktorej vieme, že usernode1 navštívil usernode2, prípadne usernode2 zadefinovala špeciálny parameter, obmedzujúci prístup usernode1 (napríklad silence, ban, prípadne access). Taktiež sa v tomto momente upravujú váhy v prípade, že si usernode1 pridala usernode2 do bookmarks, alebo udelila „K“ usernode2.


    Jednotlivé váhy sú upravované nasledovne:










    ParameterSpôsob úpravyHodnota
    given_kInkrementácia váhy daného prepojenia+2
    bookmark+1,5
    access:banZrušenie všetkých váh daného prepojenia0
    access:silenceZmenšenie váh daného prepojenia na 1/2/2
    access:accessInkrementácia váhy daného prepojenia0.5


    Úprava vzťahu založená na návštevnosti „usernode1 visited usernode2“


    V tomto prípade sa berie do úvahy celkové množstvo návštev usernode1 v ostatných nodách (súčasná implementácia berie do úvahy aj návštevy svojej usernode, modifikácia tohoto parametra môže byť ďalším vylepšením algoritmu). Následne sa zoberie počet návštev v usernode2 a vyráta sa percentuálny podiel návštev v tejto node. Z tohoto percentuálneho podielu je vyrátaná váha na základe vzorca:



    Influences::USER_VISIT * $t_Relation_Relator->m_VisitPerc
    // Súčasná implementácia má nastavenú hodnotu konštanty Influences::USER_VISIT na 1.64

    Taktiež sa berie do úvahy aj faktor poslednej návštevy usernode1 v usernode2. Tento je skombinovaný s bodmi, získanými vyššie uvedeným vzorcom pomocou prirodzeného logaritmu ošetreného o extrémne prípady a pripočítaný k celkovej váhe prepojenia.


    Normalizácia a prezentácia údajov


    Údaje sú pred zobrazením a vytriedením normalizované na percentá, keďže váhy, ktoré vznikli počítaním sú bezrozmerné čísla a sú nepoužiteľné na ďalšie výpočty. Tieto percentuálne hodnoty sú následne zoradené zostupne a prezentované.


    Implementačné detaily


    Implementácia celej demonštrácie bola vykonaná použitím jazyka PHP, ktorý poskytuje jednoduché nástroje na prácu s textom a súbormi, využívajúc netypovosť jednotlivých objektov jazyka. Z tohto vyplynul aj základný problém a to rýchlosť a pamäťová náročnosť, keďže prepočítavanie údajov zabralo odhadom 300M pamäte a 10 minút času. Z tohto dôvodu boli neskôr údaje z finálneho prepočtu prevedené do binárnej podoby, nad ktorou je vytvorený index, ktorý umožňuje prácu s údajmi v reálnom čase.


    Demonštračná aplikácia


    Výsledky jednotlivých prepočtov si každý používateľ môže po zadaní ID (číselného) a hesla aktuálneho k dátumu uvedenému v aplikácii pozrieť na adrese:


    http://www.hudak.info/infl_demo

    Na prihlasovanie je využitá technika CramMD5, ktorá zabraňuje odchyteniu, prípadne uloženiu plaintext hesla na strane serveru, takže je takéto prihlasovanie bezpečné. Pracuje však len v prípade, že je na strane klientského prehliadača povolený JavaScript, čo si systém overí a prípadne zobrazí upozornenie.


    V prípade ideálnych podmienok systém vytvorí unikátny hash, ktorý sa pošle na stranu serveru na overenie, takže aj v prípade odchytenia hesla útočník pozná len heslo pre danú reláciu a nie plaintext verziu hesla, prípadne jeho md5 hash.


    Využitie v praxi


    Úlohou tohto článku a demonštrácie bolo poukázať na možnosť využitia verejne dostupných údajov na získanie bližšieho obrazu o jednotlivcovi, prípadne skupine jednotlivcov. Analýzy, ktoré sú vykonávané touto implementáciou sa orientujú na základe špecifických, ale veľmi obmedzených údajov. Je len na implementátorovi systému, koľko údajov ukladá na ďalšiu analýzu a tým získava vzorku, s ktorou vie zmysluplnejšie pracovať.


    Jedným zo serverov, ktorý zakladá svoju silu na analýze údajov od používateľov je Google, ktorý pomocou množstva projektov dokáže zozbierať neuveriteľné množstvo prísne personalizovaných informácií, na základe ktorých dokáže cieliť reklamu a vytvárať demografické štúdie na žiadosť zákazníkov, prípadne pre vlastnú potrebu.


    Ďalšie využitie vidím v implementácii niekoľkých vlastností nového systému Kyberia r3, na ktorom sa v posledných týždňoch začína pracovať.


    Sociálne siete ako také využívajú napríklad aj systémy Last.fm, Flickr, prípadne najznámejšia sociálna sieť MySpace.


    more children: (43)
  • 0000010100792011026639540266396002648306
    mx 22.09.2006 - 19:59:04 level: 1 UP New
    1) PHP5 ma velmi nafigu spravene interfaces. Ocakaval by som, ze ked vytvorim triedu, ktora implementuje interfaces, budem mat moznost na zaklade toho, ktory interface pouzivam, vyuzivat poskytovane metody (tzn, mozem zakryvat ostatne nepouzivane casti danej classy pred okolitym svetom -- napriklad kvoli prehladnosti). PHP5 nieco take nepozna (kedze je netypove a velmi volne) a aj pri odovzdani parametra cez funkciu pri explicitnom specifikovani interface mi poskytne vsetky metody danej triedy... Priklad:

    2) php_mysql modul nedokaze korektne pracovat s sql resultami obsahujucimi viac ako jeden result set (napriklad je to vhodne pri stored procedures na strane servera, kedy rekurzivne vykonavam nejaku cinnost a postupne vraciam resulty). Dany problem treba riesit cez php_mysqli (volania podobne php_mysql s drobnymi zmenami, ale zato komplexny handling multiple result set queries)
  • 0000010100792011026639540266396002644898
  • 0000010100792011026639540266396002612315
    mx 04.09.2006 - 14:31:38 level: 1 UP New
    Ako donutit aby Dell Latitude D800 nepipal cez internal beeper?
    Oficialny postup (pre winXP), ktory som nasiel – opravte ma niekto, ak sa mylim – je:
    Start > Settings > System > Device Manager
    View > Show hidden devices
    Non-plug&play devices > Beep (right click) Disable
    Restart pocitaca
    … a uz nebeepa…
    Podotykam, interny beeper mi nikdy nevadil, ale tento je otrasny, hlasny a este k tomu na moment pipnutia zarusi repraky a zachrci este aj cez ne.
    Ak mate nejaky tool na jeho stisenie, rad si necham poradit &#61514;
    more children: (2)
  • 0000010100792011026639540266396002611770
    mx 04.09.2006 - 09:18:52 level: 1 UP New
    pred spanim este dve - mozno pre svet uzitocne - veci, ktore som zistil dnes pri instalacii...

    potreboval som spravit dump databazy jedneho webu (developoval som to ako vzdy na notebooku - winxp) a server bezi freebsd (pokial sa nemylim), dolezite je vsak, ze u mna bezi databaza mysql50 a na serveri mysql40... ako vieme, medzi 40 a 41 bol zasadny problem s character setmi, priam 40 nepozna nieco ako DEFAULT pri tvorbe tabulky, takze som sprvu zobral a vysekal DEFAULT zo vsetkych riadkov...
    zistenie - character sety boli uplne rozhadzane,... druhy pokus bol -- a nastastie uspesny -- najst v mysqldump parameter, ktorym vygenerujem dump kompatibilny so 40 - spravna syntax mysqldump pre tento pripad bola:

    mysqldump -u root -p --compatible=mysql40 --opt dbname > dbname_40.dmp

    vygenerovalo to dump, ktory som pohodlne (chap: bez toho, aby mysql hubovalo) naimportoval a spustil vitazoslavne joomlu... character sety v pohode ... LENZE

    pri zadavani novej polozky v admine som zistil, ze mi vygenerovalo Content Item (tak sa volaju jednotlive clanky) s ID 0 (nula)... co joomla ocividne handlovat nevedela a zacala robit blbosti; nevie to vymazat, nevie to editovat, proste nic; predsalen ID 0 na auto_increment poli sa vyskytnut nemoze... a to je ten problem, auto_increment pole, ktore mysqldump nejakym sposobom odignoroval a po nahodeni dumpu ziadne a_i nebolo... moznosti boli v principe dve ... rucne zeditovat vsetky create tables - co sa mi vobec nechcelo a ponahlal som sa, alebo pouzit dumpy z instalacie joomly... to by bolo fajn, lenze si treba davat pozor na dve veci (ktore som si ja najprv nedal):
    1) joomla.sql ma symbolicke mena tabuliek #__content, #__categories a podobne, ktore nasledne pri instalacii nahradza za vybrany prefix (default jos_)
    2) drop_table.sql (co je uzitocna vec presne na to, aby clovek nemusel rucne pisat drop tables) ma zase nazvy tabuliek prefixovane mos_ (kedze povodna joomla je mambo)
    1+2) staci len zmenit spravne prefixy, dropnut stavajuce tabulky, importnut originalne tabulky a na toto vsetko importnut vlastny dump (bez drop tables samozrejme), ktory sice vyhubuje, ze uz tabulky existuju, ale nic s nimi nespravi, len do nich vlozi data
    --
    pisal som to sem s tym, ze to mozno niekomu pomoze
    su to veci na druhy pohlad zrejme, ale chvilku mi trvalo, kym som ponachadzal spravne riesenia danych problemov
    kazdopadne stale mam pocit, ze joomla/mambo je dost nedotiahnuty kus software, avsak ked sa ho clovek nauci hackovat, moze sa tvarit aj priatelsky