При публикации данных, содержащих текст «или #» || & quot; и # & quot; в PHP из AJAX $ _REQUEST Возникает с ошибкой & quot; Ошибка 403 запрещена & quot;

У меня есть обходной путь для этой проблемы, но я не могу на всю жизнь определить, есть ли проблема в моем коде AJAX или PHP или я просто что-то упустил.
Я включил исходный код, который создает документ RSS XML. Сначала я создаю массив Object для хранения ключевых данных, которые будут предоставлены в AJAX, а затем вызываю PHP-скрипт, который создает документ фида. Прекрасно работает со следующими странными исключениями из слов логического оператора.
1. Если какие-либо ключевые данные содержат слово «или», за которым следует пробел, за которым следует любое число, сценарий PHP срывается с ошибкой 403 при попытке доступа к переменным $ _REQUEST или $ _POST.
2. Если какие-либо ключевые данные содержат слово «и», за которым следует пробел, за которым следует любое число, тогда PHP-скрипт взрывается с ошибкой 403 при попытке доступа к переменным $ _REQUEST или $ _POST.
Вот мой код:
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;
}
?>

0

Решение

Скорее всего, это какой-то модуль безопасности / фильтр на вашем веб-сервере. Какой веб-сервер вы используете? Я видел похожие проблемы с IIS, и я знаю, что есть модуль фильтра для nginx. Так что просто проверьте логи веб-сервера.

0

Другие решения

В 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");
0

У меня точно такая же проблема произошла на моих сайтах, размещенных на HTTPME.com. Я не думаю, что вы используете тот же веб-хостинг? Я только что открыл для них билет с просьбой внести в белый список мои сайты (или все, что им нужно сделать), потому что в моем PHP-коде уже есть логика для удаления любой потенциально опасной логики, которую пользователь может попытаться внедрить. Мне пришлось открыть билет пару месяцев назад на то же самое, когда я обнаружил, что больше не могу использовать слово «выход» (или любые слова, в которые слово «выход» встроено в большее слово) в любая из моих веб-форм. В то время мне сказали, что это вызвано правилом ModSecurity.

0