Не баг, а фича

Новая тема всяких факапов вокруг разработки.

Я думал меня уже сложно удивить. Но нет…

Когда люди начинают играться в безопасников не очень понимая варианты или решать задачи “в лоб”, становится не по себе от их усидчивости и трудолюбия.

$deny_words = array(
    'UNION', 'CHAR', 'INSERT', 'DELETE', 'SELECT', 'UPDATE',
    'GROUP', 'ORDER', 'BENCHMARK', 'TRUNCATE',
    'union', 'char', 'insert', 'delete', 'select', 'update',
    'group', 'order', 'benchmark', 'truncate',
    'UNIOu', 'UNIoN', 'UNiON', 'UnION', 'uNION', 'uNIOn', 'uNIoN', 'uNiON',
    'unION', 'uniOn', 'UNIon', 'uNiOn', 'UNion', 'UnIoN', 'UnIon', 'unIoN',
    'DELETe', 'DELEte', 'DELete', 'DElete', 'Delete', 'dELETE', 'deLETE',
    'deleTE', 'delETE', 'DeLeTe', 'dElEtE', 'dElETE', 'DELeTe', 'DElETE',
    'DeLETE', 'DELEtE', 'DEletE', 'DeleTE', 'DelETE', 'DEleTE', 'DELetE',
    'CHAr', 'CHaR', 'ChAR', 'cHAR', 'chAR', 'CHar', 'CahR', 'chAr', 'cHAr',
    'ChAr', 'INSERt', 'INSErT', 'INSeRT', 'INsERT', 'InSERT', 'iNSERT',
    'INSErt', 'INSerT', 'INseRT', 'InsERT', 'inSERT', 'INSert', 'INserT',
    'InseRT', 'insERT', 'INsert', 'InserT', 'inseRT', 'Insert', 'insertT',
    'SELECt', 'SELEcT', 'SELeCT', 'SElECT', 'SeLECT', 'sELECT', 'SELEct',
    'SELecT', 'SEleCT', 'SelECT', 'seLECT', 'SELect', 'SElecT', 'SeleCT',
    'selECT', 'SElect', 'SelecT', 'seleCT', 'Select', 'selectT',
    'GROUP', 'GROUp', 'GROuP', 'GRoUP', 'GrOUP', 'gROUP', 'GROup', 'GRouP',
    'GroUP', 'grOUP', 'GRoup', 'GrouP', 'groUP', 'Group', 'grouP',
    'ORDEr', 'ORDeR', 'ORdER', 'OrDER', 'oRDER', 'ORDer', 'ORdeR', 'OrdER',
    'orDER', 'ORder', 'OrdeR', 'ordER', 'Order', 'ordeR',
    'UPDATe', 'UPDAtE', 'UPDaTE', 'UPdATE', 'UpDATE', 'uPDATE', 'UPDAte',
    'UPDatE', 'UPdaTE', 'UpdATE', 'upDATE', 'UPDate', 'UPdatE', 'UpdaTE',
    'updATE', 'UPdate', 'UpdatE', 'updaTE', 'Update', 'updatE',
    'BENCHMARk', 'BENCHMArK', 'BENCHMaRK', 'BENCHmARK', 'BENChMARK',
    'BENcHMARK', 'BEnCHMARK', 'BeNCHMARK', 'bENCHMARK', 'BENCHMArk',
    'BENCHMarK', 'BENCHmaRK', 'BENChmARK', 'BENchMARK', 'BEncHMARK',
    'BenCHMARK', 'beNCHMARK', 'BENCHMark', 'BENCHmarK', 'BENChmaRK',
    'BENchmARK', 'BEnchMARK', 'BencHMARK', 'benCHMARK', 'BENCHmark',
    'BENChmarK', 'BENchmaRK', 'BEnchmARK', 'BenchMARK', 'bencHMARK',
    'BENChmark', 'BENchmarK', 'BEnchmaRK', 'BenchmARK', 'benchMARK',
    'BENchmark', 'BEnchmarK', 'BenchmaRK', 'benchmARK', 'BEnchmark',
    'BenchmarK', 'benchmaRK', 'Benchmark', 'benchmarK', 'BeNcHmArK',
    'bEnChMaRk', 'BEnCHMaRK', 'BENChMaRK',
    'TRUNCATe', 'TRUNCAtE', 'TRUNCaTE', 'TRUNcATE', 'TRUnCATE', 'TRuNCATE',
    'TrUNCATE', 'tRUNCATE', 'TRUNCAte', 'TRUNCatE', 'TRUNcaTE', 'TRUncATE',
    'TRunCATE', 'TruNCATE', 'trUNCATE', 'TRUNCate', 'TRUNcatE', 'TRUncaTE',
    'TRuncATE', 'TrunCATE', 'truNCATE', 'TRUncate', 'TRuncatE', 'TruncaTE',
    'truncATE', 'TRuncate', 'TruncateE', 'truncaTE', 'Truncate', 'truncatE',
    'groUp', 'grOup', 'gRoup', 'grOUp', 'gROup', 'gROUp', 'ordEr', 'orDer',
    'oRder', 'orDEr', 'oRDer', 'oRDEr', 'updaTe', 'updAte', 'upDate',
    'uPdate', 'updATe', 'upDAte', 'uPDate', 'upDATe', 'uPDAte', 'uPDATe',
    'uniOn', 'unIon', 'uNion', 'unIOn', 'uNIon', 'uNIOn', 'chAr', 'cHar',
    'cHAr', 'inseRt', 'insErt', 'inSert', 'iNsert', 'insERt', 'inSErt',
    'iNSert', 'inSERt', 'iNSErt', 'iNSERt', 'seleCt', 'selEct', 'seLect',
    'sElect', 'selECt', 'seLEct', 'sELect', 'seLECt', 'sELEct', 'sELECt',
    'truncaTe', 'truncAte', 'trunCate', 'truNcate', 'trUncate', 'tRuncate',
    'truncATe', 'trunCAte', 'truNCate', 'trUNcate', 'tRUncate', 'trunCATe',
    'truNCAte', 'trUNCate', 'tRUNcate', 'truNCATe', 'trUNCAte', 'tRUNCate',
    'trUNCATe', 'tRUNCAte', 'tRUNCATe',
    'GrOuP', 'gRoUp', 'GRoUp', 'GrOUp', 'OrDeR', 'oRdEr', 'gRouP', 'grOuP',
    'OrDeR', 'orDeR', 'oRdeR', 'UpDaTe', 'uPdAtE', 'UPdAtE', 'uPDatE',
    'upDAtE', 'UnIoN', 'uNiOn', 'uNIoN', 'UniOn', 'InSeRt', 'iNsErT',
    'iNSeRt', 'InsErT', 'InSerT', 'iNsERt', 'sElEcT', 'SeLeCt', 'sELeCt',
    'SelEcT', 'sElECt', 'SeLecT', 'deleTe', 'delEte', 'deLete', 'dElete',
    'delETe', 'deLEte', 'dELete', 'deLETe', 'dELEte', 'dELETe',
    'TrUnCaTe', 'tRuNcAtE', 'TRunCAte', 'trUNcaTE', 'tRUncATe', 'TruNCatE',
    'trUNcaTE', 'TRunCAte', 'TRUnCATe', 'TRuNCAtE', 'tRUNcATE', 'TrUNCaTE',
    'tRuncAte', 'TRuNcATE', 'BeNcHmArK', 'bEnChMaRk', 'BEncHMarK',
    'beNCmArk', 'bENcHmARk', 'BenChMarK', 'BEncHmaRK', 'beNChMArk',
    'TRUNCATe', 'TRUNCAtE', 'TRUNCaTE', 'TRUNcATE', 'TRUnCATE', 'TRuNCATE',
    'TrUNCATE', 'tRUNCATE', 'TRUNCAte', 'TRUNCatE', 'TRUNcaTE', 'TRUncATE',
    'TRunCATE', 'TruNCATE', 'trUNCATE', 'TRUNCate', 'TRUNcatE', 'TRUncaTE',
    'TRuncATE', 'TrunCATE', 'trunCATE', 'TRUncate', 'TRuncatE', 'TruncaTE',
    'truncATE', 'TRuncate', 'TruncaE', 'truncaTE', 'Truncate', 'truncatE',
);

if (in_array($val, $deny_words)) {...}

Ну как бы…

$deny_words = array(
    'union', 'char', 'insert', 'delete', 'select',
    'update', 'group', 'order', 'benchmark', 'truncate'
);

$var = strtolower($var);
foreach ($deny_words as $dw) {
    if (stripos($var, $dw) !== false) {...}
}

Другой вопрос, что сам подход к решению проблемы это что-то на древнем. Это давно должно было стать стандартом в отрасли: PHP: Подготовленные запросы и хранимые процедуры - Manual.