묻고답하기
{htmlspecialchars($oDocument->get('tags'))} 이거 없애도 괜찮을까요
2015.01.22 20:09
지금 만들고자 하는 것은 다음과 같습니다.
1. 사용자 변수 school을 태그 입력란에 가져온다.
2. 태그 입력란에 다른 값을 기입하지 못하도록,
label>태그와 <input> 태그에 type="hidden" stype="width= 0; height=0;" 등을 입력한다.
<label for="tags" class="frozen-label">{$lang->tag} <span>(Comma-separated) / {$lang->about_tag}</span></label> <input type="text" name="tags" id="tags" value="@{$logged_info->school}" class="form-text form-text-normal" title="Tag" placeholder="tag1, tag2, tag3..." />
위와 같이 썼을 때, search_taget=tag로 검색하면 검색 잘 ~ 됩니다.
그런데 제가 그냥 지워버린 변수가 하나 있어요.
{htmlspecialchars($oDocument->get('tags'))}
이녀석을 그냥 지워버려도 괜찮을까요...?
{$lang->tag} <span>(Comma-separated) / {$lang->about_tag}</span>
이녀석도 그냥 지워버릴까 고민중인데, 괜찮을까요..?
댓글 3
-
무얼까2
2015.01.22 20:55
-
초보개발자시작
2015.01.23 15:54
아하... 덕분에 깊은 지식을 얻고가네요. 지금은 집 밖이라 테스트를 못해보지만, input에는 우선적으로 readOnly 속성을 넣고 그다음 hidden 속성을 넣을 수 있는지 알아봐야겠어요. 고맙습니다! -
무얼까2
2015.01.23 22:29
음. 폼 태그와 폼 전송, htmlspecialchars 같은 것에 대해 좀 더 알아보시라고 쓴 겁니다.
다시 정리해서 말씀드릴게요.
일단, 폼 태그의 type은 두 가지를 동시에 지정할 수 없습니다.
폼 태그는 input이건 select건 뭐건, 어떤 식으로 해도 쉽게 값을 바꿔치기 할 수 있습니다.
폼 태그만 갖고는 입력하는 값을 제한할 수 없습니다.
따라서, readonly로 해도 마찬가지고, disabled를 줘도 마찬가지입니다.
js 역시 소용 없습니다. 브라우저에서 js 꺼버리면 되니까요.
hidden, readonly, disabled 같은 건 상황에 따른 편리함을 제공할 따름입니다.
js 역시 마찬가지로 편리함 정도로 보시면 됩니다.
폼 전송의 값이 유효한가 아닌가는, 전송 후 서버쪽의 각 스크립트 언어(php, jsp, asp, ...)에서 판단해야 하는 것이죠.
전송 전의 유효값 체크는 편리함 때문이고, 전송 후 체크는 보안이나 기타 여러 이유로 필수인 것입니다.
그래서, 질문하신 내용을 가장 확실하게 하려면 모듈 또는 애드온을 만들거나, xe core의 board 모듈을 직접 수정해야 합니다. 이렇게 하면, 아예 $logged_info->school 값을 폼 태그에 넣을 필요도 없습니다.
그러나, 당장 이런 기능을 구현하긴 힘들고, 말씀하신 내용은 굳이 이렇게 하지 않아도 될 듯 합니다.
그냥 <input type="hidden" name="tags" value="{$logged_info->school}" /> 를 쓰시면 됩니다.유효성 체크를 할 수는 없지만, 문서에 저장된 태그를 불러오는게 아니고, 항상 $logged_info->school 값을 value에 넣기 때문에 글쓰기 폼에서 악의를 가진 스크립트가 실행 될 일은 없습니다.
다만, 글쓰기 폼이 아닌, 문서를 읽는 곳 같은 데서 htmlspecialchars를 빼고 {$oDocument->get('tags')}를 쓰게 된다면, 해당 태그에 스크립트가 있을 때 바로 실행됩니다.
중요한 것이라 조금 오지랖을 떨었습니다.
{htmlspecialchars($oDocument->get('tags'))}
아마도 input 태그의 value 자리에 있던 애겠죠?
문서에 저장된 태그를 가져온 후 htmlspecialchars로 혹시 모를 악성스크립트 따위를 방지하기 위해 몇몇 글자를 바꿔서(예: > >) input 에 표시하는 것이죠.(문서를 수정할 때 나타내던 것일테죠. 새로 작성할 때는 없으니 비어 있을 것이구요)
그걸 회원정보의 확장 변수 school 값으로 표시하고자 대체 하신거고, 그러니 문서에 저장된 tags를 불러 오나 그냥 확장변수 값 school을 다시 넣어주거나 같은 결과가 되겠죠.
{$lang->tag} ...... </span>
태그 관련 어떤 내용을 단순히 화면에 나타내는 부분이니 있건 말건 상관 없습니다.
하지만, 여기서 중요한건 input type="hidden" 에 대해 잘못 알고 계신 겁니다.
이 타입은 굳이 화면에 표시할 필요가 없을 때 쓰는거지, '값을 입력 못하게' 가 아닙니다.
위와 같은 방법은 바람직하진 않습니다. htmlspecialchars의 역할을 아셔야 하고, 악의적인 생각을 갖고 얼마든지 hidden에 값을 입력할 수 있다는 것도 아시길 바랍니다.