۵ Mehrzad Tajkarimi
xss_clean
امیر صالحی حل شده توسط امیر صالحی

سلام خسته نباشید 
من دارم از طریق post به صورت آرایه مقادری ارسال میکنم ولی الان این تابع داره جلوم رو میگیره
چطور این مشکل حل میشه؟

Fatal error: Uncaught TypeError: htmlspecialchars(): Argument #1 ($string) must be of type string, array given

<div class="col">
     <label>محصول انتخابی</label>
     <select name="discount-product[]" id="discount_product" class="form-control select2 select2-hidden-accessible" style="width: 100%;text-align: right" multiple>
          <?php foreach ($products as $value) : ?>
            <option><?= $value['title'] ?></option>
          <?php endforeach; ?>
      </select>
 </div>

همه حای برنامه داره قیلتر انجام میشه

namespace App\Core\Middleware;
use App\Core\Middleware\Contract\MiddlewareInterface;
class GlobalMiddleware implements MiddlewareInterface
{
    public function handle()
    {
        $this->sanitizeGetParams();
    }
    private function sanitizeGetParams()
    {
        foreach ($_REQUEST as $key => $value) {
            $_REQUEST[$key] = xss_clean($value);
        }
    }
}

 

درود

/* prevent XSS. */
$_GET   = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING);
$_POST  = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

میتونید برای value که داخل حلقه وجود داره یه شرط بزارید اگه آرایه بود و به صورت post یا Get اومده بود این توابع استفاده کنید

 

امیر صالحی ۱۱ مرداد ۱۴۰۰، ۱۴:۵۲

  ! متوجه نشدم

Mehrzad Tajkarimi ۱۹ مرداد ۱۴۰۰، ۰۵:۰۹

لطفا محتوای داخل متد xss_clean رو قرار بدید تا نمونه کد رو براتون بزارم

امیر صالحی ۲۳ مرداد ۱۴۰۰، ۱۷:۱۱

سلام

داخل متن سوالی که پرسیدم هست

Mehrzad Tajkarimi ۲۳ مرداد ۱۴۰۰، ۱۷:۲۸

این مقدار value که شما دارید پاس میدید اینجا:

 foreach ($_REQUEST as $key => $value) {
            $_REQUEST[$key] = xss_clean($value);
        }

به شکل آرایه هستش و باید چک کنید ببینید آرایه هتسش یا ن اگه بود یه حلقه دیگه روش بزنید:

 

 foreach ($_REQUEST as $key => $value) {
 			if(is_array($value)){
 				foreach($value as $k => $v){
 					$_REQUEST[$k] = xss_clean($v);
 				}
 			}else{
 			  $_REQUEST[$key] = xss_clean($value);
 			}
 }

اگه فکر میکنید متد xss_clean تون سادت میتونید از کد زیر هم استفاده کنید

function xss_clean($data)
{
        // Fix &entity\n;
        $data = str_replace(array('&amp;','&lt;','&gt;'), array('&amp;amp;','&amp;lt;','&amp;gt;'), $data);
        $data = preg_replace('/(&#*\w+)[\x00-\x20]+;/u', '$1;', $data);
        $data = preg_replace('/(&#x*[0-9A-F]+);*/iu', '$1;', $data);
        $data = html_entity_decode($data, ENT_COMPAT, 'UTF-8');
        // Remove any attribute starting with "on" or xmlns
        $data = preg_replace('#(<[^>]+?[\x00-\x20"'])(?:on|xmlns)[^>]*+>#iu', '$1>', $data);
        // Remove javascript: and vbscript: protocols
        $data = preg_replace('#([a-z]*)[\x00-\x20]*=[\x00-\x20]*([`'"]*)[\x00-\x20]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2nojavascript...', $data);
        $data = preg_replace('#([a-z]*)[\x00-\x20]*=(['"]*)[\x00-\x20]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2novbscript...', $data);
        $data = preg_replace('#([a-z]*)[\x00-\x20]*=(['"]*)[\x00-\x20]*-moz-binding[\x00-\x20]*:#u', '$1=$2nomozbinding...', $data);
        // Only works in IE: <span style="width: expression(alert('Ping!'));"></span>
        $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`'"]*.*?expression[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
        $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`'"]*.*?behaviour[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
        $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`'"]*.*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[^>]*+>#iu', '$1>', $data);
        // Remove namespaced elements (we do not need them)
        $data = preg_replace('#</*\w+:\w[^>]*+>#i', '', $data);
        do
        {
                // Remove really unwanted tags
                $old_data = $data;
                $data = preg_replace('#</*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|title|xml)[^>]*+>#i', '', $data);
        }
        while ($old_data !== $data);
        // we are done...
        return $data;
}
بهترین پاسخ
امیر صالحی ۲۴ مرداد ۱۴۰۰، ۰۶:۴۶