CodeIgniter 2.0.2 – problem ze strip_image_tags

Przygotowując się do napisania większego artykułu na temat walidacji i filtrowania danych we frameworku CI natrafiłem na błąd przy filtrowaniu danych  za pomocą funkcji strip_image_tags. W tym artykule pokażę jak to obejść.

Według dokumentacji CodeIgniter funkcja strip_image_tags usuwa z wprowadzonego tekstu tagi IMG zachowując czysty URL. Dla wyjaśnienia – funkcja usuwa tag IMG zachowując wartość atrybutu SRC. Przykładowo jeśli w pole wpiszemy tekst: <img src=”test.jpg” width=”100″ height=”100″ /> i zastosujemy filtrowanie za pomocą strip_image_tags z tekstu zostanie jedynie fragment: test.jpg.

Niestety użycie filtrowania za pomocą strip_image_tags bez zmiany kodu frameworka skutkuje wystąpieniem błędu: Fatal error: Call to undefined method CI_Input::strip_image_tags() in /var/www/walidacja_ci/system/libraries/Form_validation.php on line 1325. Co jest przyczyna tego błędu ? Metoda strip_image_tags z klasy Form_validation wygląda następująco:

function strip_image_tags($str)
{
	return $this->CI->input->strip_image_tags($str);
}

Zatem jak widać próbuje wywołać metodę strip_image_tags z klasy CI_Input. Problem w tym, że w klasie tej nie znajdziemy metody strip_image_tags. Co nam zatem pozostaje ? Okazuje się, że funkcja strip_image_tags znajduje się w helperze Security. Kod wygląda następująco:

if ( ! function_exists('strip_image_tags'))
{
	function strip_image_tags($str)
	{
		$str = preg_replace("##", "\\1", $str);
		$str = preg_replace("##", "\\1", $str);
 
		return $str;
	}
}

Mamy teraz dwie możliwości użycia filtrowania przy użyciu strip_image_tags:

  1. Modyfikacja kodu frameworka – oczywiście nie jest to najlepsze rozwiązanie, gdyż przy każdej aktualizacji zmianę będzie musieli wprowadzać ponownie. Niemniej jednak jest to jedyny sposób aby filtrowanie przy użyciu strip_image_tags było zgodne z dokumentacją frameworka
  2. Użycie funkcji  strip_image_tags w kontrolerze

Jeśli chcemy użyć pierwszego sposobu musimy dopisać kod funkcji strip_image_tags do klasy CI_Input. Klasa ta znajduje się w pliku system/core/Input.php. Dopisujemy na końcu tego pliku, przed ostatnim komentarzem kod:

function strip_image_tags($str)
{
	$str = preg_replace("#<img\s+.*?src\s*=\s*[\"'](.+?)[\"'].*?\>#", "\\1", $str);
	$str = preg_replace("#<img\s+.*?src\s*=\s*(.+?).*?\>#", "\\1", $str);
 
	return $str;
}

 
Jeśli nie chcemy modyfikować oryginalnego kodu CI musimy nieco zmienić sposób filtrowania. Po pierwsze musimy dołączyć helper Security.
Przykład jak to zrobić:

$this->load->helper(array('form','security'));

Jak widać dopisujemy do tablicy ładowanych helperów security.
Po drugi należy usunąć strip_image_tags we wszystkich wywołaniach metody set_rules. Następnie przed operacjami na pobranych z formularza danych musimy użyć funkcji strip_image_tags w następujący sposób:

$value = $this->input->post('field');
$value = strip_image_tags($value);

Na koniec zaprezentuję postać metody kontrolera wykorzystującej filtrowanie przy użyciu strip_image_tags przed zmianami i po zmianach, wynikających z użycia drugiej metody.

Kod przed zmianami:

function add()
{
        $this->load->helper(array('form'));
        $this->load->library(array('form_validation'));
 
        $this->form_validation->set_rules('field', 'Field', 'required|strip_image_tags');
 
        if ($this->form_validation->run() == FALSE)
        {            
            $this->load->view('test/add');            
        }
        else
        {
            $value = $this->input->post('field');            
            echo $value;
        }
}

Kod po zmianach:

function add()
{
        $this->load->helper(array('form','security'));
        $this->load->library(array('form_validation'));
 
        $this->form_validation->set_rules('field', 'Field', 'required');
 
        if ($this->form_validation->run() == FALSE)
        {            
            $this->load->view('test/add');            
        }
        else
        {
            $value = $this->input->post('field');
            $value = strip_image_tags($value);
            echo $value;
        }
}
Ten wpis został opublikowany w kategorii PHP, Programowanie i oznaczony tagami , . Dodaj zakładkę do bezpośredniego odnośnika.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *