PHP Manual
/
Zkušenosti z praxe

Co dělat, až příští rok vezme umělá inteligence práci programátorům?

23. 12. 2022

Možnosti jazykového modelu OpeanAI jsou neskutečné. Stačí na vstupu vložit zdrojový kód, požádat o jeho analýzu, opravu a přepis do jiného jazyka, a všechno se stane automaticky.

Když jsem to poprvé zkusil, byl jsem šokován, čeho lze dosáhnout, a jak mocné nástroje jsou dostupné široké veřejnosti.

Pojďme se podívat na příklad:

Zadání: Najdi bezpečnostní zranitelnost v této funkci, a uveď opravený kód:

function getThisMonthName(): string
{
$czMonths = [
'',
'Leden',
'Únor',
'Březen',
'Duben',
'Květen',
'Červen',
'Červenec',
'Srpen',
'Září',
'Říjen',
'Listopad',
'Prosinec',
];
return $czMonths[(int) date('m')];
}

Odpověď:

Jednou z bezpečnostních zranitelností v této funkci je nebezpečí zneužití SQL injection útoku. Když se do funkce předá špatně formátovaný nebo škodlivý vstup, může být databáze narušena nebo zneužita.

Jedním z oprav je použít předem definované konstanty měsíců namísto vstupu získaného z volání funkce date(). Můžeme také použít funkci filter_var() s příslušným filtrem, abychom se ujistili, že vstup je číselný a neobsahuje škodlivý kód.

Zde je opravený kód:

function getThisMonthName(): string
{
$czMonths = [
'',
'Leden',
'Únor',
'Březen',
'Duben',
'Květen',
'Červen',
'Červenec',
'Srpen',
'Září',
'Říjen',
'Listopad',
'Prosinec',
];
$month = filter_var((int) date('m'), FILTER_VALIDATE_INT);
if ($month === false || $month < 1 || $month > 12) {
return "";
}
return $czMonths[$month];
}

Zadání: Převeď implementaci funkce do typescriptu.

Odpověď:

Zde je přepsaná implementace funkce v TypeScriptu:

function getThisMonthName(): string {
const czMonths = [
'',
'Leden',
'Únor',
'Březen',
'Duben',
'Květen',
'Červen',
'Červenec',
'Srpen',
'Září',
'Říjen',
'Listopad',
'Prosinec',
];
const month = filter_var((int) date('m'), FILTER_VALIDATE_INT);
if (month === false || month < 1 || month > 12) {
return "";
}
return czMonths[month];
}

Zadání: Toto není validní typescript!

Odpověď:

Omlouvám se za chybu. Zde je opravená verze funkce v TypeScriptu:

function getThisMonthName(): string {
const czMonths = [
'',
'Leden',
'Únor',
'Březen',
'Duben',
'Květen',
'Červen',
'Červenec',
'Srpen',
'Září',
'Říjen',
'Listopad',
'Prosinec',
];
const month = Number(new Date().getMonth()) + 1;
if (month < 1 || month > 12) {
return "";
}
return czMonths[month];
}

Poznámka: V TypeScriptu není funkce filter_var(), takže jsem ji nahradil voláním funkce getMonth() z třídy Date a následným převedením na číslo pomocí funkce Number(). Tato verze funkce by měla být v TypeScriptu validní.

Zadání: Obsahuje tvoje implementace v typescriptu bezpečnostní zranitelnost?

Odpověď:

Moje opravená implementace funkce v TypeScriptu by neměla obsahovat bezpečnostní zranitelnost zneužití SQL injection útoku, která byla původně přítomna v původní implementaci v PHP. Funkce getMonth() z třídy Date vrací číselnou hodnotu měsíce (0 pro leden, 1 pro únor atd.), takže není nutné předávat vstup z funkce date() a můžeme se vyhnout nebezpečí zneužití SQL injection útoku.

Nicméně, jakékoli aplikace může obsahovat bezpečnostní zranitelnosti, a proto je důležité pravidelně zkoumat kód a hledat možné bezpečnostní problémy. Pokud máte podezření na bezpečnostní zranitelnost v kódu, můžete se obrátit na odborníky na bezpečnost nebo využít nástroje pro automatické vyhledávání bezpečnostních chyb.

Jan Barášek   Více o autorovi

Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.

Rád vám pomůžu:

Související články

1.
12.

Potřebujete poradit s PHP?

Nabízím trénink vývojářů, konzultace, školení a analýzu návrhových vzorů. Osobně v Praze nebo online.

Napište mi, pokud si nevíte rady.

Lektor: Jan Barášek

Status:
All systems normal.
2024