0

我正在处理一个项目,该项目涉及使用 TinyMCE 的用户的 HTML 输入。在这一点上,我能想到的验证/清理 HTML 数据的唯一方法是在 PHP 中使用 DomDocument 和允许的 HTML 标签的白名单。

因此,使用 DomDocument,我首先遍历所有标签,仅查找允许的特定标签(“白名单”),并将它们替换为新元素及其允许的属性,显然是从输入的旧标签中复制值用户。

这样,我不仅可以控制用户输入的标签,还可以控制它们的属性,希望不会有“泄漏”。

到目前为止,我已经设法使用我在 PHP.net 上找到的一个类来循环这个 HTMLinput 的主体:

class ArrayNode{
public $nodeName, $nodeValue;
}

function getChildNodeElements( $domNode ){
    $nodes = array();
    for( $i=0; $i < $domNode->childNodes->length; $i++){
        $cn = $domNode->childNodes->item($i);
        if( $cn->nodeType == 1){
        $nodes[] = $cn;
        }
    }
       return $nodes;
}

function getArrayNodes( $domDoc ){
$res = array();

for( $i=0; $i < $domDoc->childNodes->length; $i++){
$cn = $domDoc->childNodes->item($i);
    # The first is the root tag...
if( $cn->nodeType == 1){
    # But we want it's childNodes.
    $sub_cn = getChildNodeElements( $cn);
    # Found the tagName:
    $baseItemTagName = $sub_cn[0]->nodeName;
    break;
    }
}

$dnl = $domDoc->getElementsByTagName( $baseItemTagName);

for( $i=0; $i< $dnl->length; $i++){
    $arrayNode = new ArrayNode();

    # Summary
    $arrayNode->nodeName = $dnl->item($i)->nodeName;
    $arrayNode->nodeValue = $dnl->item($i)->nodeValue;

    # Child Nodes
    $cn = $dnl->item($i)->childNodes;
    for( $k=0; $k<$cn->length; $k++){
    if( $cn->item($k)->nodeName == "#text" && trim($cn->item($k)->nodeValue) == "") continue;
    $arrayNode->{$cn->item($k)->nodeName} = $cn->item($k)->nodeValue;
    }

    # Attributes
    $attr = $dnl->item($i)->attributes;
    for( $k=0; $k < $attr->length; $k++){
    if(! is_null($attr)){
        if( $attr->item($k)->nodeName == "#text" && trim($attr->item($k)->nodeValue) == "") continue;
        $arrayNode->{$attr->item($k)->nodeName} = $attr->item($k)->nodeValue;
    }
    }

    $res[] = $arrayNode;
}

return $res;
}

这种方法是清理使用 TinyMCE 输入的 HTML 输入的正确方法吗?Stackoverflow 如何处理这个问题?另外,如何在这样的 HTML 中递归地替换元素以使标签元素的位置保持不变?

对此的任何帮助将不胜感激。

4

0 回答 0