Як я належним чином уникати лапок у атрибутах HTML?


267

У мене випадає веб-сторінка, яка порушується, коли рядок значення містить цитату.

Значення є "asd, але в DOM воно завжди відображається як порожній рядок.

Я намагався всім способом, яким я знаю, належним чином уникнути струни, але безрезультатно.

<option value=""asd">test</option>
<option value="\"asd">test</option>
<option value="&quot;asd">test</option>
<option value="&#34;asd">test</option>

Як мені це зробити на сторінці, щоб повідомлення про зворотний зв'язок містило правильне значення?


Як ви генеруєте сторінку?
СЛАкс

1
Що робити, якщо ви використовуєте одинарні лапки? <option value = '"asd'> test </option>
Wim ten Brink

5
Я маю зазначити, що жодна з цих відповідей не говорить про те, як правильно вийти з рядків для використання всередині атрибутів html
перезавантажити

4
@reconbot Це залежатиме від того, як створювався HTML. Питання стосувалось цитат, тому технічно прийнята відповідь відповідає на поставлене запитання. Щодо правильного виходу рядків, я не маю зручності для загального випадку, але в PHP, який ви використовуєте htmlentities.
Метт Браун

Відповіді:


343

&quot; це правильний шлях, третій з ваших тестів:

<option value="&quot;asd">test</option>

Ви можете побачити це, працюючи нижче, або на jsFiddle .

alert($("option")[0].value);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select>
  <option value="&quot;asd">Test</option>
</select>

Крім того, ви можете розмежувати значення атрибута за допомогою одиничних лапок:

<option value='"asd'>test</option>

17
Четвертий варіант OP & # 34;, також є дійсним способом уникнути котирувань. Є користь у використанні числових html-об'єктів над названими сутностями, в яких названі об'єкти охоплюють не всі символи, тоді як чисельні об'єкти це роблять. Повний список HTML4 знаходиться за адресою w3.org/TR/html4/sgml/entities.html .
atk

38
@atk: так, &quot;відображається той самий символ, що і символ &#34;, але тут немає користі використовувати числовий параметр, оскільки &quot;це визначена названа сутність. &quot;також легше запам’ятати.
Енді Е

6
Я згоден. У цьому конкретному випадку простіше використовувати & quot ;. Я мав намір лише вказати на загальну справу.
atk

4
@SIDU: змінити його &amp;quot;a(замінити &з &amp;)
Енді E

4
^ нескінченна петля
Омар Мекі

16

Якщо ви використовуєте PHP, спробуйте зателефонувати htmlentitiesабо htmlspecialcharsфункціонувати.


2
просто їх використання може бути недостатньо, спробуйте <option value='<?php echo htmlentities("' onmouseover='alert(123);' foo='"); ?>' />- переконайтеся, що ви використовуєте його з ENT_QUOTES, це безпечно:, <option value='<?php echo htmlentities("' onmouseover='alert(123);' foo='", ENT_QUOTES); ?>' /> але крім ENT_QUOTES ви також повинні додати ENT_SUBSTITUTE та ENT_DISALLOWED, особисто я використовував цю обгортку роками:function hhb_tohtml(string $str):string { return htmlentities($str, ENT_QUOTES | ENT_HTML401 | ENT_SUBSTITUTE | ENT_DISALLOWED, 'UTF-8', true); }
hanshenrik

12

Для синтаксису HTML і навіть HTML5 наведені нижче всі допустимі параметри:

<option value="&quot;asd">test</option>
<option value="&#34;asd">test</option>
<option value='"asd'>test</option>
<option value='&quot;asd'>test</option>
<option value='&#34;asd'>test</option>
<option value=&quot;asd>test</option>
<option value=&#34;asd>test</option>

Зауважте, що якщо ви використовуєте синтаксис XML, лапки (одинарні чи подвійні) обов'язкові.

Ось jsfiddle, що показує всі вищезазначені роботи .


7

Інший варіант - це заміна подвійних лапок на одиничні лапки, якщо ви не заперечуєте, що б це не було. Але я не згадую цього:

<option value='"asd'>test</option>

Я згадую про це:

<option value="'asd">test</option>

У моєму випадку я використав це рішення.


9
Але якщо значення містить одинарні та подвійні лапки, це не вдасться
Раптор

@Raptor Я сказав, що якщо значення містить подвійні лапки, перетворіть їх на одиничні лапки. Якщо значення містить одиничні лапки, то це не буде проблемою.
csonuryilmaz


0

Ви дійсно повинні дозволити лише недовірені дані у білий список хороших атрибутів, таких як: вирівнювання, виправлення, альт, bgcolor, облямівка, стільниковий простір, розмір клітинок, клас, колір, cols, colspan, coords, dir, face, height, hspace, ismap, lang , marginheight, marginwidth, multiple, nohref, noresize, noshade, norap, ref, rel, rev, рядки, rowpan, прокрутка, форма, span, підсумок, tabindex, назва, usemap, valign, value, vlink, vspace, width

Ви дійсно хочете, щоб не довірені дані не обробляли JavaScript, а також атрибути id або імені (вони можуть приборкати інші елементи в DOM).

Крім того, якщо ви вводите недовірені дані в атрибут SRC або HREF, то це дійсно непідтверджена URL-адреса, тому вам слід перевірити URL-адресу, переконайтеся, що її НЕ javascript: URL, а потім HTML-код кодування.

Детальніше про все тут: https://www.owasp.org/index.php/Abridged_XSS_Prevention_Cheat_Sheet


3
Я знаю, що це пізно, але майже всі ці атрибути застаріли в HTML4.01 і видаляються в 5. Це, мабуть, не має значення зараз, оскільки є кращі способи захистити себе, просто вказавши на це.
trysis

1
Питання - це запитання про дані з цитатами, а не про ненадійні дані.
Квентін

-3

Немає можливості уникнути лапок у значенні вхідного тексту ... але ви можете використовувати javascript (або jquery):

<input type="input" name="myinput" id="myinput" value="" />
<script>document.getElementById("myinput").value="This input has a [\"]";</script>

1
Твоє твердження "Немає можливості уникнути лапок у значенні вхідного тексту" явно неправильне. Дивіться прийняту відповідь від 2010 року, яка отримала 276 голосів.
Квентін

Вибачте мене Квентіна, але ТИЙ ВІДПОВІДЬ каже, що це не можна зробити. У ньому йдеться про те, що ви можете вставити кодовану подвійну цитату html або ви можете використовувати просту цитату для розмежування подвійної цитати, але це не спосіб вставити подвійну цитату у значення, визначене подвійною цитатою. Він пропонує альтернативу чомусь неможливому, що є тим самим, що я роблю
Мігель

Спосіб вставити подвійну лапочку у значення, розмежоване подвійною цитатою, - це використання кодування HTML, як ви недавно сказали.
Квентін

(Привіт Квентін ... ми в Інтернеті) Я просто кажу, що значення цього рядка не є подвійною цитатою, це & quot ;, це не те саме.
Мігель

2
Якщо ви вставите & quot; у значенні, і ви надсилаєте його, на сервері ви отримуєте 6 символів, від & до ;. Ви не отримуєте подвійної цитати. Це не те саме, і для мене це не працює
Мігель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.