Archief - quotes/sql injection

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

sarnath

Legacy Member
Ik gebruik onderandere mysql_real_escape_string of addslashes tegen te gaan.
Nu ben ik bezig aan een website en als ik deze functies gebruik worden er extra slashes geplaatst, met andere woorden, als ik niets van deze functies gebruik wordt automatisch van auto's auto\'s gemaakt.

Nu vroeg ik mij af, hoe komt dit? Zijn sommige php configuraties tegenwoordig standaard beveiligd tegen sql-injection? En zijn deze functies dan niet meer nodig?

Cycloon

Legacy Member
MySQLi gebruiken (prepared statements), zie ext/mysqli: Part I - Overview and Prepared Statements (vanaf het stuk bound parameters wordt het interessant). Hierdoor voorkom je op een 100% veilige manier sql injection en heb je ook geen last meer van quotes en toestanden (die hoe je dus niet meer te escapen e.d.).

De techniek die jij gebruikt is ondertussen al iets dat we naar de geschiedenis kunnen verwijzen en is zeker niet meer aan te raden om nog te gebruiken (ook al worden er jammer genoeg nog hopen zinloze tutorials voor gemaakt).

adrianhates

Legacy Member
Cycloon zei:
De techniek die jij gebruikt is ondertussen al iets dat we naar de geschiedenis kunnen verwijzen en is zeker niet meer aan te raden om nog te gebruiken (ook al worden er jammer genoeg nog hopen zinloze tutorials voor gemaakt).

idd, check de topic datum van die link.. 2005 :) Het gaat zelfs nog over php4.

Wat niet wegneemt dat ge nog altijd user input NOOIT moogt vertrouwen!!

sarnath

Legacy Member
Ok, heb het doorgenomen en het principe lijkt me zowat hetzelfde te zijn en dus kom ik bij mn oorspronkelijke vraag.

Stel dat magic_quotes_gpc() aan staat, dan gaat er dus vanzelf een \ geplaatst worden.

is dan mysql_real_escape_string of mysqli_real_escape_string evengoed nodig?

Kan me niet inbeelden dat je dat zomaar kan weglaten dan.

of gewoon altijd magic_quotes_gpc = Off zetten en toevoegen of stripslashes gebruiken ofzo?

Cycloon

Legacy Member
Je zet magic quotes af en je gebruikt de techniek die ik gepost heb. Je hoeft dan helemaal niet meer te escapen.

sarnath

Legacy Member
Ok bedankt, is een zeer interessant artikel, zal hier vanaf nu zeker gebruik van maken.

adrianhates

Legacy Member
moest ge toch niet altijd mysqli kunnen/willen gebruiken..
functie om input te clearen:

PHP:
/**
 * Function to sanitize and clean user input for input in database e.g.
 * 
 * @param String $input - The input that needs to be cleaned
 * @param boolean $allowhtml - Optional boolean to allow/disallow html
 * @return String - The cleaned input string
 */
function sanitize($input,$allowhtml = false){
    // if the input is an array
    if (is_array($input)) {
        foreach($input as $var=>$val) {
            $output[$var] = sanitize($val,$allowhtml);
        }
    }
    // single variable
    else {
        // check magic quotes setting
        if (get_magic_quotes_gpc()) {
            $input = stripslashes($input);
        }
        // call cleanInput function
        $input  = cleanInput($input,$allowhtml);
        // escae cleansed input
        $output = mysql_real_escape_string($input);
    }
    return $output;
}

/**
 * This function stripts out any not wanted tags or input
 * 
 * @param String $input - The string to clean
 * @param boolean $allowhtml - Optional boolean to allow/disallow html
 * @return String - The cleaned input string
 */
function cleanInput($input,$allowhtml = false) {

    if($allowhtml){
        $search = array(
            '@<script[^>]*?>.*?</script>@si',   // Strip out javascript
            '@<style[^>]*?>.*?</style>@siU',    // Strip style tags properly
        );
    }
    else{
        $search = array(
            '@<script[^>]*?>.*?</script>@si',   // Strip out javascript
            '@<[\/\!]*?[^<>]*?>@si',            // Strip out HTML tags
            '@<style[^>]*?>.*?</style>@siU',    // Strip style tags properly
        );
    }
    $output = preg_replace($search, '', $input);
    return $output;
}

sarnath

Legacy Member
adrianhates zei:
moest ge toch niet altijd mysqli kunnen/willen gebruiken..
functie om input te clearen:

PHP:
/**
 * Function to sanitize and clean user input for input in database e.g.
 * 
 * @param String $input - The input that needs to be cleaned
 * @param boolean $allowhtml - Optional boolean to allow/disallow html
 * @return String - The cleaned input string
 */
function sanitize($input,$allowhtml = false){
    // if the input is an array
    if (is_array($input)) {
        foreach($input as $var=>$val) {
            $output[$var] = sanitize($val);
        }
    }
    // single variable
    else {
        // check magic quotes setting
        if (get_magic_quotes_gpc()) {
            $input = stripslashes($input);
        }
        // call cleanInput function
        $input  = cleanInput($input,$allowhtml);
        // escae cleansed input
        $output = mysql_real_escape_string($input);
    }
    return $output;
}

/**
 * This function stripts out any not wanted tags or input
 * 
 * @param String $input - The string to clean
 * @param boolean $allowhtml - Optional boolean to allow/disallow html
 * @return String - The cleaned input string
 */
function cleanInput($input,$allowhtml = false) {

    if($allowhtml){
        $search = array(
            '@<script[^>]*?>.*?</script>@si',   // Strip out javascript
            '@<style[^>]*?>.*?</style>@siU',    // Strip style tags properly
        );
    }
    else{
        $search = array(
            '@<script[^>]*?>.*?</script>@si',   // Strip out javascript
            '@<[\/\!]*?[^<>]*?>@si',            // Strip out HTML tags
            '@<style[^>]*?>.*?</style>@siU',    // Strip style tags properly
        );
    }
    $output = preg_replace($search, '', $input);
    return $output;
}

zeer mooi, nu ben ik er, ik gebruikte iets gelijkaardigs, maar deed dit onderandere omgekeerd:

if (!(get_magic_quotes_gpc())) {
$input = addslashes($input);
}

Ik denk dat ik gewoon de werking van addslashes en mysql_real_escape_string niet goed geïnterpreteerd had.

Ik dacht dat stripslashes enkel gebruikt werd om opgehaalde data te converteren en wist niet dat de slashes er al staan na het POST gebeuren.

sarnath

Legacy Member
Cycloon zei:
Je zet magic quotes af en je gebruikt de techniek die ik gepost heb. Je hoeft dan helemaal niet meer te escapen.

Heb hier ook nog een vraag over, heb nu reeds een gedeelte van een website geconverteerd met werking via bound parameters.

Ik heb echter geen controle over mijn productieserver omdat deze via een firma verloopt.
Ik kan dan de magic quotes niet afzetten in php.ini.
Is er een manier om ervoor te zorgen dat je dan geen resultaten krijgt zoals auto\'s.
gewoon stripslashes gebruiken? Want ik kan er in de documentatie niet direct iets over vinden.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan