当张贴包含文本“”的数据时;或#“||";以及#“;从AJAX$REQUEST到PHP;错误403禁止;


When posting data containing the text "or #"|| "and #" to PHP from AJAX $_REQUEST Blows up with "Error 403 Forbidden"

我有一个解决这个问题的方法,但我一生都无法确定这个问题是在我的AJAX或PHP代码中,还是我只是缺少了一些东西。我已经包含了创建RSSXML提要文档的源代码。我首先创建一个Object数组来存储将提供给AJAX的键控数据,然后调用创建提要文档的PHP脚本。可以完美地处理以下奇怪的布尔运算符单词异常。1.如果任何键控数据包含单词"或",后跟空格和任意数字,则PHP脚本在尝试访问$_REQUEST或$_POST变量时会出现错误403。2.如果任何键控数据包含单词"and",后跟空格和任意数字,则当试图访问$_REQUEST或$_POST变量时,PHP脚本会出现错误403。这是我的代码:ajax_or_php_bug_main.php

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Ajax or PHP Bug</title>
<!--<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>-->
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script type="text/javascript" src="ajax_or_php_bug.js"></script>
</head>
<body>
<div class="center_form">
<form class="rss_form" method="post">
<label class="disp">Title: </label><input class="rss_channel_title" type="text" value="" placeholder="Enter a title for this feed" /><br/>
<label class="disp">Subtitle: </label><input class="rss_channel_subtitle" type="text" value="" placeholder="Enter a subtitle for this feed" /><br/>
<label class="disp">Item Description Lines: </label><textarea class="rss_item_text"></textarea><br/>
<input class="save_button" type="button" value="Save RSS Feed" />
</form>
</div>
</body>
</html>

ajax_or_php_bug.js

$(function (){
var feedFilename = 'myfeed.xml';
$('.rss_channel_title').val('My Channel Title');
$('.rss_channel_subtitle').val('My Channel Subtitle');
$('.rss_item_text').val('or 9');
////////////////////////////////////////////////////////////
// SAVE RSS FEED
////////////////////////////////////////////////////////////
$(".save_button").on('click', function(){
var jsonData=createJSONArray();
$.ajax({
type: "POST",
url: "rss_save_feed.php",
data: {feedarray: jsonData},
/*data: "feedarray="+jsonData,*/
datatype: "json",
/*traditional: true,*/
success: function(feed_text){
alert('RETURNED FROM SAVE PHP: '+feed_text);
},
beforeSend:function()
{
}
});
return false;
});
////////////////////////////////////////////////////////////
// Create Array of Aruments
////////////////////////////////////////////////////////////
function createJSONArray() {
//alert('in createJSONArray');
var returnObj = new Object();
returnObj.filename = feedFilename;
returnObj.title = $('.rss_channel_title').val();
returnObj.subtitle = $('.rss_channel_subtitle').val();
items = $('.rss_item_text').val();
//items = items.replace(/or/g,"0987654321"); //UNCOMMENT FOR WORKAROUND
//items = items.replace(/and/g,"1234567890"); //UNCOMMENT FOR WORKAROUND
returnObj.items = items;
return returnObj;
}
});

rss_save_feed.php

<?php
if(!isset($_REQUEST)){
die('Too bad!');
}
//this next line blows with "Error 403 Forbidden" if data contains "or #"||"and #"
//it doesn't matter if the data is an array, xml or text being passed
//not sure if the problem is related to ajax or php???
$args = $_REQUEST['feedarray'];
if($args){
//Create the RSS Feed
$rss = '';
$rss .= '<?xml version="1.0" encoding="utf-8"?>';
$rss .= '<?xml-stylesheet type="text/xsl"?>';
$rss .= '<rss version="2.0">';
$rss .= '<channel>';
$rss .= '<title>' . $args[title] . '</title>';
$rss .= '<description>' . $args[subtitle] . '</description>';
$rss .= '<pubDate>' . date(DATE_RSS, strtotime("now")) . '</pubDate>';
$rss .= '<location>' . $args[location] . '</location>';
$items = $args[items];
//$items = str_replace("0987654321","or",$items); //UNCOMMENT FOR WORKAROUND
//$items = str_replace("1234567890","and",$items); //UNCOMMENT FOR WORKAROUND
$items = explode("'n",$items);
foreach($items as $item){
$rss .= '<item>';
$rss .= '<description>' . $item . '</description>';
$rss .= '<pubDate>' . date(DATE_RSS, strtotime("now")) . '</pubDate>';
$rss .= '</item>';
}
$rss .= '</channel>';
$rss .= '</rss>';
//file_put_contents($args[filename], $rss);
echo $rss;
}
?>

这很可能是web服务器上的某种安全模块/过滤器。你在用什么网络服务器?我在IIS中看到了类似的问题,我知道nginx有过滤器模块。所以只需查看web服务器日志即可。

在ajax_or_php_bug.js中替换

items = items.replace(/or/g,"0987654321"); 
items = items.replace(/and/g,"1234567890"); 

用这个

items = items.replace("/or/g","0987654321"); 
 items = items.replace("/and/g","1234567890");

我刚刚在HTTPME.com托管的网站上遇到了同样的问题。我想你不是在使用同一个网络主机吗?我刚刚向他们开出了一张罚单,要求他们将我的网站(或他们需要做的任何事情)列入白名单,因为我的PHP代码中已经有了删除用户可能试图注入的任何潜在危险逻辑的逻辑。几个月前,当我发现我不能再在任何网络表单中使用"退出"一词(或任何在较大单词中嵌入"退出"的单词)时,我不得不为同样的事情开罚单。当时,他们告诉我,这是由ModSecurity规则触发的。