2009-11-06 6 views
0

Codeigniter의 입력 라이브러리에있는 html 인코딩에 문제가 있습니다.codeiginiter의 HTML 인코딩

내 프로젝트의 관리자 측에서 뉴스를 편집하는 데 사용되는 양식이 있습니다. 어떤 유효성 검사 오류가 발생하면
편집 페이지가로드 echo form_input('title',($title) ? $title : $this->input->post('title'));

, 내가 뉴스 제목을 복용하고 $ title.After 편집에 할당하고있어가, 다음은 뉴스의 제목의 HTML 코드는 양식이 제목 파일에 게시 된 값과 함께 다시 표시됩니다. 위의 코드는이를 염두에두고 작성되었습니다.

이제 관리자가 제목을 XYZ의 설문 보고서으로 입력하고 제출한다고 가정합니다. 유효성 검사 오류가 다른 필드에 대해 발생하면 그런 다음, 폼이로드 될 때, 제목 필드는 가치 게시

XYZ's survey report

내가 입력 클래스의 생각은, HTML 코드 보여줍니다. 따라서 유효성 검사 오류가 발생하면 내 요구 사항은, 내가

echo form_input('title',($title) ? $title : html_entity_decode($this->input->post('title'),ENT_QUOTES)); 


을 시도 한 form.I에 그것을 표시하기 전에 디코드에게 값을 HTML로해야하고, 그것을 작동합니다. 그러나이 프로젝트는 규모가 크고 양식 필드가 너무 많습니다. 나는 이것이 이것을 성취 할 수있는 유일한 방법이라는 것을 알고 실망 할 것이다.

+0

입 클래스하지 않는 (데이터베이스에 데이터를 삽입 할 때 당신이 그것을 사용하는 경우) 내가 때문에 set_value() 기능의 생각 인코딩 할 때 자동으로 인코딩을 수행하십시오. 방금 해봤 어. $ _POST/$ this-> input-> post()를 어떻게 처리하는지 게시 할 수 있습니까? –

+0

당신은 정확합니다. 나는 또한 그것을 검사했다. Form_validation과 form_helper를 함께 사용할 때 발생합니다. 고마워. 너는 나를 제대로 테스트하게했다. – Sreejith

답변

1

XSS 필터링 표시된 입력 필드 값에 영향을주지 않습니다. 수동으로 입력 요소 만들 수 있습니다

1) :

내가 두 가지 옵션을 참조
<input type="text" name="title" value="<?php echo ($title) ? $title : $this->input->post('title'); ?>" />

2) 당신은 CodeIgniter의 소스 코드를 수정할 수 있습니다 (권장하지 않음 - 나중에 혼란을 만들 가능성이 높습니다 에).

PS : 여기서 form_input 값 (form_helper.php)를 표시 할 때 사용된다 CodeIgniter의 함수이다

하면, 함수가 반드시 htmlspecialchars 다른 기법을 사용시피
function form_prep($str = '') 
{ 
    // if the field name is an array we do this recursively 
    if (is_array($str)) 
    { 
     foreach ($str as $key => $val) 
     { 
      $str[$key] = form_prep($val); 
     } 

     return $str; 
    } 

    if ($str === '') 
    { 
     return ''; 
    } 

    $temp = '__TEMP_AMPERSANDS__'; 

    // Replace entities to temporary markers so that 
    // htmlspecialchars won't mess them up 
    $str = preg_replace("/&#(\d+);/", "$temp\\1;", $str); 
    $str = preg_replace("/&(\w+);/", "$temp\\1;", $str); 

    $str = htmlspecialchars($str); 

    // In case htmlspecialchars misses these. 
    $str = str_replace(array("'", '"'), array("&#39;", "&quot;"), $str); 

    // Decode the temp markers back to entities 
    $str = preg_replace("/$temp(\d+);/","&#\\1;",$str); 
    $str = preg_replace("/$temp(\w+);/","&\\1;",$str); 

    return $str; 
} 

.

UPDATE- 된답니다 exqample :

// config.php: $config['global_xss_filtering'] = FALSE; 
echo form_open("test"); 
echo form_input('title', ($this->input->post('title')) ? $this->input->post('title') : $title); 
echo form_input('title', ($this->input->post('title')) ? $this->input->post('title') : $title, FALSE); 
echo form_input('title', ($_POST['title']) ? $_POST['title'] : $title, FALSE); 
echo "<input type=\"text\" name=\"title\" value=\"" . (($title) ? $title : $this->input->post('title')) . "\" />"; 
echo form_submit("btn", "Submit"); 
echo form_close(); 

// output: 
<form action="/test/" method="post"> 
<input type="text" name="title" value="XYZ&#39;s survey report" /> 
<input type="text" name="title" value="XYZ&#39;s survey report" /> 
<input type="text" name="title" value="XYZ&#39;s survey report" /> 
<input type="text" name="title" value="XYZ's survey report" /> 
<input type="submit" name="btn" value="Submit" /> 
</form> 
+0

감사합니다. Kristoffer. 나는 테스트를 수행하고 많은 것을 발견했다. 1) 입력 클래스는 내가 말한 것처럼 게시 된 값을 변경하지 않는다. XSS 필터링을 활성화 한 경우에도 아무 일도 일어나지 않습니다. 2) 실제로 Form_validation 클래스를 통해 데이터를 전달할 때 발생했습니다. 3) 폼 유효성 검사는 게시 된 데이터를 인코딩하지만 언급 한대로 수동으로 양식 요소를 작성하여 올바른 값을 얻을 수 있습니다. 4) 폼 도우미 함수를 사용하는 경우 양식 유효성 검사 클래스를 통해 게시 된 데이터를 전달한 후 문제가 발생합니다. 감사합니다. – Sreejith

0

전역 적으로 XSS 필터링을 사용하도록 설정하면 입력 클래스가 자동으로 인코딩됩니다. 이 꺼져 있는지 확인 application/config/config.php 파일을 확인하십시오

$config['global_xss_filtering'] = FALSE; 

http://codeigniter.com/user_guide/libraries/input.html