我正在处理一个项目,该项目涉及使用 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 中递归地替换元素以使标签元素的位置保持不变?
对此的任何帮助将不胜感激。