AJAX biztonság
2014-10-20T23:54:37+02:00
2014-10-21T07:03:34+02:00
2022-07-22T15:43:18+02:00
  • Nem tudom miért nem PDO-t használsz és paraméterezett query-ket, amik esetében teljesen kizárható, hogy hagyományos értelemben vett SQL injekció áldozata legyen a programod, mindenfajta escape varázslás nélkül is.

    A natív MySQL függvények (mysql_*) amúgy is deprecated 5.5 óta, tehát hamarosan meg fognak szűnni, és így a programod is meg fog szűnni működni az új verziókon. Már csak emiatt is érdemes a PDO-t használni.

    Egyébként meg ennek az ég egy adta világon semmi köze nincs az AJAX-hoz, így nem is értem miért ezt a címet adtad neki.
    Mutasd a teljes hozzászólást!
  • Na ha security-fun oldalról nézzük:

    if( isset( $_SERVER['HTTP_X_REQUESTED_WITH'] ) && ( $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' ) )


    Nem biztos, hogy HTTP_X_REQUESTED_WITH megjön, vagy eredeti. Egy proxy-val tetszőlegesen manipulálható. Jó ha ellenőrzöd és kell is, de ettől még nem biztos, hogy ajax kérés jött. Egy proxy-s átírással simán beküldök így egy sima get, post...stb metódusos kérést és függ a webszervertől is. Tehát csak annyi, hogy attól még, hogy ez megvan, nem biztos, hogy tuti ajax hívás.

    $type = mysql_real_escape_string($_POST['type']);
    $type = mb_convert_encoding($type, 'UTF-8', 'UTF-8');

    Ez elég jól megzagyválja az inputot, ha mysql inject történik, pl nem utf8 karakterekre, hasznos cucc.

    $type = htmlentities($type, ENT_QUOTES, 'UTF-8');

    Ettől még simán beértelmez neked egy relatív path-ot, csak mysql barátan fogja elkészíteni. Így pl ha betárolnál egy filepath-ot, akkor a visszaolvasáskor simán elmegy a relatív útvonalon. Tehát ez tuti egy hézag, amivel pl. fileupload esetén kimegyek a root-ba is akár, mert csak a tárolást szabványosítja le. Ha kiolvasod a mezőértéket visszakapod az eredeti hack inputot. De a mysql-t nem bántotta természetesen.

    $sql="select * from tabla where mezo='$type' ";

    $_POST[type] = "1=1" esetén visszadaja az összes rekordodat. pl. username esetén gáz lenne, de egyébként is minimum egy LIMIT X-et beletennék, hogy ne készítsen egy túlterhelt választ.

    A mysql-hez javaslom neked még, hogy használj excluded_fields táblát. Definiáld egy tömbben, hogy milyen kulcsszavakat NEM engedsz meg az inputokban és ezt minden inputon ellenőrizni kell. A preg_match csodákra képes. Az is hasznos, ha limitálod az időegység alatt feldolgozható kérések számát. pl.: egy ip-címről 10 req/min.... bizonyos esetben érdemes lehet pl. query-cache-t készíteni szerver oldalra. Bejön pl. 100kérés ajax-on és nem akarod leültetni az adatbázist. Betolhatod a query-ket egy cache fileba, amit backend olvas és futat, a result-ot meg pl. json, csv fileba írja, az ajax feldolgozó meg azt próbálja olvasni, amint megvan, visszaadja a választ. Nyilván ez extrém eset, de használható ilyen is, hogy nem üljön le a rendszered, ha nagyon nagy a látogatás, vagy DDoS.

    Ajax security:
    - Használj session-t és kövesd (CSRF) ezzel azt tudod kivédeni, hogy pl valaki elkapja az ajax kérést és saját adattal próbálja rádküldeni (pl. proxyról), mivel a session-je nem létezik, vagy változik, el tudod utasítani.

    - Elkódolt adatokkal is manipulálhatod az átvitelt, hogy pl proxyval ne módosíthassák az eredeti kérés adatait, de ettől még nyilván azt ír be az inputba amit akart... az input tartalmát csak vizsgálattal tudod szűrni.
    Mutasd a teljes hozzászólást!
  • Sziasztok!

    Rengeteg AJAX-szal foglalkozó posztot olvastam angolul, magyarul, de a mai napig nem vagyok biztos abban, hogy megfelelően biztonságos-e, amit csinálok. Véleményetek szerint mennyire biztonságos az alábbi script, amit ajax-szal hívok meg?

    if( isset( $_SERVER['HTTP_X_REQUESTED_WITH'] ) && ( $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' ) )
    {
    $type = mysql_real_escape_string($_POST['type']);
    $type = mb_convert_encoding($type, 'UTF-8', 'UTF-8');
    $type = htmlentities($type, ENT_QUOTES, 'UTF-8');

    mysql_query('SET NAMES utf8');

    $sql="select * from tabla where mezo='$type' ";
    $res=mysql_query($sql);
    ...

    Köszönettel:
    O.
    Mutasd a teljes hozzászólást!
abcd