DrMoto.cz, DrShop.cz, DrElektro.cz
November 22nd, 2010Převod znaků do ASCII
October 28th, 2010Někdy se může hodit převést si text do ASCII kódu. Proto jsem si před nějakou dobou vytvořil tento malý program.
Program převádí zadané znaky na odpovídající ASCII kód. Dále si program pamatuje historii převáděných řetězců, tuto historii umí procházet, mazat, různě prohlížet. Podporuje vložení z/do schránky.
Program vypadá takto:

Výsledný .exe soubor ke stažení zde, zdrojové kódy v jazyce C# můžete stahovat zde.
UPDATE 1. 10. 2010: Byla opravena jedna chyba a přidělal jsem několik dalších drobností, které by měli přispět k pohodlnějšímu ovládání programu.
UPDATE 3. 10. 2010: Nyní je možný výběr z více výstupů.
UPDATE 28. 10. 2010: Do programu byly přidány klávesové zkratky, zde je jejich výčet:
- F5, Ctrl + E, Alt + X – převede řetězec do ASCII
- Ctrl + D – vymaže znaky z obou textboxů
- Ctrl + S – zobrazí všechny položky
- Left – posune se o položku zpět
- Right – posune se o položku vpřed
- Ctrl + Left – posune se na první položku
- Ctrl + Right – posune se na poslední položku
- Shift + Delete – smaže aktuální položku
- Ctrl + Shift + Delete – smaže všechny položky
- Ctrl + R – změna výstupního formátu
Klauzule TOP – MS SQL Server
October 27th, 2010Dříve jsem zde na blogu napsal článek Vybrání prvních n záznamů – MS Access a MySQL, nyní se na stejnou věc podíváme očima MS SQL Serveru.
Vytvořme si testovací tabulku pro náš pokus:
1 2 3 4 | CREATE TABLE test( id int identity(1,1) PRIMARY KEY, col1 int NOT NULL, col2 int NOT NULL); |
a naplňme tabulku daty:
1 2 3 4 5 6 7 8 9 10 11 | INSERT INTO test VALUES(1,1); INSERT INTO test VALUES(1,2); INSERT INTO test VALUES(1,3); INSERT INTO test VALUES(2,1); INSERT INTO test VALUES(2,2); INSERT INTO test VALUES(2,3); INSERT INTO test VALUES(3,1); INSERT INTO test VALUES(3,2); INSERT INTO test VALUES(3,3); INSERT INTO test VALUES(3,4); INSERT INTO test VALUES(3,5); |
V MS SQL Serveru není je pro vybrání prvních n záznamů dostupná klauzule TOP, která se dá použít třeba takto:
1 | SELECT TOP 2 col1,col2 FROM test; |
GROUP BY a ORDER BY:
Pojďme se nyní podívat, jaké výsledky nám MS SQL Server vrátí při použití těchto dvou klauzulí:
1 2 | SELECT TOP 1 col1,count(*) AS pocet FROM test GROUP BY col1 ORDER BY pocet ASC; |
Výsledek dotazu je:
1 – 3
Jak tedy vidíme, tak se klauzule TOP chová naprosto stejně jako klauzule LIMIT v MySQL. Jednoduše vybere prvních n záznamů bez ohledu na hodnotu sloupce uvedeného v klauzuli ORDER BY. V určitých případech by snad mohlo být žádoucí vracet takovou množinu dat, kde počet vrácených záznamů závisí právě na hodnotě sloupce v klauzuli ORDER BY (jako v MS Access):
1 – 3
2 – 3
WITH TIES
Výše uvedený požadavek lze jednoduše vyřešit s použitím WITH TIES u klauzule TOP:
1 2 | SELECT TOP 1 WITH TIES col1,count(*) AS pocet FROM test GROUP BY col1 ORDER BY pocet ASC; |
Výsledek dotazu je:
1 – 3
2 – 3
MS SQL Server tedy umožňuje velice snadným způsobem získat tyto dvě množiny dat.
Změna uživatelského jména – WordPress 2.9.2
September 25th, 2010U WordPressu verze 2.9.2 se v administraci nedá změnit uživatelské jméno (user_login). Hledal jsem všude možně v nastavení, ale tuto volbu jsem nenašel. Ano, existují nějaké pluginy pro možnost změny hesla, ale přijde mi trochu zbytečné instalovat plugin jen kvůli triviální změně hesla.
Takto vypadá kolonka pro uživatelské jméno v nastavení profilu:

Napadlo mě tedy změnit uživatelské jméno přímo přes dotaz v MySQL databázi. S tím už samozřejmě žádný problém není, dotaz vypadá takto (samozřejmě konkrétně pro můj případ):
1 2 | UPDATE wp_users SET user_login='paul27' WHERE user_login='admin'; |
Překlad doménových jmen – C/C++
September 25th, 2010Doménová jména jsou v podstatě IP adresy, jen v textové podobě. Byly zavedeny kvůli lepší použitelnosti, kdo by si také pamatoval http://77.75.76.3/ pro seznam.cz, že? Pokud ovšem chceme komunikovat pomocí socketů, musíme znát IP adresy. Ty lze získat právě překladem doménových jmen. Napsal jsem tedy překladač doménových jmen v C/C++. Nejsou v něm ošetřeny úplně všechny stavy, které mohou nastat, ale myslím, že jako ukázka to bohatě stačí.
Zdrojový kód lze stáhnout zde.
TCP server pro Windows – C/C++
September 19th, 2010Napsal jsem jednoduchý TCP server pro Windows. Tento TCP server je napsán v jazyce C/C++, spouští se z příkazové řádky se dvěma parametry. Prvním parametrem je číslo portu, na kterém bude naslouchat a druhým pak IPv4 adresa, ze které bude přijímat klienty.
Zdrojové kódy jsou ke stažení zde.
Knihovna ERD – MySQL Workbench 5.2
September 18th, 2010
Google hacking
September 5th, 2010Na dnešním internetu je spousta informací. Tolik informací, že se v nich mnozí ztrácejí a nedovedou najít přesně to, co potřebují. Proto bych se v dnešním článku rád zabýval efektivním vyhledáváním informací pomocí vyhledávače Google.
Název článku je Google hacking, což je možná trochu zavádějící. V tomto smyslu není Google hacking nic jiného, než tvorba efektivních vyhledávacích dotazů, takových dotazů, které vám pomohou najít přesně požadované informace bez zbytečných nerelevantních výsledků. Google hacking je to zcela legální záležitost.
Co to je Google a k čemu slouží patrně nemusím vysvětlovat, proto přistoupím rovnou k věci.
Velikost písmen a skloňování
Je zcela jedno, zdali zadáte matematika, MATEMATIKA či třeba MaTeMATIKA. Všechny 3 dotazy vrátí stejné výsledky. Na velikosti písmen záleží pouze u logických operátorů. Co se týče skloňování, Google na dotaz česko vrátí i výsledky obsahující českou, česká etc.
Uvozovky
Je rozdíl, pokud do Googlu zadáte “paul27 matematika”, nebo paul27 matematika. V prvním případě to hledá přesně daný řetězec, ve druhém (bez uvozovek) pak najde výsledky obsahující slovo paul27, nebo matematika.
Logické operátory
Vyhledávač Google umožňuje používat logické operátory AND, OR a NOT. Pokud je chcete použít, musí být zadány velkými písmeny. Operátor AND se používat nemusí, protože Google se defaultně snaží vrátit jen takové stránky, které obsahují všechny vyhledávané fráze. Pro operátor OR je ekvivalentem |, pro operátor NOT je ekvivalentem -. Dále lze použít operátor +, který říká, že výraz uvedený bezprostředně za ním musí být přesně obsažen ve výsledcích hledání. Ještě existuje operátor ~, který hledá i synonyma daného výrazu.
Základní syntaxe
Základní syntaxe je operátor:výraz. Je nutné, aby mezi dvojtečkou a výrazem (parametrem či třeba argumentem) nebyla mezera, stejně tak nesmí být mezera mezi operátorem a dvojtečkou.
inurl
Operátor inurl hledá výraz uvedený bezprostředně za ním v url adrese stránky. Řetězec inurl:matematika najde všechny stránky, v jejichž url adrese je slovo matematika.
allinurl
Tento operátor hledá v url adrese všechny řetězce uvedené za ním. Takže dotaz allinurl:programovani clanky najde všechny stránky, které v url adrese mají slova programovani a clanky.
intitle
Pokud se podíváte do zdrojového kódu stránky, tak hned v hlavičce uvidíte párový tag title. To co je uvedeno mezi tímto tagem je to, co se vám zobrazí v záhlaví prohlížeče a na záložce, takže to je většinou nějaký jasný text vystihující obsah celé stránky. Při použití intitle:programování Vám tedy Google vrátí jen takové výsledky, kde je slovo programování uvedeno v titulku stránky.
allintitle
Je to analogické k operátoru title, přičemž all opět znamená, že veškerá slova uvedená po tomto modifikátoru budou muset být obsaženy v titulku stránky.
intext
Operátor text prohledává pouze text stránky, tz. hledá mezi párovým tagem body.
allintext
Opět hledá všechna slova po tomto operátoru v textu stránky.
site
Zajímavý operátor, který prohledává jen určitou stránku. Pokud například chcete vědět, jaké všechny články o matematice naleznete na serveru novinky.cz, stačí použít: matematika site:novinky.cz. Stejně tak lze použít: matematika site:.cz a bude se prohledávat pouze česká doména.
filetype a ext
Potřebujete sehnat nějaký soubor v pdf a nechce se vám probírat tunou stránek a hledat daný soubor? Stačí použít filetype:pdf “platové třídy” a dostanete všechny možné soubory typu .pdf, které obsahují informace (obsahují přesně frázi platové třídy) o platových třídách. Operátor ext je synonymum.
link
Jak sám název napovídá, operátor link vrátí takové stránky, které odkazují na stránku uvedenou v parametru. Tedy link:www.muni.cz vrátí všechny stránky odkazující na stránku www.muni.cz
inanchor
Inanchor je do jisté míry podobný předešlému operátoru, nicméně hledá v popisku (textu) odkazu. Není tedy žádoucí jako parametr zadávat URL adresu jako v případě operátoru link.
numrange
Tento operátor ojediněle požaduje dva argumenty. Prvním z nich je spodní hranice a druhým horní hranice požadovaného intervalu, mezi těmito čísly jsou dvě tečky. Lze zadávat jen celá čísla. Pokud hledáme informace o válce mězi lety 1900 a 1920, použijeme war numrange:1900..1920, případně lze vynechat klíčové slovo numrange, tedy dotaz war 1900..1920 vrátí stejné výsledky.
cache
GoogleBot si indexuje stránky vždy po nějaké době, tz. že článek, který jste na blog poslali před 2 minutami pravděpodobně ještě nebude zaindexovaný a pro Google tedy zatím neznámý. Pokud chcete zjistit, jak si Google vaší stránku pamatuje, lze použít operátor cache. Při použití cache:paul27.ic se zobrazí moje stránka několik dní stará a ještě se zobrazí okno, kde jsou informace o tom, kdy GoogleBot naposledy navštívil a zaindexoval mojí stránku.
info
Info vrátí informace o dané stránce a zobrazí odkaz na její domovskou stránku.
define
Operátorem define získáme definici nějakého slova. Třeba define:extrovert nám něco málo řekne o povahových rysech.
Výše uvedené operátory lze samozřejmě různě kombinovat, takže lze vytvořit vskutku komplexní vyhledávací dotazy. Při správném používání lze najít skutečně to, co potřebujute a nemusíte se probírat tunou nerelevantních výsledků.
Programujte.com SQL Injection
August 22nd, 2010Myslím, že nemusím zdlouhavě představovat server programujte.com.
Nedávno jsem na tomto serveru vyzkoušel test na SQL Injection a výsledek je takový, že stránka je náchylná na tento typ útoku. Konkrétně jde o Blind SQL Injection, takže si útočník nemůže lehce zobrazit informace z databáze.
Chyba v zabezpečení se nachází na této stránce:
1 | http://programujte.com/?rubrika=3 |
A nyní malá ukázka SQL Injection:
1 | http://programujte.com/?rubrika=3 AND 1=1-- |
1 | http://programujte.com/?rubrika=3 AND 1=2-- |
U prvního dotazu se zobrazí požadovaná kategorie se všemi články, u druhého dotazu se zobrazí varování, že daná kategorie neobsahuje žádné články.
Jak lze rozpoznat z tohoto následujícího dotazu, tak na programujte.com je nasazena MySQL databáze verze 5. Takže můžeme využít databáze information_schema pro zjišťování názvů tabulek, slopců etc.
1 2 | http://programujte.com/?rubrika=3 AND (SELECT substring(version(),1,1))=char(53)-- |
Nyní je tedy už snadné začít pomalinku zjišťovat informace z databáze pomocí podobných dotazů:
1 2 3 4 5 6 | http://programujte.com/?rubrika=3 AND (SELECT substring(table_name,1,1) FROM information_schema.TABLES WHERE table_name LIKE char(37,117,122,105,118,97,116,101,108,101) AND table_schema=DATABASE() LIMIT 0,1) BETWEEN char(97) AND char(122)-- |
Pokud budeme v podobném duchu pokračovat, tak zjistíme názvy tabulek, sloupců etc. Poté lze obdobným způsobem zjišťovat uživatelská jména a hesla, případně jiné informace.
Tímto článkem nechci nikoho nabádat k trestné činnosti, článek je pouze informačního charakteru. Za případné zneužití těchto informací nenesu žádnou odpovědnost. Osobně jsem nijak nezneužil objevené bezpečnostní chyby. Kompetentní osoby serveru programujte.com byly informovány.
Úhel mezi ručičkami hodin
August 7th, 2010V minulosti jsem narazil v jedné soutěži na otázku, jaký úhel svírají ručičky hodin. Lze to spočítat podle následujících vzorců.
Úhel mezi hodinovou a minutovou ručičkou:
; kde
je počet minut, kde
je pořadové číslo hodiny z intervalu
.
Úhel mezi minutovou a sekundovou ručičkou:
; kde
je počet sekund, kde
je počet minut.
Úhel mezi hodinovou a sekundovou ručičkou:
; kde
je počet sekund, kde
je pořadové číslo hodiny z intervalu
, kde
je počet minut.