أفضل طريقة لتطهير / تصفية التعليقات من المستخدمين؟

StackOverflow https://stackoverflow.com/questions/1446431

  •  22-07-2019
  •  | 
  •  

سؤال

أنا أستخدم هذه العملية حاليًا لتعقيم/تصفية التعليقات التي أدخلها المستخدمون ->
هذا يستخدم لتقطيع الجروح...و

 if (get_magic_quotes_gpc()) {
        function stripslashes_deep($value)
        {
            $value = is_array($value) ?
                        array_map('stripslashes_deep', $value) :
                        stripslashes($value);

            return $value;
        }

        $_POST = array_map('stripslashes_deep', $_POST);
        $_GET = array_map('stripslashes_deep', $_GET);
        $_COOKIE = array_map('stripslashes_deep', $_COOKIE);
        $_REQUEST = array_map('stripslashes_deep', $_REQUEST);
    }

ثم يمر التعليق عبر هذه الوظيفة لتطهير البيانات ...

   function my_strip_tags($str) {
                $strs=explode('<',$str);
                $res=$strs[0];
                for($i=1;$i<count($strs);$i++)
                {
                    if(!strpos($strs[$i],'>'))
                        $res = $res.'&lt;'.$strs[$i];
                    else
                        $res = $res.'<'.$strs[$i];
                }
             return strip_tags($res);   
    }

بعد ذلك ينتقل مباشرة إلى قاعدة البيانات باستخدام البيان المعد.

function add_comment($comment,$type,$update_id,$user_id){
            $query="INSERT INTO comment_updates (updateid,userid,comment) VALUES(?,?,?)";
                if($stmt=$this->conn->prepare($query)) {
                $stmt->bind_param('sss',$update_id,$user_id,$comment);
                $stmt->execute();
                    if($this->conn->affected_rows==1){
                    $stmt->close();
                    return true;
                    }
            }
        }

أردت فقط معرفة ما إذا كان هذا آمنًا بدرجة كافية أو ما إذا كانت هناك بدائل أخرى أفضل... شكرًا

هل كانت مفيدة؟

المحلول

لا تكتب بنفسك المطهر HTML. سوف تقوم بإنشاء الثقوب XSS.

إذا كنت أريد أن أكتب بنفسك، على الأقل تشغيل smoketests XSS ha.ckers.org ضدها

وبين تلك الاختبارات، و htmlpurifier المقارنة بين المرشحات ، يجب أن تكون قادرة على الحصول على فكرة جيدة عن كيف معقدة أتش تي أم أل الإبراء هو - وماذا يجب أن تترك للالايجابيات

نصائح أخرى

أهم شيء عند التفكير في تخزين البيانات في قاعدة البيانات هو الهروب منها؛استخدام mysql_real_escape_string, ، أو mysqli_real_escape_string, ، أو PDO::quote, ، اعتمادًا على قاعدة البيانات التي تستخدمها (أو وظائف أخرى لـ oracle/pg/...)

الحل الآخر هو استخدام البيانات المعدة (انظر mysqli::prepare و/أو PDO::prepare -- تلك غير مدعومة من قبل القديم mysql_* التمديد)، والذي سيتعامل مع الهروب من البيانات في مكانك؛-)


عند التفكير في مخرجات HTML، لديك حلان:

  • اقبل HTML واستخدم بعض المكتبات مثل HTMLPurifier لتصفيته/تنظيفه؛سيسمح لك بتحديد العلامات والسمات المسموح بها بالضبط، وسيمنحك HTML نظيفًا وصالحًا كمخرجات.
  • حاول إزالة HTML، كما تفعل - لا تعمل دائمًا بشكل جيد (ماذا لو نسيت بعض الحالات الخاصة؟)
  • الهروب من HTML، مع htmlentities أو htmlspecialchars :لا يبدو بالضرورة جميلًا، لكن الإخراج سيبدو مثل مدخلات المستخدم.

سأختار الحل الأول أو الأخير؛يبدو أن شعورك أكثر "خطورة" -- ولكن هذا مجرد شعور ^^ (الفكرة العامة هي "لا تعيد اختراع العجلة")

ونقلت السحر إدارتكم على ما يرام، ولكن إذا قمت بإنشاء الحصول على المعلمات مع اقتباسات تحتاج إلى stripslashes المفاتيح أيضا. :)

وأما بالنسبة للعلامات الشريط، كنت أفضل حالا مع مكتبة تصفية HTML الحقيقية. هناك الكثير من التحولات والانعطافات المشاركة مع أتش تي أم أل انك لا ينبغي الوثوق بأي شيء جعل لكم فقط مرة واحدة ونسيان. الناس يقضون وقتا جعل تلك المرشحات HTML وذلك باستخدام عملهم لصالحك.

وأما "مباشرة الى DB"، وأيضا في معايير ملزمة، بالتأكيد، هذا أمر عظيم. يمكنك وضع بأمان أي شيء في معلمة المربوطة. في سلسلة مع الاقتباس، وآمل أن يتم الهروب من النتيجة.

والهروب كافة الأحرف عندما بوتنج في قاعدة البيانات. عند استرجاع وعرض للتأكد من الهروب أتش تي أم أل صيغة مثل <sometag> لذلك يعرض بدلا من معاملتهم كما التعليمات البرمجية.

وPHP ومعروفة ولكنها قوية بنيت في وظائف الصرف الصحي. أود أن أوصي باستخدام لهم:

الإدخال تصفية في PHP

filter_input و <لأ href = "HTTP: //us3.php.net/manual/en/function.filter-var.php "يختلط =" نوفولو noreferrer "> filter_var

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top