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