PHP සමඟ පරිශීලක ආදානය සනීපාරක්ෂක කරන්නේ කෙසේද?


1135

ඇතැම් වර්ගයේ HTML ටැග් වලට ඉඩ දෙන අතරම, SQL එන්නත් කිරීම සහ XSS ප්‍රහාර සඳහා පරිශීලක ආදානය සනීපාරක්ෂාව සඳහා හොඳින් ක්‍රියාත්මක වන යම් තැනක කැචල් ශ්‍රිතයක් තිබේද?


42
වර්තමානයේ, SQL එන්නත් කිරීම වළක්වා ගැනීමට, PDO හෝ MySQLi භාවිතා කරන්න.
ෆ්‍රැන්සිස්කෝ ප්‍රෙසෙන්ෂියා

77
PDO හෝ MySQLi භාවිතා කිරීම ප්‍රමාණවත් නොවේ. ඔබ විශ්වාස නොකරන දත්ත සමඟ ඔබේ SQL ප්‍රකාශයන් ගොඩනගන්නේ select * from users where name='$name'නම්, ඔබ PDO හෝ MySQLi හෝ MySQL භාවිතා කරන්නේ නම් එය ගැටළුවක් නොවේ. ඔබ තවමත් අනතුරේ. ඔබ පරාමිතිගත විමසුම් භාවිතා කළ යුතුය, නැතහොත් ඔබට අවශ්‍ය නම්, ඔබේ දත්ත මත පැන යාමේ යාන්ත්‍රණ භාවිතා කළ යුතුය, නමුත් එය වඩා අඩුය.
ඇන්ඩි ලෙස්ටර්

26
Nd ඇන්ඩිලෙස්ටර් ඔබ සූදානම් ප්‍රකාශයකින් තොරව යමෙකු PDO භාවිතා කරන බව අඟවනවාද? :)

64
මම කියන්නේ "PDO හෝ MySQLi භාවිතා කරන්න" නවකතාවන්ට ඒවා ආරක්ෂිතව භාවිතා කරන්නේ කෙසේද යන්න පැහැදිලි කිරීමට තරම් තොරතුරු නොවන බවයි. සූදානම් කළ ප්‍රකාශ වැදගත් බව ඔබ සහ මම දනිමි, නමුත් මෙම ප්‍රශ්නය කියවන සෑම කෙනෙකුම එය දැන ගනු ඇතැයි මම නොසිතමි. ඒ නිසා තමයි මම පැහැදිලි උපදෙස් එකතු කළේ.
ඇන්ඩි ලෙස්ටර්

31
ඇන්ඩිගේ ප්‍රකාශය සම්පූර්ණයෙන්ම වලංගු වේ. මම මෑතකදී මගේ mysql වෙබ් අඩවිය PDO බවට පරිවර්තනය කළෙමි. මගේ සමහර SQL ප්‍රකාශයන් තවමත් පරිශීලක ආදානය භාවිතයෙන් ගොඩනගා ඇති බව මට වැටහුණේ ක්‍රියාවලිය අතරතුරදීය. සූදානම් කළ ප්‍රකාශ භාවිතා කරමින් මම එය නිවැරදි කළෙමි. සම්පුර්ණ සාමනේරයකුට, බොහෝ විශේෂ experts යන් PDO භාවිතා කිරීම පිළිබඳව අදහස් දැක්වීම නිසා වෙනසක් ඇති බව සම්පූර්ණයෙන් පැහැදිලි නැත, නමුත් සූදානම් කළ ප්‍රකාශවල අවශ්‍යතාවය සඳහන් නොකරන්න. උපකල්පනය මෙය පැහැදිලිව පෙනේ. නමුත් නවකයෙකුට නොවේ.
GhostRider

Answers:


1193

පරිශීලක ආදානය පෙරීම කළ හැකි බව පොදු වැරදි මතයකි. මෙම අදහස මත ගොඩනැඟෙන මැජික්-කෝට්ස් ලෙස හැඳින්වෙන (දැන් අතහැර දමා ඇති) “අංගයක්” PHP සතුව ඇත . එය විකාරයකි. පෙරීම ගැන අමතක කරන්න (හෝ පිරිසිදු කිරීම හෝ මිනිසුන් එය හඳුන්වන ඕනෑම දෙයක්).

ගැටළු වළක්වා ගැනීම සඳහා ඔබ කළ යුතු දේ තරමක් සරල ය: ඔබ විදේශීය කේතයක් තුළ නූලක් කාවැද්දූ සෑම විටම එම භාෂාවේ නීතිරීතිවලට අනුව ඔබ එයින් ගැලවිය යුතුය. උදාහරණයක් ලෙස, ඔබ MySQL ඉලක්ක කර ගනිමින් යම් SQL එකක නූලක් කාවැද්දුවහොත්, ඔබ මේ සඳහා ( mysqli_real_escape_string) සඳහා MySQL හි ක්‍රියාකාරීත්වය සමඟ නූලෙන් ගැලවිය යුතුය . (හෝ, දත්ත සමුදායන් සම්බන්ධයෙන්, හැකි විට සූදානම් කළ ප්‍රකාශ භාවිතා කිරීම වඩා හොඳ ප්‍රවේශයකි.)

තවත් උදාහරණයක් වන්නේ HTML ය: ඔබ HTML සලකුණු තුළ නූල් කාවැද්දුවහොත්, ඔබ එයින් ගැලවිය යුතුය htmlspecialchars. මෙයින් අදහස් කරන්නේ සෑම ප්‍රකාශයක්ම echoහෝ printප්‍රකාශයක්ම භාවිතා කළ යුතු htmlspecialcharsබවයි.

තුන්වන උදාහරණය ෂෙල් විධාන විය හැකිය: ඔබ බාහිර විධානයන්ට නූල් (තර්ක වැනි) කාවැද්දීමට යන්නේ නම් සහ ඒවා සමඟ අමතන්න execනම්, ඔබ භාවිතා කළ යුතු escapeshellcmdඅතර escapeshellarg.

සහ එසේ ය ...

මෙම පමණක් ඔබ preformatted ආදාන භාර කරන්නේ නම්, ඔබ ක්රියාකාරීව පෙරහන දත්ත කිරීමට අවශ්ය වූ නඩුව වේ. උදාහරණයක් ලෙස, ඔබ ඔබේ පරිශීලකයින්ට HTML සලකුණු පළ කිරීමට ඉඩ දෙන්නේ නම්, ඔබ වෙබ් අඩවියේ ප්‍රදර්ශනය කිරීමට අදහස් කරයි. කෙසේ වෙතත්, ඔබ මෙය කොතරම් හොඳින් පෙරීම කළත්, එය සැමවිටම විභව ආරක්ෂක වළල්ලක් වනු ඇති බැවින් මෙය වළක්වා ගැනීමට ඔබ wise ානවන්ත විය යුතුය.


246
"මෙයින් අදහස් කරන්නේ සෑම ප්‍රතිරාවයක්ම හෝ මුද්‍රණ ප්‍රකාශයක්ම htmlspecialchars භාවිතා කළ යුතු බවයි" - ඇත්ත වශයෙන්ම, ඔබ අදහස් කරන්නේ "සෑම ... ප්‍රකාශයක්ම පරිශීලක ආදානය ප්‍රතිදානය කරයි"; htmlspecialchars () - ifying "echo 'ආයුබෝවන්, ලෝකය!';" පිස්සු වනු ඇත;)
බොබී ජැක්

11
පෙරීම නිවැරදි විසඳුම යැයි මා සිතන එක් අවස්ථාවක් තිබේ: යූටීඑෆ් -8. ඔබගේ යෙදුම පුරාම අවලංගු UTF-8 අනුක්‍රමයන් ඔබට අවශ්‍ය නැත (කේත මාර්ගය අනුව ඔබට විවිධ දෝෂ ප්‍රකෘතිමත් විය හැකිය), සහ UTF-8 පහසුවෙන් පෙරීම කළ හැකිය (හෝ ප්‍රතික්ෂේප කළ හැකිය).
කෝර්නෙල්

6
@jbyrd - නැත, LIKE විශේෂිත regexp භාෂාවක් භාවිතා කරයි. ඔබේ ආදාන නූලෙන් දෙවරක් පැන යාමට ඔබට සිදුවනු ඇත - එක් වරක් රීජෙක්ස්පී සඳහා සහ එක් වරක් මයිස්ක්ල් කේත කේතනය සඳහා. එය කේතය තුළ කේතය තුළ කේතයයි.
troelskn

6
මේ මොහොතේ mysql_real_escape_stringඅතහැර දමා ඇත. SQL එන්නත් කිරීම වැළැක්වීම සඳහා සූදානම් කළ ප්‍රකාශ භාවිතා කිරීම වර්තමානයේ හොඳ පුරුද්දක් ලෙස සැලකේ . එබැවින් MySQLi හෝ PDO වෙත මාරු වන්න.
මාසෙල් කෝර්පල්

4
ඔබ ප්‍රහාරක මතුපිට සීමා කරන නිසා. ඔබ කලින් සනීපාරක්ෂාව කරන්නේ නම් (ආදානය කරන විට), අයහපත් දත්ත හරහා ඇතුළු විය හැකි වෙනත් සිදුරු යෙදුමේ නොමැති බව ඔබට සහතික විය යුතුය. ඔබ එය ප්‍රමාද කරන්නේ නම්, ඔබේ ප්‍රතිදාන ශ්‍රිතයට එය ආරක්ෂිත දත්ත ලබා දී ඇති බවට “විශ්වාස” කළ යුතු නැත - එය සරලවම උපකල්පනය කරන්නේ සියල්ල අනාරක්ෂිත බවයි.
troelskn

217

ආදාන දත්ත සනීපාරක්ෂාව කිරීමෙන් SQL එන්නත් කිරීම වැළැක්වීමට උත්සාහ නොකරන්න.

ඒ වෙනුවට, ඔබේ SQL කේතය නිර්මාණය කිරීමේදී දත්ත භාවිතා කිරීමට ඉඩ නොදෙන්න . බැඳී ඇති විචල්‍යයන් භාවිතා කරන සූදානම් කළ ප්‍රකාශ (එනම් අච්චු විමසුමක පරාමිතීන් භාවිතා කිරීම) භාවිතා කරන්න. SQL එන්නත් කිරීමට එරෙහිව සහතික කළ හැකි එකම ක්‍රමය එයයි.

SQL එන්නත් කිරීම වැළැක්වීම සඳහා කරුණාකර මගේ වෙබ් අඩවිය http://bobby-tables.com/ බලන්න .


18
නැතහොත් නිල ලියකියවිලි වෙත ගොස් PDO සහ සූදානම් කළ ප්‍රකාශ ඉගෙන ගන්න. කුඩා ඉගෙනීමේ වක්‍රය, නමුත් ඔබ SQL ගැන හොඳින් දන්නේ නම්, ඔබට අනුවර්තනය වීමට කිසිදු ගැටළුවක් නොමැත.
කෝඩරයක්

2
SQL එන්නත් කිරීමේ විශේෂිත අවස්ථාව සඳහා, මෙය නිවැරදි පිළිතුරයි!
ස්කොට් ආකිස්ව්ස්කි

4
සකස් කළ ප්‍රකාශවලින් කිසිදු ආරක්ෂාවක් එකතු නොවන බව සලකන්න, පරාමිතිගත විමසුම්. ඒවා PHP හි එකට භාවිතා කිරීම ඉතා පහසු වේ.
මූලික

එය එකම සහතික කළ මාර්ගය නොවේ. ආදානය හෙක්ස් කිරීම සහ විමසුමේ නිරුපණය කිරීම ද වළක්වනු ඇත. ඔබ නිවැරදිව හෙක්සිං භාවිතා කරන්නේ නම් හෙක්ස් ප්‍රහාර ද කළ නොහැක.
රමොන් බකර්

ඔබ ඊමේල් ලිපින හෝ පරිශීලක නාම වැනි විශේෂිත යමක් ඇතුළත් කරන්නේ නම් කුමක් කළ යුතුද?
ඒබ්‍රහම් බ

79

නැත. ඔබට අවශ්‍ය දේ පිළිබඳ කිසිදු සන්දර්භයක් නොමැතිව ඔබට සාමාන්‍යයෙන් දත්ත පෙරහන් කළ නොහැක. සමහර විට ඔබට SQL විමසුමක් ආදානය ලෙස ගැනීමට අවශ්‍ය වන අතර සමහර විට ඔබට HTML ආදානය ලෙස ගැනීමට අවශ්‍ය වනු ඇත.

ඔබට සුදු ලැයිස්තුවක් මත ආදානය පෙරීමට අවශ්‍යය - දත්ත ඔබ අපේක්ෂා කරන දේවල යම් පිරිවිතරයන්ට ගැලපෙන බවට සහතික වන්න. ඔබ එය භාවිතා කරන සන්දර්භය අනුව එය භාවිතා කිරීමට පෙර එයින් ගැලවිය යුතුය.

SQL එන්නත් කිරීම වැළැක්වීම සඳහා SQL සඳහා දත්ත වලින් ගැලවීමේ ක්‍රියාවලිය - XSS වැළැක්වීම සඳහා (X) HTML සඳහා දත්ත වලින් ගැලවීමේ ක්‍රියාවලියට වඩා බෙහෙවින් වෙනස් ය.


52

PHP හි දැන් නව පෙරහන්_ඉන්පුට් කාර්යයන් ඇත, උදාහරණයක් ලෙස 'අවසාන ඊමේල් රීජෙක්ස්' සොයා ගැනීමෙන් ඔබව නිදහස් කරයි.

මගේම පෙරහන් පන්තිය (වැරදි ක්ෂේත්‍ර ඉස්මතු කිරීමට ජාවාස්ක්‍රිප්ට් භාවිතා කරයි) අජැක්ස් ඉල්ලීමක් හෝ සාමාන්‍ය පෝස්ට් පෝස්ට් එකකින් ආරම්භ කළ හැකිය. (පහත උදාහරණය බලන්න)

/**
 *  Pork.FormValidator
 *  Validates arrays or properties by setting up simple arrays. 
 *  Note that some of the regexes are for dutch input!
 *  Example:
 * 
 *  $validations = array('name' => 'anything','email' => 'email','alias' => 'anything','pwd'=>'anything','gsm' => 'phone','birthdate' => 'date');
 *  $required = array('name', 'email', 'alias', 'pwd');
 *  $sanitize = array('alias');
 *
 *  $validator = new FormValidator($validations, $required, $sanitize);
 *                  
 *  if($validator->validate($_POST))
 *  {
 *      $_POST = $validator->sanitize($_POST);
 *      // now do your saving, $_POST has been sanitized.
 *      die($validator->getScript()."<script type='text/javascript'>alert('saved changes');</script>");
 *  }
 *  else
 *  {
 *      die($validator->getScript());
 *  }   
 *  
 * To validate just one element:
 * $validated = new FormValidator()->validate('blah@bla.', 'email');
 * 
 * To sanitize just one element:
 * $sanitized = new FormValidator()->sanitize('<b>blah</b>', 'string');
 * 
 * @package pork
 * @author SchizoDuckie
 * @copyright SchizoDuckie 2008
 * @version 1.0
 * @access public
 */
class FormValidator
{
    public static $regexes = Array(
            'date' => "^[0-9]{1,2}[-/][0-9]{1,2}[-/][0-9]{4}\$",
            'amount' => "^[-]?[0-9]+\$",
            'number' => "^[-]?[0-9,]+\$",
            'alfanum' => "^[0-9a-zA-Z ,.-_\\s\?\!]+\$",
            'not_empty' => "[a-z0-9A-Z]+",
            'words' => "^[A-Za-z]+[A-Za-z \\s]*\$",
            'phone' => "^[0-9]{10,11}\$",
            'zipcode' => "^[1-9][0-9]{3}[a-zA-Z]{2}\$",
            'plate' => "^([0-9a-zA-Z]{2}[-]){2}[0-9a-zA-Z]{2}\$",
            'price' => "^[0-9.,]*(([.,][-])|([.,][0-9]{2}))?\$",
            '2digitopt' => "^\d+(\,\d{2})?\$",
            '2digitforce' => "^\d+\,\d\d\$",
            'anything' => "^[\d\D]{1,}\$"
    );
    private $validations, $sanatations, $mandatories, $errors, $corrects, $fields;


    public function __construct($validations=array(), $mandatories = array(), $sanatations = array())
    {
        $this->validations = $validations;
        $this->sanitations = $sanitations;
        $this->mandatories = $mandatories;
        $this->errors = array();
        $this->corrects = array();
    }

    /**
     * Validates an array of items (if needed) and returns true or false
     *
     */
    public function validate($items)
    {
        $this->fields = $items;
        $havefailures = false;
        foreach($items as $key=>$val)
        {
            if((strlen($val) == 0 || array_search($key, $this->validations) === false) && array_search($key, $this->mandatories) === false) 
            {
                $this->corrects[] = $key;
                continue;
            }
            $result = self::validateItem($val, $this->validations[$key]);
            if($result === false) {
                $havefailures = true;
                $this->addError($key, $this->validations[$key]);
            }
            else
            {
                $this->corrects[] = $key;
            }
        }

        return(!$havefailures);
    }

    /**
     *
     *  Adds unvalidated class to thos elements that are not validated. Removes them from classes that are.
     */
    public function getScript() {
        if(!empty($this->errors))
        {
            $errors = array();
            foreach($this->errors as $key=>$val) { $errors[] = "'INPUT[name={$key}]'"; }

            $output = '$$('.implode(',', $errors).').addClass("unvalidated");'; 
            $output .= "new FormValidator().showMessage();";
        }
        if(!empty($this->corrects))
        {
            $corrects = array();
            foreach($this->corrects as $key) { $corrects[] = "'INPUT[name={$key}]'"; }
            $output .= '$$('.implode(',', $corrects).').removeClass("unvalidated");';   
        }
        $output = "<script type='text/javascript'>{$output} </script>";
        return($output);
    }


    /**
     *
     * Sanitizes an array of items according to the $this->sanitations
     * sanitations will be standard of type string, but can also be specified.
     * For ease of use, this syntax is accepted:
     * $sanitations = array('fieldname', 'otherfieldname'=>'float');
     */
    public function sanitize($items)
    {
        foreach($items as $key=>$val)
        {
            if(array_search($key, $this->sanitations) === false && !array_key_exists($key, $this->sanitations)) continue;
            $items[$key] = self::sanitizeItem($val, $this->validations[$key]);
        }
        return($items);
    }


    /**
     *
     * Adds an error to the errors array.
     */ 
    private function addError($field, $type='string')
    {
        $this->errors[$field] = $type;
    }

    /**
     *
     * Sanitize a single var according to $type.
     * Allows for static calling to allow simple sanitization
     */
    public static function sanitizeItem($var, $type)
    {
        $flags = NULL;
        switch($type)
        {
            case 'url':
                $filter = FILTER_SANITIZE_URL;
            break;
            case 'int':
                $filter = FILTER_SANITIZE_NUMBER_INT;
            break;
            case 'float':
                $filter = FILTER_SANITIZE_NUMBER_FLOAT;
                $flags = FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND;
            break;
            case 'email':
                $var = substr($var, 0, 254);
                $filter = FILTER_SANITIZE_EMAIL;
            break;
            case 'string':
            default:
                $filter = FILTER_SANITIZE_STRING;
                $flags = FILTER_FLAG_NO_ENCODE_QUOTES;
            break;

        }
        $output = filter_var($var, $filter, $flags);        
        return($output);
    }

    /** 
     *
     * Validates a single var according to $type.
     * Allows for static calling to allow simple validation.
     *
     */
    public static function validateItem($var, $type)
    {
        if(array_key_exists($type, self::$regexes))
        {
            $returnval =  filter_var($var, FILTER_VALIDATE_REGEXP, array("options"=> array("regexp"=>'!'.self::$regexes[$type].'!i'))) !== false;
            return($returnval);
        }
        $filter = false;
        switch($type)
        {
            case 'email':
                $var = substr($var, 0, 254);
                $filter = FILTER_VALIDATE_EMAIL;    
            break;
            case 'int':
                $filter = FILTER_VALIDATE_INT;
            break;
            case 'boolean':
                $filter = FILTER_VALIDATE_BOOLEAN;
            break;
            case 'ip':
                $filter = FILTER_VALIDATE_IP;
            break;
            case 'url':
                $filter = FILTER_VALIDATE_URL;
            break;
        }
        return ($filter === false) ? false : filter_var($var, $filter) !== false ? true : false;
    }       



}

ඇත්ත වශයෙන්ම, ඔබ භාවිතා කරන්නේ කුමන ආකාරයේ db ද යන්න මත පදනම්ව ඔබේ SQL විමසුම ද පැන යා යුතු බව මතක තබා ගන්න (mysql_real_escape_string () වර්ග සේවාදායකයකට නිෂ් less ල ය). ORM වැනි ඔබේ සුදුසු යෙදුම් ස්ථරයේ මෙය ස්වයංක්‍රීයව හැසිරවීමට ඔබට අවශ්‍ය විය හැකිය. එසේම, ඉහත සඳහන් කළ පරිදි: html වෙත ප්‍රතිදානය කිරීම සඳහා htmlspecialchars වැනි අනෙකුත් php කැපවූ කාර්යයන් භාවිතා කරන්න;)

ඉවත් කරන ලද පන්ති සහ / හෝ ටැග් වැනි HTML ආදානයට සැබවින්ම ඉඩ දීම සඳහා කැපවූ xss වලංගු කිරීමේ පැකේජයක් මත රඳා පවතී. HTML විග්‍රහ කිරීම සඳහා ඔබේම රෙගුලාසි ලියන්න එපා!


20
මෙය ආදාන වලංගු කිරීම සඳහා පහසු පිටපතක් විය හැකි බව පෙනේ, නමුත් එය ප්‍රශ්නයට සම්පූර්ණයෙන්ම අදාල නොවේ.
rjmunro

43

නැත, නැත.

පළමුවෙන්ම, SQL එන්නත් කිරීම ආදාන පෙරීමේ ගැටළුවක් වන අතර XSS යනු ප්‍රතිදානයෙන් ගැලවී යන එකකි - එබැවින් ඔබ මෙම ක්‍රියා දෙක එකම වේලාවක කේත ජීවන චක්‍රයේ ක්‍රියාත්මක නොකරනු ඇත.

මාපට ඇඟිල්ලේ මූලික නීති

  • SQL විමසුම සඳහා, පරාමිතීන් බන්ධනය කරන්න (PDO සමඟ මෙන්) හෝ විමසුම් විචල්‍යයන් සඳහා ධාවක-ස්වදේශීය ගැලවීමේ ශ්‍රිතයක් භාවිතා කරන්න (වැනි mysql_real_escape_string())
  • strip_tags()අනවශ්‍ය HTML පෙරීමට භාවිතා කරන්න
  • අනෙක් සියලුම නිමැවුම් වලින් ගැලවී htmlspecialchars()මෙහි 2 වන සහ 3 වන පරාමිතීන් ගැන සැලකිලිමත් වන්න.

1
එබැවින් ඔබ භාවිතා කරන්නේ ස්ට්‍රිප්_ටැග්ස් () හෝ htmlspecialchars () පමණි, ආදාන මඟින් ඔබට පිළිවෙලින් ඉවත් කිරීමට හෝ පැන යාමට අවශ්‍ය HTML ඇති බව ඔබ දන්නා විට - ඔබ එය කිසිදු ආරක්ෂක කටයුත්තක් සඳහා භාවිතා නොකරන්නේද? එසේම, ඔබ බන්ධනය කරන විට, බොබී මේස වැනි දේවල් සඳහා එය කරන්නේ කුමක්ද? "රොබට්"); ටේබල් සිසුන් අතහරින්න; - "එය උපුටා දැක්වීම් වලින් ගැලවී යයිද?
රොබට් මාක් බ්‍රැම්

2
ඔබ සතුව දත්ත සමුදායක් තුළට ගොස් පසුව වෙබ් පිටුවල දර්ශනය වන පරිශීලක දත්ත තිබේ නම්, එය සාමාන්‍යයෙන් එය ලියා ඇති ප්‍රමාණයට වඩා බොහෝ දේ කියවන්නේ නැද්ද? මට නම්, ඔබ එය ගබඩා කිරීමට පෙර එය එක් වරක් (ආදානය ලෙස) පෙරීම වඩා අර්ථවත් කරයි, ඔබ එය පෙන්වන සෑම අවස්ථාවකම එය පෙරීම වෙනුවට. මට යමක් මග හැරී ඇත්ද? නැතහොත් සමූහයක් මේ හා පිළිගත් පිළිතුරෙහි අනවශ්‍ය කාර්ය සාධනය සඳහා ඡන්දය ප්‍රකාශ කර තිබේද?
jbo5112

2
මට හොඳම පිළිතුර. එය කෙටි වන අතර ඔබ මගෙන් ඇසුවොත් ප්‍රශ්නය හොඳින් ආමන්ත්‍රණය කරයි. කිසියම් එන්නතක් සමඟ PHP _POST හෝ $ _GET හරහා කෙසේ හෝ PHP ට පහර දිය හැකිද?
ජෝ ස්මෝ

ඔව්, $ පෝස්ට් සහ $ ලබා ගැනීමේ අරා සියලු අක්ෂර පිළිගනී, නමුත් පළ කරන ලද php පිටුවේ චරිතය ගණනය කිරීමට ඉඩ දෙන්නේ නම් එම සමහර චරිත ඔබට එරෙහිව භාවිතා කළ හැකිය. එබැවින් ඔබ සංකේතාත්මක අක්ෂර වලින් (", 'සහ` වැනි) ගැලවී නොගියහොත් එය ප්‍රහාරක දෛශිකයක් විවෘත කළ හැකිය. `අක්‍ෂරය බොහෝ විට මග හැරී ඇති අතර විධාන රේඛා ක්‍රියාත්මක කිරීමේ හැක් සෑදීමට භාවිතා කළ හැකිය. නමුත් වෙබ් යෙදුම් ෆයර්වෝල් හැක්ස් සඳහා ඔබට උදව් නොකරනු ඇත.
drtechno

22

XSS ගැටළුව විසඳීම සඳහා, HTML Purifier බලන්න . එය තරමක් වින්‍යාසගත කළ හැකි අතර හොඳ වාර්තාවක් ඇත.

SQL එන්නත් කිරීමේ ප්‍රහාර සම්බන්ධයෙන්, ඔබ පරිශීලක ආදානය පරීක්ෂා කර බලා mysql_real_escape_string () වුවද එය ක්‍රියාත්මක කරන්න. මෙම ක්‍රියාව මඟින් සියලු එන්නත් ප්‍රහාරයන් පරාජය නොකරනු ඇත, එනමුත් ඔබේ විමසුම් නූලට දමන්නට පෙර දත්ත පරීක්ෂා කිරීම වැදගත්ය.

වඩා හොඳ විසඳුමක් වන්නේ සූදානම් කළ ප්‍රකාශ භාවිතා කිරීමයි. මෙම PDO පුස්තකාල හා mysqli දිගුව සහාය මේ.


ආදානය සනීපාරක්ෂාව කිරීම වැනි දෙයක් කිරීමට "හොඳම ක්‍රමයක්" නොමැත .. පුස්තකාලයක් භාවිතා කරන්න, html පිරිසිදුකාරකය හොඳයි. මෙම පුස්තකාල බොහෝ වාර ගණනක් පහර දී ඇත. එබැවින් එය ඔබටම පැමිණිය හැකි ඕනෑම දෙයකට වඩා වෙඩි නොවදින ය
paan

Bioinformatics.org/phplabware/internal_utilities/htmLawed ද බලන්න . මගේ අවබෝධයෙන් වර්ඩ්ප්‍රෙස් පැරණි අනුවාදයක් භාවිතා කරයි, core.trac.wordpress.org/browser/tags/2.9.2/wp-includes/kses.php
ස්ටීව් ක්ලේ

වර්ඩ්ප්‍රෙස් හි ඇති ගැටළුව නම්, එය දත්ත සමුදාය උල්ලං to නය වීමට හේතු වන php-sql එන්නත් කිරීමේ ප්‍රහාරයක් නොවීමයි. එක්ස්එම්එල් විමසුමකින් රහස් හෙළි කරන දත්ත ගබඩා කරන ක්‍රමලේඛිත ප්ලගීන මග හැරීම වඩාත් ගැටළු සහගතය.
drtechno


17

ඔබට වැනි පිටුවක් ඇති නිශ්චිත අවස්ථාවකට උදව් කළ හැකි එක් උපක්‍රමයක් නම්, ඔබ කොතැනක හෝ /mypage?id=53වගන්තියක හැඳුනුම්පත භාවිතා කරන්නේ නම්, හැඳුනුම්පත අනිවාර්යයෙන්ම පූර්ණ සංඛ්‍යාවක් බව සහතික කිරීම ය:

if (isset($_GET['id'])) {
  $id = $_GET['id'];
  settype($id, 'integer');
  $result = mysql_query("SELECT * FROM mytable WHERE id = '$id'");
  # now use the result
}

නමුත් ඇත්ත වශයෙන්ම එය එක් විශේෂිත ප්‍රහාරයක් පමණක් කපා හරින බැවින් අනෙක් සියලුම පිළිතුරු කියවන්න. (ඔව්, ඉහත කේතය විශිෂ්ට නොවන බව මම දනිමි, නමුත් එය නිශ්චිත ආරක්‍ෂාව පෙන්වයි.)


11
මම ඒ වෙනුවට $ id = intval ($ id) භාවිතා කරමි :)
ඩක් ට්‍රාන්

සංඛ්‍යාත්මක දත්ත පමණක් ඇතුළත් කර ඇති බව සහතික කිරීම සඳහා පූර්ණ සංඛ්‍යා වාත්තු කිරීම හොඳ ක්‍රමයකි.
පරීක්ෂා කරන්න

1
$id = (int)$_GET['id']හා $que = sprintf('SELECT ... WHERE id="%d"', $id)හොඳ වේ
vladkras

16

PHP සමඟ පරිශීලක ආදානය සනීපාරක්ෂක කිරීමේ ක්‍රම:

  • MySQL සහ PHP හි නවීන අනුවාදයන් භාවිතා කරන්න.

  • අක්ෂර වින්‍යාසය පැහැදිලිව සකසන්න:

    • $ mysqli-> set_charset ("utf8");
      අත්පොත
    • $ pdo = නව PDO ('mysql: host = localhost; dbname = testdb; charset = UTF8', $ user, $ password);
      අත්පොත
    • $ pdo-> exec ("නම් සකසන්න utf8");
      අත්පොත
    • $ pdo = නව PDO (
      "mysql: host = $ host; dbname = $ db", $ user, $ pass, 
      අරාව (
      PDO :: ATTR_ERRMODE => PDO :: ERRMODE_EXCEPTION,
      PDO :: MYSQL_ATTR_INIT_COMMAND => "නම් සකසන්න utf8"
      )
      );
      අත්පොත
    • mysql_set_charset ('utf8')
      [PHP 5.5.0 හි ඉවත් කර ඇත, PHP 7.0.0 හි ඉවත් කර ඇත].
  • ආරක්ෂිත අක්ෂර කට්ටල භාවිතා කරන්න:

    • Utf8, latin1, ascii .. තෝරන්න අවදානමට ලක්විය හැකි අක්ෂර ලොකු 5, cp932, gb2312, gbk, sjis භාවිතා නොකරන්න.
  • අවකාශීය ශ්‍රිතය භාවිතා කරන්න:

    • MySQLi විසින් සකස් කරන ලද ප්‍රකාශ:
      $ stmt = $ mysqli-> සකස් කරන්න ('පරීක්ෂණයෙන් * තෝරන්න WHERE නම =? සීමාව 1'); 
      $ param = "'හෝ 1 = 1 / *";
      $ stmt-> bind_param ('s', $ param);
      $ stmt-> ක්‍රියාත්මක කරන්න ();
    • PDO :: quote () - ආදාන නූල වටා උපුටා දැක්වීම් (අවශ්‍ය නම්) සහ පාදක ධාවකයට උචිත උපුටා දැක්වීමේ ශෛලියක් භාවිතා කරමින් ආදාන නූල තුළ විශේෂ අක්ෂර වලින් ගැලවී යයි:

      $ pdo = නව PDO ('mysql: host = localhost; dbname = testdb; charset = UTF8', $ user, $ password); අක්ෂර කට්ටලය පැහැදිලි ලෙස සකසන්න
      $ pdo-> setAttribute (PDO :: ATTR_EMULATE_PREPARES, අසත්ය); MySQL හට ස්වදේශීයව සකස් කළ නොහැකි ප්‍රකාශයන් අනුකරණය කිරීම වැළැක්වීම සඳහා සූදානම් කළ ප්‍රකාශ අනුකරණය කිරීම අක්‍රීය කරන්න (එන්නත් කිරීම වැළැක්වීමට)
      $ var = $ pdo-> quote ("'OR 1 = 1 / *"); වචනානුසාරයෙන් ගැලවීම පමණක් නොව, එය උපුටා දක්වයි (තනි-උපුටා දැක්වීමේ අක්ෂර වලින්) $ stmt = $ pdo-> විමසුම ("පරීක්ෂණයෙන් තෝරන්න WHERE නම = $ var LIMIT 1");

    • PDO සකස් කළ ප්‍රකාශ : එදිරිව MySQLi සකස් කළ ප්‍රකාශයන් වැඩි දත්ත සමුදා ධාවක සහ නම් කරන ලද පරාමිතීන් සඳහා සහය දක්වයි:

      $ pdo = නව PDO ('mysql: host = localhost; dbname = testdb; charset = UTF8', $ user, $ password); අක්ෂර කට්ටලය පැහැදිලි ලෙස සකසන්න
      $ pdo-> setAttribute (PDO :: ATTR_EMULATE_PREPARES, අසත්ය); MySQL හට ස්වදේශීයව සකස් කළ නොහැකි ප්‍රකාශයන් අනුකරණය කිරීම වැළැක්වීම සඳහා සූදානම් කළ ප්‍රකාශ අනුකරණය කිරීම අක්‍රීය කරන්න (එන්නත් කිරීම වැළැක්වීමට) $ stmt = $ pdo-> සූදානම් කරන්න ('පරීක්ෂණයෙන් තෝරන්න * නම කොහේද =? සීමාව 1'); $ stmt-> ක්‍රියාත්මක කරන්න (["'හෝ 1 = 1 / *"]);

    • mysql_real_escape_string [PHP 7.0.0 ඉවත්, PHP 5.5.0 නිකුතුව සමඟ අතහැර].
    • mysqli_real_escape_string සම්බන්ධතාවයේ වත්මන් අක්ෂර වින්‍යාසය සැලකිල්ලට ගනිමින් SQL ප්‍රකාශයක භාවිතා කිරීම සඳහා නූලක විශේෂ අක්ෂර ගැලවී යයි . නමුත් සකස් කළ ප්‍රකාශ භාවිතා කිරීමට නිර්දේශ කර ඇත්තේ ඒවා හුදෙක් ගැලවී නැති නූල් නොවන නිසා, ප්‍රකාශයක් සම්පූර්ණ විමසුම් ක්‍රියාත්මක කිරීමේ සැලැස්මක් සමඟ එන අතර, එය භාවිතා කරන්නේ කුමන වගු සහ දර්ශකද යන්න ඇතුළුව එය ප්‍රශස්ත ක්‍රමයකි.
    • ඔබේ විමසුම තුළ ඔබේ විචල්‍යයන් වටා තනි උපුටා දැක්වීම් ('') භාවිතා කරන්න.
  • විචල්යයේ ඔබ අපේක්ෂා කරන දේ අඩංගු දැයි පරීක්ෂා කරන්න:

    • ඔබ පූර්ණ සංඛ්‍යාවක් අපේක්ෂා කරන්නේ නම්, භාවිතා කරන්න:
      ctype_digit - සංඛ්‍යාත්මක අක්‍ෂර (ය) සඳහා පරීක්ෂා කරන්න; 
      $ අගය = (int) $ අගය;
      $ value = intval ($ value);
      $ var = filter_var ('0755', FILTER_VALIDATE_INT, $ විකල්ප);
    • නූල් භාවිතය සඳහා:
      is_string () - විචල්‍යයක වර්ගය නූල් දැයි සොයා ගන්න

      පෙරහන් ශ්‍රිතය භාවිතා කරන්න filter_var () - නිශ්චිත පෙරණයක් සමඟ විචල්‍යයක් පෙරහන් කරයි:
      $ email = filter_var ($ විද්‍යුත් තැපෑල, FILTER_SANITIZE_EMAIL); 
      $ newstr = filter_var ($ str, FILTER_SANITIZE_STRING);
      වඩා පෙර නිර්වචනය කළ පෙරහන්
    • filter_input () - නිශ්චිත බාහිර විචල්‍යයක් නමින් ලබාගෙන එය පෙරහන් කරයි:
      $ search_html = filter_input (INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);
    • preg_match () - නිත්‍ය ප්‍රකාශන ගැලපීමක් සිදු කරන්න;
    • ඔබේම වලංගු කිරීමේ කාර්යය ලියන්න.

11

ඔබ මෙහි විස්තර කරන්නේ වෙනම කරුණු දෙකකි:

  1. පරිශීලක ආදාන දත්ත සනීපාරක්ෂාව / පෙරීම.
  2. ප්‍රතිදානය මග හැරීම.

1) පරිශීලක ආදානය සෑම විටම නරක යැයි උපකල්පනය කළ යුතුය.

සූදානම් කළ ප්‍රකාශ භාවිතා කිරීම, හෝ / සහ mysql_real_escape_string සමඟ පෙරීම අනිවාර්යයෙන්ම අත්‍යවශ්‍ය වේ. PHP හි පෙරහන්_ ආදාන ද ඇති අතර එය ආරම්භ කිරීමට හොඳ ස්ථානයකි.

2) මෙය විශාල මාතෘකාවක් වන අතර එය දත්ත ප්‍රතිදානයේ සන්දර්භය මත රඳා පවතී. HTML සඳහා htmlpurifier වැනි විසඳුම් තිබේ. රීතියක් ලෙස, ඔබ ප්‍රතිදානය කරන ඕනෑම දෙයකින් සැමවිටම ගැලවී යන්න.

මෙම කාරණා දෙකම තනි පෝස්ට් එකකට යාමට නොහැකි තරම් විශාල ය, නමුත් වඩාත් විස්තරාත්මකව පළ කරන පෝස්ට් ගොඩක් තිබේ:

ක්‍රම PHP ප්‍රතිදානය

ආරක්ෂිත PHP ප්‍රතිදානය


9

ඔබ PostgreSQL භාවිතා කරන්නේ නම්, PHP වෙතින් ආදානය pg_escape_string () සමඟ ගැලවිය හැකිය.

 $username = pg_escape_string($_POST['username']);

ප්‍රලේඛනයෙන් ( http://php.net/manual/es/function.pg-escape-string.php ):

pg_escape_string () දත්ත සමුදාය විමසීම සඳහා නූලකින් ගැලවී යයි. එය උපුටා දැක්වීම් නොමැතිව PostgreSQL ආකෘතියෙන් ගැලවී ගිය නූලක් ලබා දෙයි.


1
pg_escape_literal () යනු PostgreSQL සඳහා භාවිතා කිරීම සඳහා නිර්දේශිත කාර්යයකි.
ගුප්ත ツ

8

අවධානය යොමු කළ යුතු බහුවිධ කාරණා ඇති බැවින්, කැචල් ශ්‍රිතයක් නොමැත.

  1. SQL එන්නත් කිරීම - අද, සාමාන්‍යයෙන්, සෑම PHP ව්‍යාපෘතියක්ම PHP දත්ත වස්තු (PDO) හරහා සකස් කළ ප්‍රකාශයන් හොඳම භාවිතයක් ලෙස භාවිතා කළ යුතු අතර, අයථා උපුටා දැක්වීමකින් දෝෂයක් වළක්වා ගැනීම මෙන්ම එන්නත් කිරීමට එරෙහිව සම්පූර්ණ අංග විසඳුමක් ද ලබා ගත යුතුය. එය ඔබගේ දත්ත ගබඩාවට ප්‍රවේශ වීමට වඩාත්ම නම්‍යශීලී සහ ආරක්ෂිත ක්‍රමයයි.

    පරීක්ෂා කරන්න (එකම නිසි) PDO නිබන්ධනය ඔබ PDO පිළිබඳව දැන ගැනීමට අවශ්ය දෙයක්ම සඳහා. (මෙම විෂය පිළිබඳ මෙම විශිෂ්ට සම්පත සඳහා ඉහළ SO දායකයා වන @YourCommonSense වෙත අවංක ස්තූතිය.)

  2. XSS - යන මාර්ගයේ දත්ත සනීපාරක්ෂාව කරන්න ...

    • HTML Purifier දිගු කාලයක් තිස්සේ පවතින අතර එය තවමත් ක්‍රියාකාරීව යාවත්කාලීන වේ. අනිෂ්ට ආදානය සනීපාරක්ෂාව සඳහා ඔබට එය භාවිතා කළ හැකි අතර, ත්‍යාගශීලී සහ වින්‍යාසගත කළ හැකි ටැග් ලැයිස්තුවක් ලබා දේ. බොහෝ WYSIWYG සංස්කාරකවරුන් සමඟ විශිෂ්ට ලෙස ක්‍රියා කරයි, නමුත් සමහර භාවිත අවස්ථා සඳහා එය බර විය හැකිය.

    • වෙනත් අවස්ථා වලදී, අපට HTML / Javascript කිසිසේත් පිළිගැනීමට අවශ්‍ය නැති විට, මෙම සරල ශ්‍රිතය ප්‍රයෝජනවත් බව මට පෙනී ගියේය (සහ XSS ට එරෙහිව බහුවිධ විගණන සමත් වී ඇත):

      /* Prevent XSS input */ function sanitizeXSS () { $_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING); $_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING); $_REQUEST = (array)$_POST + (array)$_GET + (array)$_REQUEST; }

  3. එක්ස්එස්එස් - පිටතට යන විට දත්ත සනීපාරක්ෂාව කරන්න ... ඔබේ දත්ත ගබඩාවට එය එක් කිරීමට පෙර දත්ත නිසි ලෙස සනීපාරක්ෂාව කර ඇති බවට ඔබ සහතික නොවන්නේ නම්, එය ඔබේ පරිශීලකයාට පෙන්වීමට පෙර එය සනීපාරක්ෂාව කළ යුතුය, අපට මෙම ප්‍රයෝජනවත් PHP කාර්යයන් උත්තේජනය කළ හැකිය:

    • ඔබ ඇමතූ විට echoහෝ printපරිශීලක විසින් සපයන ලද අගයන් ප්‍රදර්ශනය කරන htmlspecialcharsවිට, දත්ත නිසි ලෙස සනීපාරක්ෂාව කර HTML ප්‍රදර්ශනය කිරීමට ඉඩ නොදී භාවිතා කරන්න.
    • json_encode PHP සිට ජාවාස්ක්‍රිප්ට් දක්වා පරිශීලක සපයන අගයන් සැපයීමට ආරක්ෂිත ක්‍රමයකි
  4. ඔබ බාහිර ෂෙල් විධාන භාවිතා කරන්නේ exec()හෝ system()ක්‍රියා backtickකරන්නේද , නැතහොත් ක්‍රියාකරුටද? එසේ නම්, SQL ඉන්ජෙක්ෂන් සහ එක්ස්එස්එස් වලට අමතරව, ඔබේ සේවාදායකයේ අනිෂ්ට විධාන ක්‍රියාත්මක කරන පරිශීලකයින්ට ආමන්ත්‍රණය කිරීමට අමතර සැලකිල්ලක් තිබිය හැකිය . ඔබ escapeshellcmdසම්පූර්ණ විධානයෙන් escapeshellargගැලවීමට හෝ තනි තර්ක වලින් ගැලවීමට කැමති නම් ඔබ භාවිතා කළ යුතුය .


ඒ වෙනුවට mb_encode_numericentity භාවිතා කළ හැකිද? එය සෑම දෙයක්ම සංකේතවත් කරන බැවින්?
drtechno

rdrtechno - # 3 XSSmb_encode_numericentityhtmlspecialchars
webaholik

5

ආදානය සනීපාරක්ෂාව සහ දත්ත වලින් ගැලවීම පිළිබඳ වැරදි මඟහරවා ගැනීමට පහසුම ක්‍රමය වන්නේ සිම්ෆනි , නෙට් වැනි PHP රාමුව භාවිතා කිරීමයි. වැනි හෝ එම රාමුවේ කොටසක් (සැකිලි එන්ජිම, දත්ත සමුදා ස්ථරය, ORM) භාවිතා කිරීමයි.

Twig වැනි එන්ජිම සැකසීම හෝ Latte පෙරනිමියෙන් ප්‍රතිදානය ගැලවී ඇත - සන්දර්භය අනුව ඔබේ ප්‍රතිදානයෙන් නිසි ලෙස ගැලවී ඇත්නම් (අතින් HTML හෝ ජාවාස්ක්‍රිප්ට් කොටස).

රාමුව ස්වයංක්‍රීයව ආදානය සනීපාරක්ෂාව වන අතර ඔබ $ _POST, G _GET හෝ S _SESSION විචල්‍යයන් කෙලින්ම භාවිතා නොකළ යුතුය, නමුත් රවුටින්, සැසි හැසිරවීම වැනි යාන්ත්‍රණයන් හරහා.

දත්ත සමුදා (ආකෘති) ස්තරය සඳහා ඩොක්ට්‍රින් වැනි ORM රාමු හෝ නෙට් දත්ත සමුදාය වැනි PDO වටා එතීම.

ඔබට ඒ ගැන වැඩි විස්තර මෙතැනින් කියවිය හැකිය - මෘදුකාංග රාමුවක් යනු කුමක්ද?


3

ප්‍රතිදාන ගැලවී යාමේ මාතෘකාව මත එය එක් කිරීමට අවශ්‍ය නම්, ඔබ ඔබේ HTML ප්‍රතිදානය සෑදීම සඳහා php DOMDocument භාවිතා කරන්නේ නම් එය ස්වයංක්‍රීයව නිවැරදි සන්දර්භය තුළ ගැලවී යනු ඇත. ගුණාංගයක් (අගය = "") සහ <span> හි අභ්‍යන්තර පෙළ සමාන නොවේ. XSS වලින් ආරක්ෂා වීමට මෙය කියවන්න: OWASP XSS වැළැක්වීමේ වංචා පත්‍රිකාව


2

ඔබ කිසි විටෙකත් ආදානය සනීපාරක්ෂාව නොකරයි.

ඔබ සැමවිටම ප්‍රතිදානය සනීපාරක්ෂාව කරයි.

SQL ප්‍රකාශයකට ඇතුළත් කිරීම සඳහා ඔබ දත්ත වලට අදාළ වන පරිවර්තනයන් HTML ඇතුළත් කිරීම සඳහා ඔබ අයදුම් කරන ඒවාට වඩා සම්පූර්ණයෙන්ම වෙනස් ය. ඔබ ජාවාස්ක්‍රිප්ට් ඇතුළත් කිරීම සඳහා අයදුම් කරන ඒවාට වඩා සම්පූර්ණයෙන්ම වෙනස් ය. CSS වලට ඇතුළත් කිරීම සඳහා ඔබ අයදුම් කරන ඒවාට වඩා සම්පූර්ණයෙන්ම වෙනස් වේ ඊමේල් එකකට ඇතුළත් කිරීමට ඔබ අයදුම් කරන ඒවාට වඩා සම්පූර්ණයෙන්ම වෙනස් වේ ....

සෑම ආකාරයකින්ම ආදානය වලංගු කරන්න - වැඩිදුර සැකසීම සඳහා ඔබ එය පිළිගත යුතුද යන්න තීරණය කරන්න හෝ එය පිළිගත නොහැකි බව පරිශීලකයාට කියන්න. නමුත් PHP ඉඩමෙන් ඉවත්ව යන තෙක් දත්ත නිරූපණය කිරීම සඳහා කිසිදු වෙනසක් නොකරන්න.

බොහෝ කලකට පෙර යමෙකු දත්ත වලින් ගැලවීම සඳහා සියලු යාන්ත්‍රණයන්ට ගැලපෙන පරිදි එක් ප්‍රමාණයක් නිර්මාණය කිරීමට උත්සාහ කළ අතර අපි අවසන් වූයේ “ මැජික්_කෝට්ස් ” වලින් වන අතර එමඟින් සියලු නිමැවුම් ඉලක්ක සඳහා දත්ත නිසි ලෙස ගැලවී නොගිය අතර විවිධ ස්ථාපනයන්හි ප්‍රති code ලයක් ලෙස විවිධ කේත ක්‍රියා කිරීමට අවශ්‍ය විය.


එහි ඇති එක් ගැටළුවක් නම්, එය සැමවිටම දත්ත සමුදා ප්‍රහාරයක් නොවන අතර සියලු පරිශීලක ආදානය පද්ධතියෙන් ආරක්ෂා කළ යුතුය. එක් භාෂා වර්ගයක් පමණක් නොවේ. එබැවින් ඔබේ වෙබ් අඩවි වල, ඔබ ඔබේ $ _POST දත්ත ගණනය කරන විට, බන්ධන භාවිතා කිරීමෙන් පවා, එය ෂෙල් හෝ වෙනත් php කේතයක් ක්‍රියාත්මක කිරීමට ප්‍රමාණවත් ලෙස ගැලවී යා හැකිය.
drtechno

"එය සැමවිටම දත්ත සමුදා ප්‍රහාරයක් නොවේ": "SQL ප්‍රකාශයකට ඇතුළත් කිරීම සඳහා දත්ත සුරක්‍ෂිත කිරීම සඳහා ඔබ යොදන පරිවර්තනයන් ඒවාට වඩා සම්පූර්ණයෙන්ම වෙනස් වේ ...."
සමමුහුර්ත

"සියලුම පරිශීලක ආදානය පද්ධතියෙන් ආරක්ෂා කළ යුතුය": කිසිදු පද්ධතියක් පරිශීලක ආදානයෙන් ආරක්ෂා නොකළ යුතුය.
symcbean

හොඳයි, මට වචන ඉවරයි, නමුත් ඔව් ආදානය පද්ධති ක්‍රියාකාරිත්වයට වලක්වා ගත යුතුයි. මෙය පැහැදිලි කිරීමට ...
drtechno

ආදානය සහ ප්‍රතිදානය යන දෙකම සනීපාරක්ෂක කළ යුතුය.
ටජ්නි

0

පෙරහන් දිගුව ( howto-link , manual ) ඇත, එය සියලු GPC විචල්‍යයන් සමඟ හොඳින් ක්‍රියා කරයි. එය මැජික්-කරන්න-කළ යුතු දෙයක් නොවේ, ඔබට තවමත් එය භාවිතා කිරීමට සිදුවනු ඇත.


-1

පරිශීලක දත්ත කිසි විටෙකත් විශ්වාස නොකරන්න.

function clean_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}

මෙම trim()උත්සවය, පලවා හරින whitespace හා වැලක් දෙපැත්තෙන්ම වෙනත් පූර්ව නිශ්චිත අක්ෂර.

මෙම stripslashes()කාර්යය backslashes ඉවත්

මෙම htmlspecialchars()කාර්යය HTML ආයතන සඳහා සමහර පූර්ව නිශ්චිත චරිත බවට පරිවර්තනය කරයි.

පූර්ව නිශ්චිත අක්‍ෂර:

& (ampersand) becomes &amp;
" (double quote) becomes &quot;
' (single quote) becomes &#039;
< (less than) becomes &lt;
> (greater than) becomes &gt;

1
මෙය ආරක්ෂා කරන්නේ කුමක් ද? මෙය XSS සඳහාද? එසේ නම් එය හඳුන්වන්නේ clean_inputඇයි? කප්පාදු ඉවත් කිරීමට ඔබට අවශ්‍ය ඇයි?
ධර්මන්

6
අවවාදයයි: මෙය පරිශීලක දත්ත සුරක්‍ෂිත නොකරයි. මෙම ක්‍රියාව කිසිම දෙයකින් ආරක්ෂා නොවී ඔබේ දත්ත අනවශ්‍ය ලෙස හානි කරයි. එය භාවිතා නොකරන්න!
ධර්මන්

ඔබේ ප්‍රකාශය අසත්‍යයකි.
එරික් තියාර්ට්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.