CI 묻고 답하기

제목 form 헬퍼 이용시 협업관계가 궁금합니다.
글쓴이 제키 작성시각 2013/08/22 16:24:32
댓글 : 13 추천 : 0 스크랩 : 0 조회수 : 13625   RSS


csrf 공격에 대비하기 위해서 config에서 $config['csrf_protection'] = TRUE; 로 설정해놨는데요.

입력 폼을 만들기 위해 아래와 같이 작성했습니다.


 

<?php
$this->load->helper('form');
$attributes = array('class' => 'writeForm', 'id' => 'writeForm');
echo form_open('/update', $attributes);

$data = array(
 'subject' => array(
     'name' => 'subject',
     'id' => 'subject',
 ),
 'content' => array(
     'name' => 'content',
     'id' => 'content',
     'style' => 'width:600px;height:300px;',
 )
);
?>

<div>
   제목
   <?php echo form_input($data['subject'])?>
</div>
<div>
   내용
   <?php echo form_textarea($data['content'])?>
</div>
<div>
   <?php echo form_submit('submit', '저장')?>
</div>




토큰을 이용해 post 하게되어 보안상으로 든든(?) 하더군요.

그런데 문제는 폼 페이지에 php가 들어가다보니 디자이너가 어려워한다는 겁니다.
array만 알려주고 몇번하다보면 익숙해질 것 같긴하지만 복잡한 폼이면 디자이너 또는 코더가 <input>으로 코딩한 후 개발자가 일일이 다시 바꿔줘야하는 번거로움이 생길 듯 합니다.
 
개인적으로는 보안적인 측면에 때문에 교육을 통해 위 코드처럼 사용하는게 맞다고 생각하는데,
현실적인 실무에서 여러분들은 어떻게 처리하시는지 궁금합니다.

 다음글 다른나라 언어 DB에 인서트시 유니코드로 나오는 현상 (11)
 이전글 $.post 한글 공백되는 문제 (11)

댓글

변종원(웅파) / 2013/08/22 17:16:11 / 추천 0
텍스트 에디터로 코딩을 하는가보네요. ^^;;

드림위버나 여타 툴로 위 소스를 보게되면 디자인 요소는 해치지 않고 표현이 됩니다.
그런 목적으로 html 태그안에 <?php echo $변수?> 형태로 삽입을 하는 것이구요.

저 자체만으로도 아주 기본적인 템플릿입니다. 

협업을 위한 템플릿 개념을 거부(?)하는 디자이너, 코더라면 재고해봐야 하지 않을까요?
디자이너가 디자인만 해야지 코딩은 무슨.. 이라고 하면 할 말이 없죠. 
협조 하지 않는데 협업을 어떻게 할지... 답은 이미 나와있습니다.
한대승(불의회상) / 2013/08/22 17:33:21 / 추천 0
1장짜리 요약 가이드를 만들어 함께 이야기 합니다.
템플릿이 생소하여 디자이너분들이 어려워 하거든요. ^^
한대승(불의회상) / 2013/08/22 17:40:59 / 추천 0
올려주신 소스코드는 디자이너들이 보기에 난해한 부분들이 많아 보입니다.
복잡하다 싶은 부분은 컨트롤러에서 처리 하시고 뷰에서는 최대한 간단하게 작성하는게 좋을것 같습니다.

* Controler 부분
 
<?php
class Test extend CI_Controller {

  function __construct()
  {
    parent::__construct();
    $this->load->helper('form');
  }

  function index()
  {
    $data = array(
      'attributes' => array('class' => 'writeForm', 'id' => 'writeForm'),
      'data' => array(
 'subject' => array(
     'name' => 'subject',
     'id' => 'subject',
 ),
 'content' => array(
     'name' => 'content',
     'id' => 'content',
     'style' => 'width:600px;height:300px;',
    ));

    $this->load->view('test', $data);
  }
}
* 뷰
<?php echo form_open('/update', $attributes);?>
<div>
   제목 <?php echo form_input($data['subject'])?>
</div>
<div>
   내용 <?php echo form_textarea($data['content'])?>
</div>
<div>
   <?php echo form_submit('submit', '저장')?>
</div>
</form>

oursong / 2013/08/22 18:00:24 / 추천 0
class나 id만 값만 상호간 주고 받으면 어떨까요? ㅎㅎㅎ
HTML로 출력된 페이지를 .html페이지로 하나 저장해서 보내주거나.
css나 자바만 만지면 될 것 같은데요.

참고로 저 코드에서 배열로 잡힌 data는 
$data = array(
 'subject' => array(
     'name' => 'subject',
     'id' => 'subject',
     'class' => 'test'
 ),
 'content' => array(
     'name' => 'content',
     'id' => 'content',
     'style' => 'width:600px;height:300px;',
     'class' => 'testx'
 )
);
로도 작동합니다.
요즘 브라우저들 기능도 많던데 쩝.
들국화 / 2013/08/22 18:16:10 / 추천 0
개인적으로 form 헬퍼를 안쓰는데요.
새로 익히려니 힘든것도 있고 해서 AR도 안쓰고요.
뷰가 좀더 의존적으로 되는거 같네요...
뷰는 데이타 뿌리고 입력 받는기능에 충실하는게 좋을듯 합니다.
제키 / 2013/08/22 18:27:33 / 추천 0
저만 너무 똥고집 부리는건 아닌가해서 다른 분들은 어떻게 하시는지 여쭤봤습니다.
모든 분들 좋은 의견 감사합니다.
역시나 익숙해 질때까지 교육을 하고, 거부하면 '너 나가!' 로 결론 졌습니다. ^^
risa / 2013/08/23 09:54:07 / 추천 0
저도 한대승님 의견에 동의 합니다.

폼헬퍼가 눈에 안들어오는 느낌이 없지 않아 있습니다.

가독성 측면에서는 복잡해 질수록 폼헬퍼가 더 간단 하지만

오히려 즉흥이며 간단하고 단일적인 폼은 하드 HTML이 더 가독성이 좋다고 생각 합니다.


더불어 단순히 뭐가 더 좋다는것보다

웅파님 의견처럼 한쪽이 일방적으로 '난 몰라요~' 하면 이미 협업이 아니죠.

난 일 다했으니 나머지는 너가 다 알아서 하든가.

하고 다른게 뭐인가요?

들국화 / 2013/08/23 10:05:22 / 추천 0
논란일 많은 부분이지만 php는 Server Side Language 입니다.

그렇타면 누가 작업해야 하는지 좀더 분명해 지는게 아닐까 합니다.

뭐 프론트단에서 잘 해 주면은 아주 좋치요. 하지만 강요하기는 힘들어 보이네요.

위에도 적었지만 한대승님 과 비슷하게 저는 프론트와 백엔드가 연관성을 줄이고 자유롭게 하는게 좋치 않을까 하는 생각입니다.

그게 MVC 취지에도 맞지 않을까 생각 합니다.
들국화 / 2013/08/23 11:31:16 / 추천 0
그런데 잘 몰라서 그러는데요. form헬퍼가 보안에 도움이 되나요?
한대승(불의회상) / 2013/08/23 11:37:20 / 추천 0
들국화// 보안쪽은 잘 모르겠지만...
url헬퍼 form헬퍼 를 사용하게 되면 배포용 에플리케이션 작성에 도움이 됩니다.

변종원(웅파) / 2013/08/23 11:50:13 / 추천 0
들국화/ csrf 방지를 위해 config.php에서 설정을 했을 경우
폼헬퍼를 사용해야 제대로 구현이 됩니다. (매뉴얼 참고)

폼헬퍼가 보안에 도움이 되는게 아니라 csrf설정을 했을 경우 폼헬퍼를 사용해서 
폼오픈을 해줘야 하는겁니다. ^^
들국화 / 2013/08/23 12:05:16 / 추천 0
웅파// 오~ 그런게 있었네요.

 private function _csrf_set_hash()
 {
  if ($this->csrf_hash == '')
  {
   // If the cookie exists we will use it's value.  We don't necessarily want to regenerate it with
   // each page load since a page could contain embedded sub-pages causing this feature to fail
   if (isset($_COOKIE[$this->csrf_cookie_name]) AND $_COOKIE[$this->csrf_cookie_name] != '')
   {
    $this->csrf_hash = $_COOKIE[$this->csrf_cookie_name];
   }
   else
   {
    $this->csrf_hash = md5(uniqid(rand(), TRUE));
   }
  }

  return $this->csrf_hash;
 }
대충 찾아보니 랜덤 해시값을 쿠키로 구워서 사용 하는거 같네요. 역시.. ㅋㅋㅋ


맥스 / 2013/08/23 12:52:32 / 추천 0
 디자이너가 잘 모른다면
 form_open  만 쓰셔도  csrf 는 작동하니 사용하시고
나머지는 디자이너에게 맞기시는게 서로 윈윈하는 게 아닐까 합니다.
다 프로그램에서 하려고 하면 힘들어요 ㅜㅜ