PHP барлық HTML оқиғасының атрибуттарын HTML тегінде жою

Барлық оқиғалардың атрибуттарын жоюға (мысалы, Оқиғаға сілтеме тізім ).

Оқиға атрибуттарын танитын PHP-ның DOMDocument сыныбындағы функция бар ма?

Мен RegEx-ды пайдаланып көрдім, бірақ ол жалғыз тырнақшалармен және қос тырнақшалармен қиындады:

preg_replace('/on*[a-z]+=".*?"/i', '', $html);//Doesn't match onclick="alert(\"hello\");"

HTMLPurifier деп аталатын сыртқы кітапхананы көрдім, бірақ оның барлық оқиғалар атрибуттарын жою мүмкіндігі жоқ.

Қандай нұсқаулар немесе қарапайым шешімдер туралы кез-келген идея?

0
onnnnnclick немесе тіпті oclick сияқты нәрселерді іздегеніңізге байланысты * - бірінші > * тек n әсер етеді.
қосылды автор Niet the Dark Absol, көзі
Ағымдағы кодымен мына әрекеттерді орындауға болады: onClick = 'omghaxorz ();'
қосылды автор Niet the Dark Absol, көзі
@ user1105430: DOM-ді бұл үшін пайдаланыңыз.
қосылды автор Casimir et Hippolyte, көзі
@ user1105430: DOM-ді бұл үшін пайдаланыңыз.
қосылды автор Casimir et Hippolyte, көзі
@ user1105430: DOM-ді бұл үшін пайдаланыңыз.
қосылды автор Casimir et Hippolyte, көзі
қосылды автор SamSquanch, көзі
неге PHP filter_var() қолданбаймыз? Js оқиғасын шешпеңіз.
қосылды автор Zulkhaery Basrul, көзі
неге PHP filter_var() қолданбаймыз? Js оқиғасын шешпеңіз.
қосылды автор Zulkhaery Basrul, көзі
« HTMLPurifier деп аталатын сыртқы кітапхананы көрдім, бірақ ол барлық оқиғалар атрибуттарын жоюға мүмкіндік жоқ. » Жоқ: ол оларды сақтау мүмкіндігі жоқ. Ол әдепкі бойынша барлық зиянды HTML-ді жояды, ал кейбір қауіпті HTML-лерге қарамастан, оны қабылдауға рұқсат алу үшін сіз штанокпен өтуіңіз керек. (Мені дұрыс түсінбеңіз, бірақ бұл жақсы нәрсе.) Мен оны басқа ұсынуға кеңес беремін. :)
қосылды автор pinkgothic, көзі
« HTMLPurifier деп аталатын сыртқы кітапхананы көрдім, бірақ ол барлық оқиғалар атрибуттарын жоюға мүмкіндік жоқ. » Жоқ: ол оларды сақтау мүмкіндігі жоқ. Ол әдепкі бойынша барлық зиянды HTML-ді жояды, ал кейбір қауіпті HTML-лерге қарамастан, оны қабылдауға рұқсат алу үшін сіз штанокпен өтуіңіз керек. (Мені дұрыс түсінбеңіз, бірақ бұл жақсы нәрсе.) Мен оны басқа ұсынуға кеңес беремін. :)
қосылды автор pinkgothic, көзі
« HTMLPurifier деп аталатын сыртқы кітапхананы көрдім, бірақ ол барлық оқиғалар атрибуттарын жоюға мүмкіндік жоқ. » Жоқ: ол оларды сақтау мүмкіндігі жоқ. Ол әдепкі бойынша барлық зиянды HTML-ді жояды, ал кейбір қауіпті HTML-лерге қарамастан, оны қабылдауға рұқсат алу үшін сіз штанокпен өтуіңіз керек. (Мені дұрыс түсінбеңіз, бірақ бұл жақсы нәрсе.) Мен оны басқа ұсынуға кеңес беремін. :)
қосылды автор pinkgothic, көзі
Whitelisting қара тізімдерге қарағанда қауіпсіз.
қосылды автор Lesleh, көзі
Мен неге сұраймын?
қосылды автор user557846, көзі
бұл зиянкестерден жеткілікті қорғаныс болуы мүмкін, егер әлеуетті тізімнің үлкен болуы мүмкін
қосылды автор user557846, көзі
@SamSquanch THAT WORKS! Бұл функция жұмыс істейді.
қосылды автор user1105430, көзі
@SamSquanch THAT WORKS! Бұл функция жұмыс істейді.
қосылды автор user1105430, көзі
@SamSquanch THAT WORKS! Бұл функция жұмыс істейді.
қосылды автор user1105430, көзі
@Dagon Пайдаланушыға өздерінің HTML-файлдарын көрсетуге мүмкіндік беретін пішінім бар, бірақ оларды нөлдік javascript-ны пайдаланудан шектеуге болады: ешқандай сценарий тегтері, сілтеме тегтері және ешқандай оқиға төлсипатының тегтері жоқ.
қосылды автор user1105430, көзі

8 жауаптар

Егер сіз шынымен қауіпсіз кодты қажет етсеңіз, ақ тізімге негізделген әдіс («тек қана осы заттарға рұқсат беріңіз ...») әдетте қара тізімге қарағанда жеңілірек болады («рұқсат бермеңіз: ...»).

Сіз HTML тазартқышы туралы айттыңыз және « барлық оқиғалар атрибуттарын жоюға ешқандай мүмкіндіктері жоқ» .

Бұл ... техникалық тұрғыдан дұрыс, өйткені айту оқиғалар атрибуттарын жою мүмкін емес. Мұның себебі сауда нүктесі болып табылады, бірақ ол автоматты түрде жасалады. «Жетіспейтін» параметр - бұл рұқсат етілген оқиға төлсипаттарына HTML тазартқышын теңшеу мүмкіндігі. Бұл әдейі бұзылады. HTML тазалағыш (аты ұсынылғандай) күшті қауіпсіздік фокусына ие.

HTML тазартқыш конфигурациясын қолдануға мүмкіндік беретін кейбір кейбір «қауіпті HTML» аспектілері бар (әдепкі конфигурация әдейі таңдалады), бірақ оқиға атрибуттары солардың арасында емес. (Ал, сіз HTML-тазартқышты үйренуіңізге болады, егер олар шаппен секірсе, бірақ көп күш жұмсау керек болады.)

Пайдаланушы HTML-ді қабылдағыңыз келсе, оны басқа біреуге беруге кеңес беремін. Бұл көптеген адамдар сынап көрген жеткілікті құралы.

HTML-ды бұзып, JavaScript-ні ашады. Мысалы, src немесе href атрибутын қолданып, JavaScript-ті енгізуге болатындығын білдіңіз бе? Кейбір шолғыштарда style тегінің көмегімен JavaScript-ды енгізуге болатындығын білдіңіз бе? Бұл XSS чектер кестесін қараңыз. Бұл сізді қарсы болған нәрсе туралы нашар идея бере алады және ақ тізімдемені неғұрлым тиімді деп санайды.

Қалай болғанда да, сәттілік!

1
қосылды
Мен оған қараймын. Рахмет
қосылды автор user1105430, көзі

Егер сіз шынымен қауіпсіз кодты қажет етсеңіз, ақ тізімге негізделген әдіс («тек қана осы заттарға рұқсат беріңіз ...») әдетте қара тізімге қарағанда жеңілірек болады («рұқсат бермеңіз: ...»).

Сіз HTML тазартқышы туралы айттыңыз және « барлық оқиғалар атрибуттарын жоюға ешқандай мүмкіндіктері жоқ» .

Бұл ... техникалық тұрғыдан дұрыс, өйткені айту оқиғалар атрибуттарын жою мүмкін емес. Мұның себебі сауда нүктесі болып табылады, бірақ ол автоматты түрде жасалады. «Жетіспейтін» параметр - бұл рұқсат етілген оқиға төлсипаттарына HTML тазартқышын теңшеу мүмкіндігі. Бұл әдейі бұзылады. HTML тазалағыш (аты ұсынылғандай) күшті қауіпсіздік фокусына ие.

HTML тазартқыш конфигурациясын қолдануға мүмкіндік беретін кейбір кейбір «қауіпті HTML» аспектілері бар (әдепкі конфигурация әдейі таңдалады), бірақ оқиға атрибуттары солардың арасында емес. (Ал, сіз HTML-тазартқышты үйренуіңізге болады, егер олар шаппен секірсе, бірақ көп күш жұмсау керек болады.)

Пайдаланушы HTML-ді қабылдағыңыз келсе, оны басқа біреуге беруге кеңес беремін. Бұл көптеген адамдар сынап көрген жеткілікті құралы.

HTML-ды бұзып, JavaScript-ні ашады. Мысалы, src немесе href атрибутын қолданып, JavaScript-ті енгізуге болатындығын білдіңіз бе? Кейбір шолғыштарда style тегінің көмегімен JavaScript-ды енгізуге болатындығын білдіңіз бе? Бұл XSS чектер кестесін қараңыз. Бұл сізді қарсы болған нәрсе туралы нашар идея бере алады және ақ тізімдемені неғұрлым тиімді деп санайды.

Қалай болғанда да, сәттілік!

1
қосылды
Мен оған қараймын. Рахмет
қосылды автор user1105430, көзі

DOM-мен оны жасау тәсілі.

The following code seeks and removes attributes whose name starts by "on" in all html tags.
($html stands for the html code)

$doc = new DOMDocument();
@$doc->loadHTML($html);
$xpath = new DOMXPath($doc);

$onAttributes = $xpath->query("//*/@*[starts-with(name(), 'on')]");
foreach ($onAttributes as $onAttribute) {
    $onAttribute->ownerElement->removeAttributeNode($onAttribute);
}

$body = $xpath->query('body')->item(0);
$result = substr($doc->saveHTML($body),6,-7);
0
қосылды

DOM-мен оны жасау тәсілі.

The following code seeks and removes attributes whose name starts by "on" in all html tags.
($html stands for the html code)

$doc = new DOMDocument();
@$doc->loadHTML($html);
$xpath = new DOMXPath($doc);

$onAttributes = $xpath->query("//*/@*[starts-with(name(), 'on')]");
foreach ($onAttributes as $onAttribute) {
    $onAttribute->ownerElement->removeAttributeNode($onAttribute);
}

$body = $xpath->query('body')->item(0);
$result = substr($doc->saveHTML($body),6,-7);
0
қосылды

DOM-мен оны жасау тәсілі.

The following code seeks and removes attributes whose name starts by "on" in all html tags.
($html stands for the html code)

$doc = new DOMDocument();
@$doc->loadHTML($html);
$xpath = new DOMXPath($doc);

$onAttributes = $xpath->query("//*/@*[starts-with(name(), 'on')]");
foreach ($onAttributes as $onAttribute) {
    $onAttribute->ownerElement->removeAttributeNode($onAttribute);
}

$body = $xpath->query('body')->item(0);
$result = substr($doc->saveHTML($body),6,-7);
0
қосылды

HTML құжатын жүктеңіз, барлық элементтерден кейін оларды барлық атрибуттарына енгізіңіз (кірістірілген), қосыңыз егер атрибуттарды алып тастаңыз:

$doc = new DOMDocument();
$doc->loadHTML($html);

foreach ($doc->getElementsByTagname('*') as $element) 
{
    foreach (iterator_to_array($element->attributes) as $name => $attribute)
    {
        if (substr_compare($name, 'on', 0, 2, TRUE) === 0)
        {
            $element->removeAttribute($name);
        }
    }
}

Сондай-ақ белгілі атрибут аттарының тізімін алып тастау және белгісіз адам табылған жағдайда ескерту жасау (немесе рұқсат берген атрибуттар тізімін беру) мүмкін. Бұл көмектеседі деп үміттенемін, код аздап қате болуы мүмкін.

0
қосылды
iterator_to_array() үшін қандай себеп бар? Айтуынша, foreach - бұл білдіреді иераторлар үшін.
қосылды автор Riki137, көзі

HTML құжатын жүктеңіз, барлық элементтерден кейін оларды барлық атрибуттарына енгізіңіз (кірістірілген), қосыңыз егер атрибуттарды алып тастаңыз:

$doc = new DOMDocument();
$doc->loadHTML($html);

foreach ($doc->getElementsByTagname('*') as $element) 
{
    foreach (iterator_to_array($element->attributes) as $name => $attribute)
    {
        if (substr_compare($name, 'on', 0, 2, TRUE) === 0)
        {
            $element->removeAttribute($name);
        }
    }
}

Сондай-ақ белгілі атрибут аттарының тізімін алып тастау және белгісіз адам табылған жағдайда ескерту жасау (немесе рұқсат берген атрибуттар тізімін беру) мүмкін. Бұл көмектеседі деп үміттенемін, код аздап қате болуы мүмкін.

0
қосылды
iterator_to_array() үшін қандай себеп бар? Айтуынша, foreach - бұл білдіреді иераторлар үшін.
қосылды автор Riki137, көзі

HTML құжатын жүктеңіз, барлық элементтерден кейін оларды барлық атрибуттарына енгізіңіз (кірістірілген), қосыңыз егер атрибуттарды алып тастаңыз:

$doc = new DOMDocument();
$doc->loadHTML($html);

foreach ($doc->getElementsByTagname('*') as $element) 
{
    foreach (iterator_to_array($element->attributes) as $name => $attribute)
    {
        if (substr_compare($name, 'on', 0, 2, TRUE) === 0)
        {
            $element->removeAttribute($name);
        }
    }
}

Сондай-ақ белгілі атрибут аттарының тізімін алып тастау және белгісіз адам табылған жағдайда ескерту жасау (немесе рұқсат берген атрибуттар тізімін беру) мүмкін. Бұл көмектеседі деп үміттенемін, код аздап қате болуы мүмкін.

0
қосылды
iterator_to_array() үшін қандай себеп бар? Айтуынша, foreach - бұл білдіреді иераторлар үшін.
қосылды автор Riki137, көзі