정리되지 않은 출력의 위험성에 대해 논의하고 형식화된 출력을 표시하는 안전한 방법을 제공합니다.
출력을 필터링할 위험이 없습니다.
사용자 입력을 받은 다음 이를 표시하면 출력 페이지가 손상될 수 있습니다. 예를 들어 누군가가 제출한 입력 상자에 자바스크립트를 악의적으로 삽입할 수 있습니다.
이것은
내
댓글입니다.
여기!')">.
이런 식으로 사용자가 악의적이지 않더라도 테이블이 갑자기 중단되거나 페이지가 불완전하게 표시되는 등 일부 HTML 문이 손상될 수 있습니다.
서식 없는 텍스트만 표시
이것은 가장 간단한 솔루션입니다. 사용자가 제출한 정보를 서식 없는 텍스트로 표시하면 됩니다. 모든 문자를 HTML 인코딩으로 변환하려면 htmlspecialchars() 함수를 사용하십시오.
예를 들어, <b>는 <b>로 변환되어 예상치 못한 HTML 태그가 부적절한 시간에 출력되지 않도록 합니다.
사용자가 서식이 지정되지 않은 텍스트 콘텐츠에만 관심이 있는 경우 이는 좋은 솔루션입니다. 하지만 포맷 기능을 좀 주면 더 좋을 것 같습니다.
사용자지정 마크업 태그로 서식 지정
서식 지정을 위해
사용자가 사용할 특수 태그를 제공할 수 있습니다. 예를 들어 [b]...[/b]를 사용하여 표시를 강조할 수 있습니다. .[/i ] 기울임꼴 표시, 간단한 검색 및 바꾸기 작업 수행: $output = str_replace("[b]", "<b>", $output);
$output = str_replace("[i]", " <i >", $output);
더 좋은 점은 사용자가 일부 링크를 입력하도록 허용할 수 있다는 것입니다. 예를 들어, 사용자는 [link="url"]...[/link]를 입력할 수 있으며, 이때 이를 <a href="">...</a> 문으로 변환합니다
. , 단순 검색을 사용할 수 없습니다. 교체는 정규 표현식을 사용하여 수행해야 합니다:
$output = ereg_replace('[link="([[:graph:]]+)"]', '<a href="1">' , $output);
ereg_replace()의 실행은
[link="..."]가 나타나는 문자열을 찾아 <a href="...">로 바꾸는 것
입니다. [[:graph:]]는 임의의 것을 의미합니다. 비어 있지 않은 문자입니다. 정규식에 대해서는 관련 기사를 참조하세요.
outputlib.php의 format_output() 함수는 이러한 태그의 변환을 제공합니다. 전반적인 원칙은 다음과 같습니다. 중국 네트워크 관리 연합(China Network Management Alliance) bitCN.com은
HTML 태그를 특수 인코딩으로 변환하고 표시해서는 안 되는 HTML 태그를 필터링하기 위해 htmlspecialchars()를 호출합니다. 그런 다음 일련의 맞춤 태그를 해당 HTML 태그로 변환합니다.
아래 소스 코드를 참조하세요:
<?php
함수 format_output($output) {
/****************************************** **********************************
* 원시 문자열($output)을 가져와서 특수 문자를 사용하여 출력 형식을 지정합니다.
* HTML과 유사한 마크업을 제거했습니다.
************************************************** * ******************************/
$output = htmlspecialchars(stripslashes($output));
/* 새 단락 */
$output = str_replace('[p]', '<p>', $output);
/* 용감한 */
$output = str_replace('[b]', '<b>', $output);
$output = str_replace('[/b]', '</b>', $output);
/* 이탤릭체 */
$output = str_replace('[i]', '<i>', $output);
$output = str_replace('[/i]', '</i>', $output);네트워크 관리 bitcn_com
/* 포맷됨 */
$output = str_replace('[pre]', '<pre>', $output);
$output = str_replace('[/pre]', '</pre>', $output);
/* 들여쓰기된 블록(blockquote) */
$output = str_replace('[indent]', '<blockquote>', $output);
$output = str_replace('[/indent]', '</blockquote>', $output);
/* 앵커 */
$output = ereg_replace('[anchor="([[:graph:]]+)"]', '<a name="1"></a>', $output);
/* 링크, 링크에서 자바스크립트를 방지하려고 합니다 */
$output = str_replace('[link="javascript', '[link="javascript', $output);
$output = ereg_replace('[link="([[:graph:]]+)"]', '<a href="1">', $output);
$output = str_replace('[/link]', '</a>', $output);
nl2br($output)을 반환합니다.
}
?>
참고 사항:
이 호출 전이 아니라 htmlspecialchars() 함수를 호출한 후에 HTML 태그 문자열을 생성하려면 사용자 정의 태그를 교체해야 합니다. 그렇지 않으면 htmlspecialchars() 흐름을 호출한 후 노력이 낭비됩니다. 네트워크 관리 비트cn_com
이 변환되면
검색 HTML 코드가 대체됩니다. 예를 들어 큰따옴표는 "될 것입니다".nl2br() 함수는 캐리지 리턴 및 줄 바꿈 문자를 <br> 태그로 변환합니다. htmlspecialchars() 뒤에 있어야 합니다.
[links=""]를 <a href="">로 변환할 때 제출자가 javascript를 삽입하지 않도록 해야 합니다. [link="javascript를 [link=" javascript로 변경하는 간단한 방법은 아니요. 교체하려면 원래 코드를 표시하면 됩니다.
outputlib.php는
브라우저에서 test.php를 호출합니다. format_output()의 사용법을 볼 수 있습니다.
일반 HTML 태그는 사용할 수 없습니다.
- 이것은 [b]bold[/b]입니다
.
- 이것은 [i]이탤릭체[/i]입니다.
- 이것은 [link=" http://www.phpbuilder.com"] 링크[/link]입니다.
[p]단락
에 대한 [link="#test"]링크[/link]입니다.
[pre]미리 포맷됨[/pre]
[indent]인터레이스 텍스트[/indent]
물론
필요에 따라 더 많은 태그를 추가할 수 있습니다. Network Management Alliance 비트CN@com
결론
이 토론에서는 사용자 입력을 안전하게 표시할 수 있는 방법을 제공합니다.
메시지 보드 사용자가 다음 프로그램에서 시스템 공지를 제안하는
데 사용됩니다.
게시판 시스템