На клиенте перед отправкой на сервер отсекаю практически всё за исключением русского, украинского и белорусского шрифтов. Делаю это в первую очередь чтобы пользователь сразу понимал, какие символы он ввести не может.
data = data.replace(/[^\w\n\" а-яА-ЯёЁA-Za-zÀ-ÿёа-зй-шы-яЁА-ЗЙ-ШЫІіЎўа-щА-ЩЬьЮюЯяЇїІіЄєҐґ'-,.:!?@«»]/ig, '');
Обработанные строки заносятся в объект и преобразуются в строку:
obj = JSON.stringify(obj);
С целью защиты от XSS проверяю данные на сервере, при этом строка не разбирается перед записью в БД, но проверяется целиком:
$obj = preg_replace("/[^\w\"\n а-яА-ЯёЁA-Za-zÀ-ÿёа-зй-шы-яЁА-ЗЙ-ШЫІіЎўа-щА-ЩЬьЮюЯяЇїІіЄєҐґ',-.!?@{{}}:«»]/iu", "", $obj) ;
Проблема: если на клиенте в тексте встречаются двойные кавычки, они экранируются обратным слешем при JSON.stringify(obj), а уже на сервере обратный слеш отрезается при preg_replace, после чего строку вновь преобразовать в объект при чтении уже нельзя.
Я вижу несколько вариантов решения:
\".Прошу совета, как лучше поступить в этой ситуации.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей