我有一个表单,其中包含用户输入数据的文本区域,然后通过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¬ificationcounter=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()
个字符的某些组合有关。
答案 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”。
这个小问题花了我很多时间......