HTML 콘텐츠에서 스크립트 태그 제거
HTML Pureer(http://htmlpurifier.org/)를 사용하고 있습니다.
제거만 하면 됩니다.<script>
태그만.인라인 포맷이나 다른 것은 삭제하고 싶지 않습니다.
어떻게 하면 좋을까요?
그리고 HTML에서 스크립트태그를 삭제할 수 있는 다른 방법이 있습니다.
이 질문에는 regex라는 태그가 붙어있기 때문에 이 상황에서 불쌍한 남자의 해결책으로 대답하겠습니다.
$html = preg_replace('#<script(.*?)>(.*?)</script>#is', '', $html);
단, 정규 표현은 HTML/XML을 해석하기 위한 것이 아닙니다.완벽한 표현은 결국 깨집니다만, 마크업을 신속하게 수정하는 것이 도움이 되는 경우도 있습니다.빠른 수정과 마찬가지로 보안을 잊어버리는 것도 도움이 됩니다.regex는 신뢰할 수 있는 콘텐츠/마크업에만 사용하십시오.
사용자가 입력한 내용은 안전하지 않은 것으로 간주해야 합니다.
여기서 더 나은 해결책은DOMDocument
이걸 위해 만들어진거야.다음은 regex와 비교하여 얼마나 쉽고 깨끗한지, (거의) 신뢰성 및 (거의) 안전성이 뛰어난지 보여주는 단편입니다.
<?php
$html = <<<HTML
...
HTML;
$dom = new DOMDocument();
$dom->loadHTML($html);
$script = $dom->getElementsByTagName('script');
$remove = [];
foreach($script as $item)
{
$remove[] = $item;
}
foreach ($remove as $item)
{
$item->parentNode->removeChild($item);
}
$html = $dom->saveHTML();
이마저도 볼록해서 HTML을 일부러 삭제했습니다.
PHP 파서를 사용합니다.
$doc = new DOMDocument();
// load the HTML string we want to strip
$doc->loadHTML($html);
// get all the script tags
$script_tags = $doc->getElementsByTagName('script');
$length = $script_tags->length;
// for each tag, remove it from the DOM
for ($i = 0; $i < $length; $i++) {
$script_tags->item($i)->parentNode->removeChild($script_tags->item($i));
}
// get the HTML string back
$no_script_html_string = $doc->saveHTML();
이 작업을 통해 다음 HTML 문서를 사용할 수 있었습니다.
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>
hey
</title>
<script>
alert("hello");
</script>
</head>
<body>
hey
</body>
</html>
이 점에 유의해 주십시오.DOMDocument
파서를 사용하려면 PHP 5 이상이 필요합니다.
$html = <<<HTML
...
HTML;
$dom = new DOMDocument();
$dom->loadHTML($html);
$tags_to_remove = array('script','style','iframe','link');
foreach($tags_to_remove as $tag){
$element = $dom->getElementsByTagName($tag);
foreach($element as $item){
$item->parentNode->removeChild($item);
}
}
$html = $dom->saveHTML();
스트링을 조작하는 간단한 방법입니다.
function stripStr($str, $ini, $fin)
{
while (($pos = mb_stripos($str, $ini)) !== false) {
$aux = mb_substr($str, $pos + mb_strlen($ini));
$str = mb_substr($str, 0, $pos);
if (($pos2 = mb_stripos($aux, $fin)) !== false) {
$str .= mb_substr($aux, $pos2 + mb_strlen($fin));
}
}
return $str;
}
- 이것은 SecretestCoder와 Binh WPO의 결합입니다.
스크립트 태그 화살표의 문제는 여러 변종이 있을 수 있다는 것입니다.
예 (< =)
<
=&lt;
) & ( > =>
=&gt;
)
그래서 수많은 변종과 같은 패턴 배열을 만드는 대신, imho는 더 나은 해결책이 될 것입니다.
return preg_replace('/script.*?\/script/ius', '', $text)
? preg_replace('/script.*?\/script/ius', '', $text)
: $text;
이렇게 하면 어떤 것이든 제거될 것이다.script.../script
화살표 코드/화살표에 관계없이 https://regex101.com/r/lK6vS8/1에서 테스트할 수 있습니다.
이 완전하고 유연한 솔루션을 사용해 보십시오.이 기능은 완벽하게 동작하며 일부 이전 답변에 기초하고 있지만 추가 검증 체크가 포함되어 있으며 에서 추가 암시 HTML을 제거합니다.loadHTML(...)
기능.이 기능은 2개의 독립된 기능(이전 종속성이 있기 때문에 재배열/재배열하지 않음)으로 나누어져 있기 때문에 동시에 삭제하고 싶은 여러 HTML 태그와 함께 사용할 수 있습니다.'script'
를 들어, "cm"와 같이 합니다.removeAllInstancesOfTag(...)
는 ""를 "array
만 """로 합니다." """a""string
더 이상 는 다음과 같습니다 이치
/* Remove all instances of a particular HTML tag (e.g. <script>...</script>) from a variable containing raw HTML data. [BEGIN] */
/* Usage Example: $scriptless_html = removeAllInstancesOfTag($html, 'script'); */
if (!function_exists('removeAllInstancesOfTag'))
{
function removeAllInstancesOfTag($html, $tag_nm)
{
if (!empty($html))
{
$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'); /* For UTF-8 Compatibility. */
$doc = new DOMDocument();
$doc->loadHTML($html,LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD|LIBXML_NOWARNING);
if (!empty($tag_nm))
{
if (is_array($tag_nm))
{
$tag_nms = $tag_nm;
unset($tag_nm);
foreach ($tag_nms as $tag_nm)
{
$rmvbl_itms = $doc->getElementsByTagName(strval($tag_nm));
$rmvbl_itms_arr = [];
foreach ($rmvbl_itms as $itm)
{
$rmvbl_itms_arr[] = $itm;
};
foreach ($rmvbl_itms_arr as $itm)
{
$itm->parentNode->removeChild($itm);
};
};
}
else if (is_string($tag_nm))
{
$rmvbl_itms = $doc->getElementsByTagName($tag_nm);
$rmvbl_itms_arr = [];
foreach ($rmvbl_itms as $itm)
{
$rmvbl_itms_arr[] = $itm;
};
foreach ($rmvbl_itms_arr as $itm)
{
$itm->parentNode->removeChild($itm);
};
};
};
return $doc->saveHTML();
}
else
{
return '';
};
};
};
/* Remove all instances of a particular HTML tag (e.g. <script>...</script>) from a variable containing raw HTML data. [END] */
/* Remove all instances of dangerous and pesky <script> tags from a variable containing raw user-input HTML data. [BEGIN] */
/* Prerequisites: 'removeAllInstancesOfTag(...)' */
if (!function_exists('removeAllScriptTags'))
{
function removeAllScriptTags($html)
{
return removeAllInstancesOfTag($html, 'script');
};
};
/* Remove all instances of dangerous and pesky <script> tags from a variable containing raw user-input HTML data. [END] */
그리고 이것이 시험 사용 예 있다.
$html = 'This is a JavaScript retention test.<br><br><span id="chk_frst_scrpt">Congratulations! The first \'script\' tag was successfully removed!</span><br><br><span id="chk_secd_scrpt">Congratulations! The second \'script\' tag was successfully removed!</span><script>document.getElementById("chk_frst_scrpt").innerHTML = "Oops! The first \'script\' tag was NOT removed!";</script><script>document.getElementById("chk_secd_scrpt").innerHTML = "Oops! The second \'script\' tag was NOT removed!";</script>';
echo removeAllScriptTags($html);
나는 내 해답은 정말 누군가 도움이 되길 바랍니다.맛있게 드세요!
짧아진:
$html = preg_replace("/<script.*?\/script>/s", "", $html);
아서 이렇게 하는 것이 안전합니다 언제regex 일을 하는 잘못된,: 갈 수 있다.
$html = preg_replace("/<script.*?\/script>/s", "", $html) ? : $html;
는"사고" 일어나면, 우리는 원래의달러 html 빈 문자열 대신한다.
예 modifing ctf0의 대답이다.이 작업은 한번만라 오류에 대한 견제와 슬래시에 캐릭터 코드 차단하 preg_replace 해야 한다.
$str = '<script> var a - 1; </script>';
$pattern = '/(script.*?(?:\/|/|/)script)/ius';
$replace = preg_replace($pattern, '', $str);
return ($replace !== null)? $replace : $str;
만약 당신이 php 7을 쓰고 그것을 훨씬 더 단순화 하기 위해 공의 합병체가 있연산자를 사용할 수 있다.
$pattern = '/(script.*?(?:\/|/|/)script)/ius';
return (preg_replace($pattern, '', $str) ?? $str);
function remove_script_tags($html){
$dom = new DOMDocument();
$dom->loadHTML($html);
$script = $dom->getElementsByTagName('script');
$remove = [];
foreach($script as $item){
$remove[] = $item;
}
foreach ($remove as $item){
$item->parentNode->removeChild($item);
}
$html = $dom->saveHTML();
$html = preg_replace('/<!DOCTYPE.*?<html>.*?<body><p>/ims', '', $html);
$html = str_replace('</p></body></html>', '', $html);
return $html;
}
데얀의 하지만 saveHTML()불필요한 doctype과 몸을 태그 추가 그것을 없애야 한다 좋았다.https://3v4l.org/82FNP 봐
있는 경우 나는 BeautifulSoup을 사용할 것입니다.이런 종류의 일은 매우 쉽게 만드네요.
regexps로 하려고 하지 마세요.그렇게 하면 미친 짓이 된다.
나는 이 문제로 고민하고 있었다.한 가지 기능만 있으면 된다는 것을 알게 되었습니다.breakdrough > , $120);모든 태그의 공통분모는 <와 >입니다.그 후에는 보통 따옴표("")가 붙습니다.공통분모를 찾으면 정보를 쉽게 추출할 수 있습니다.제가 생각해낸 건 다음과 같습니다.
$html = file_get_contents('http://some_page.html');
$h = explode('>', $html);
foreach($h as $k => $v){
$v = trim($v);//clean it up a bit
if(preg_match('/^(<script[.*]*)/ius', $v)){//my regex here might be questionable
$counter = $k;//match opening tag and start counter for backtrace
}elseif(preg_match('/([.*]*<\/script$)/ius', $v)){//but it gets the job done
$script_length = $k - $counter;
$counter = 0;
for($i = $script_length; $i >= 0; $i--){
$h[$k-$i] = '';//backtrace and clear everything in between
}
}
}
for($i = 0; $i <= count($h); $i++){
if($h[$i] != ''){
$ht[$i] = $h[$i];//clean out the blanks so when we implode it works right.
}
}
$html = implode('>', $ht);//all scripts stripped.
echo $html;
스크립트 태그에만 해당됩니다.네스트된 스크립트태그가 존재하지 않기 때문입니다.물론 동일한 검사 및 중첩된 태그를 수집하는 코드를 쉽게 추가할 수 있습니다.
아코디언 코드라고 부르죠공통분모가 있는 경우 incomode();incomode();는 논리를 흐르게 하는 가장 쉬운 방법입니다.
Dejan Marjanovic의 답변은 다음과 같습니다.
function removeTags($html, $tag) {
$dom = new DOMDocument();
$dom->loadHTML($html);
foreach (iterator_to_array($dom->getElementsByTagName($tag)) as $item) {
$item->parentNode->removeChild($item);
}
return $dom->saveHTML();
}
다음을 포함한 모든 종류의 태그를 제거할 수 있습니다.<script>
:
$scriptlessHtml = removeTags($html, 'script');
하여 빈 으로 대체하거나 somethingstr_replace를 합니다.
$query = '<script>console.log("I should be banned")</script>';
$badChar = array('<script>','</script>');
$query = str_replace($badChar, '', $query);
echo $query;
//this echoes console.log("I should be banned")
?>
언급URL : https://stackoverflow.com/questions/7130867/remove-script-tag-from-html-content
'programing' 카테고리의 다른 글
로컬 컴퓨터의 PHP 서버를 선택하십시오. (0) | 2022.09.19 |
---|---|
Java resource as File (0) | 2022.09.19 |
NumPy 어레이는 JSON을 직렬화할 수 없습니다. (0) | 2022.09.19 |
MySQL, NULL 또는 빈 문자열을 삽입하시겠습니까? (0) | 2022.09.06 |
MYSQL 쿼리: 한 열이 여러 다른 그룹에서 여러 번 발생하고 특정 조건과 일치하는 모든 결과를 가져옵니다. (0) | 2022.09.06 |