• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Własna walidacja pod SQL Injection

Object Storage Arubacloud
0 głosów
393 wizyt
pytanie zadane 19 listopada 2015 w PHP przez Ehlert Ekspert (212,790 p.)

Witam, robię własą funkcję do walidacji przeciw Injection i coś nie gra.

private function validateForSQL($var){
        for($i=0;$i < count($var); ++$var){
            switch($var[$i]){
                case '\'':
                    echo $var[$i].'\n';
                    return false;
                break;
                case '"':
                    echo $var[$i].'\n';
                    return false;
                break;
                case '-':
                    echo $var[$i].'\n';
                    return false;
                break;
                case '=':
                    echo $var[$i].'\n';
                    return false;
                break;
                default:
                    return true;
                break;
            }
        }
    }
//dla wywołania "post'_na-temat_SQL" wywala true

Może mnie ktoś oświecić? 

3 odpowiedzi

+2 głosów
odpowiedź 19 listopada 2015 przez efiku Szeryf (75,160 p.)

Jak już na chacie napisano, http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php/60496#60496 ( poczytaj dokładnie co tam jest napisane ) 

Warto będzie przepisać apkę na PDO!, jest tam też przykład od mysqli.

Ewentualnie możesz się pobawić w :

http://php.net/manual/en/function.filter-var.php
 

PDO jest obecnie standardem im szybciej się nauczysz tym lepiej dla Ciebie

komentarz 19 listopada 2015 przez efiku Szeryf (75,160 p.)

Twoja metoda  w PDO, oczywiscie przykladowa, nie testowalem..

zapytanie sql np SELECT costam FROM uzytkownik WHERE userName = :name 
a tabica dla parametrow :  

 [ ":name" => $fromPostName ] 

<?php

interface DataInterface
{

    /**
     * @return string
     */
    public function getSql();

    /**
     * @return array
     */
    public function getParams();

}

final class Data
{
    private $sql;
    private $params;

    public function __construct($sql, array $params)
    {
        $this->sql = $sql;
        $this->params = $params;
    }

    public function getSql()
    {
        return $this->sql;
    }

    public function getParams()
    {
        return $this->params;
    }
}


class Validator
{


    /**
     * @param PDO $pdo
     * @param DataInterface $data
     * @return array|bool
     */
    public function validateSQL(\PDO $pdo, \DataInterface $data)
    {

        $preparedQuery = $pdo->prepare($data->getSql());

        try {
            $preparedQuery->execute($data->getParams());
        } catch (PDOException $e) {
            return false;
        }

        return $preparedQuery->fetchAll();
    }
}

 

komentarz 19 listopada 2015 przez Ehlert Ekspert (212,790 p.)

Podziękował wink znaaaaki

+1 głos
odpowiedź 19 listopada 2015 przez Boshi VIP (100,240 p.)
po co ci to?
komentarz 19 listopada 2015 przez Ehlert Ekspert (212,790 p.)

Chyba nie trudno się domyślić, że chcę wykluczyć występowanie tych znaków w argumencie... indecision

komentarz 19 listopada 2015 przez Boshi VIP (100,240 p.)
Co ta twoja pokraczna funkcyja ma lepszego od tej z manuala?
komentarz 19 listopada 2015 przez Ehlert Ekspert (212,790 p.)
Nic po prostu jak coś piszę, to oprócz najniżej poziomowych rozwiązań wszystko implementuję sam.
komentarz 19 listopada 2015 przez Boshi VIP (100,240 p.)
Nie chciałbym abyś pisał  robił dla mnie cokolwiek patrząc od strony zlecenia...

Skoro implementujesz sam, to domyślam, się, że funkcje łączące z bazą danych, pobierające dane też sam piszesz? możesz je pokazać?
komentarz 19 listopada 2015 przez Ehlert Ekspert (212,790 p.)

Gdybyś nawet zaproponował to odmówię wink

oprócz najniżej poziomowych... 

komentarz 19 listopada 2015 przez Boshi VIP (100,240 p.)
To nie jest najniżej pisana funkcja.. nie bierz się za coś o czym nie masz pojęcia, bo przez  takich "programistów" jak Ty, phpapowcy mają opinię  jaką mają.  dzięki właśnie takim funkcjom które wyglądają tragicznie, nie działają jak powinny, są wolne i niebezpieczne, ale co tam, ważne, że własna funkcja, przecież te setki tysiący ludzie którzy testowali manual to debile.
komentarz 19 listopada 2015 przez Ehlert Ekspert (212,790 p.)

Dobrze, że zawsze znajdzie się taki mądrala jak ty który przywoła kogo trzeba do porządku. Z Twoim nastawieniem w każdym języku kończyłbym na Hello World. Nie inetersuje mnie opinia jaką robię "phpowacom". Może niech każdy (i Ty też) patrzy na siebie. Z hejtem za źle napisaną funkcję na tym forum jeszcze się nie spotkałem. frown

Zastanów się dlaczego jakoś efik odpowiedział normalnie a nie zgrywał wielkiego cwaniaka. 

komentarz 19 listopada 2015 przez Boshi VIP (100,240 p.)
Ale efik nie odpowiedził ci na pytanie? szukasz poklasku czy jak? on ci tylko wskazał czego się używa, co nie zmienia faktu, że można użyć gotowej funkcji  eskejpującej  nawet na poziomie mysql_connect... A ty wypisujesz jakąś bzdurną funkcję która nic nie robi tak na prawdę i jeszcze się pytasz  dlaczego coś nie działa...

szkoda mi tego języka bo tacy "Programiści" którzy obejrzą jeden kurs  potem piszą  apki na zlecenia za grosze do tego  kodem spaghetti i sie cieszą, że zarobili 50 zł za coś co jest warte 800 zł...

Skoro się jeszcze nie spotkałeś to znaczy,że żadnej innej funkcji nie pokazałeś. Ja się za to nie spotkałem jeszcze z taką ignorancją w stosunku do środowiska devów oraz  użytkówników forum...
komentarz 19 listopada 2015 przez Ehlert Ekspert (212,790 p.)
Kończę tą żałosną i bezproduktywną dyskusję bo serio mam alergię na osoby które świecą swoim EGO programistycznym wywyższając się przed innymi zamiast normalnie wyraźić swoją opinię i pomóc. Swoją drogą musisz być naprawdę aktywny na forum bo prawie 40k punktów przy takim zarozumialstwie i tylu amatorach programowania to nie lada wyzwanie.

Nie pozdrawiam.
+1 głos
odpowiedź 19 listopada 2015 przez writen Nałogowiec (29,060 p.)

ojejej. Iterator przede wszystkim. Czemu iterujesz zmienną $var zamiast $i?

Lepiej chyba użyć pętli foreach.

Nie wiem czemu stringa używasz jak tablicy. W PHP stringi nie są tablicami znaków. Musisz najpierw takiego stringa przekonwertować na tablicę funkcją str_split.

Zwracanie wartości w Case nie jest chyba najlepszym pomysłem. Lepiej zrobić return poza switch.

Z czystej ciekawości przemieliłem ten kod i wyszło mi coś działającego. Radzę jednak potraktować tą funkcję jako naukę i zastosować się do rad w pozostałych odpowiedziach.


function validateForSQL($var){
	$var = str_split($var);

        foreach($var as $v){
            switch($v){
                case '\'':
                    $result = false;
                break;
                case '"':
                    $result =false;
                break;
                case '-':
                    $result =false;
                break;
                case '=':
                    $result =false;
                break;
                default:
                    $result = true;
                break;
            }
			
			if(!$result) return false;
        }
	return true;
}

 

Podobne pytania

0 głosów
1 odpowiedź 406 wizyt
pytanie zadane 21 lutego 2016 w PHP przez makoso Mądrala (7,380 p.)
0 głosów
1 odpowiedź 311 wizyt
pytanie zadane 13 lutego 2019 w SQL, bazy danych przez Mateusz Kacprzak Początkujący (360 p.)
0 głosów
1 odpowiedź 705 wizyt

92,632 zapytań

141,500 odpowiedzi

319,879 komentarzy

62,012 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...