Ajax问题(可能是由于encodeURIComponent字符)

时间:2014-10-08 18:17:47

标签: javascript jquery ajax

我有一个表单,其中包含用户输入数据的文本区域,然后通过ajax将表单提交到同一页面,然后进行处理。

用户每隔一段时间就会输入一些会导致ajax错误的数据。

我剥离了所有其他表单字段并将其缩小到导致问题的textarea,但我找不到原因。

我构建了一个示例页面,我一直在运行以调试问题,但我无法弄清楚为什么我会遇到问题。

我试图创造一个小提琴并且遇到了问题:(

以下是测试页的链接:https://fundraising-matrix.com/greenpill/broken.php

以下是测试页面的代码(broken.php):

<?php
if (!$_POST) { ?>
  <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
  <script type="text/javascript">
    function submitEncodeURI() {

      //including other form data that I stripped away
      var dataString = 'formid=completeActivity&submit=submit&uid=5435716e20463&notificationcounter=0';

      //grab and encode the textarea text
      var txtValue = encodeURIComponent($('#test_textarea').val());

      //add the textarea text to my string
      dataString += '&dispo='+txtValue;

      //submit the data to itself
      $.ajax({
        type: "POST",
        url: 'broken.php',
        data: dataString,
        success: function(returnData) {
          $('#encodedTextArea').html(returnData);
        },
        error: function() {
          alert('Failed');
        }
      });
    }
  </script>
  <p><strong>Sample Failing Text:</strong><br /><br />
    test please ignore 5105 = 33 5128 = 12 5325 = 19 6790 = 8 6791 = 4 6792 = 8 7125 = 20 7141 = 1
  </p>
  <textarea id="test_textarea" style="width: 300px; height: 300px;"></textarea><input type="button" value="Submit" onClick="submitEncodeURI();">
  <br />
  <strong>Submitted Text:</strong><br />
  <div id="encodedTextArea"></div>
<?php
}
else {
  echo $_POST['dispo'];
}
?>

什么行不通

当我进入时: “测试请忽略5105 = 33 5128 = 12 5325 = 19 6790 = 8 6791 = 4 6792 = 8 7125 = 20 7141 = 1” 进入textarea后,由于“500内部服务器错误”,ajax将失败。

做什么工作

当我将最后一个字符更改为“1”以外的任何字符时,它都有效。

示例:“测试请忽略5105 = 33 5128 = 12 5325 = 19 6790 = 8 6791 = 4 6792 = 8 7125 = 20 7141 = 2”

为什么突然改变最后一个字符会让ajax工作?为什么它会破坏(返回500内部服务器错误)?

我认为这与encodeURIComponent()个字符的某些组合有关。

1 个答案:

答案 0 :(得分:0)

经过几个小时,我终于明白了。

这就是为什么在测试样本文本时“测试请忽略5105 = 33 5128 = 12 5325 = 19 6790 = 8 6791 = 4 6792 = 8 7125 = 20 7141 = 1”在其他服务器上它可能会起作用并且在测试时在我的,它将无法工作。

我的服务器有许多防范sql注入攻击的安全措施。如果它检测到任何形式的这些攻击,它会将请求抛出到服务器。

如果你看一下我试图发送的字符串,它的开头就是“忽略”,字符串的最后一个字符是“7141 = 1”。

我的服务器在字符串“7141 = 1”中的字符串“ignore”和“1 = 1”内检测到“或”。当我的服务器检测到字符串“或1 = 1”内的任何位置时,它会将此识别为可能的SQL注入攻击并将请求杀死到服务器。

这就是为什么“测试请忽略5105 = 33 5128 = 12 5325 = 19 6790 = 8 6791 = 4 6792 = 8 7125 = 20 7141 = 2”会起作用,因为它不再找到“或1 = 1”。

这个小问题花了我很多时间......