Я бы хотел перенести всю обработку и очистку пользовательского ввода в одно центральное место
Да, как это мило. Это не может быть сделано. Это не так, как работает обработка текста.
Если вы вставляете текст из одного контекста в другой, вам нужно использовать правильные escape-символы. (mysql_real_escape_string для строковых литералов MySQL, htmlspecialchars для содержимого HTML, urlencode для параметров URL, другие для определенных контекстов). В начале вашего сценария, когда вы фильтруете, вы не знаете, где закончится ваш ввод, поэтому вы не знаете, как его избежать.
Возможно, одна входная строка поступает как в базу данных (требуется экранирование SQL), так и непосредственно на страницу (требуется экранирование HTML). Там нет ни одного побега, который охватывает оба этих случая. Вы можете использовать оба выхода один за другим, но тогда значение в HTML будет иметь странные обратные слеши, и копия в базе данных будет заполнена амперсандами. Несколько раундов этого неправильного кодирования, и вы получаете ситуацию, когда каждый раз, когда вы редактируете что-то, появляются длинные строки \\\\\\\\\\\\\\\\\\\\
и &
.
Единственный способ безопасно выполнить фильтрацию за один раз во время запуска - это полностью удалить все символы, которые необходимо экранировать в любом из контекстов, в которых вы собираетесь их использовать. Но это означает отсутствие апострофов или обратных косых черт в вашем HTML, отсутствие амперсандов или менее чем в вашей базе данных, и, вероятно, должна быть добавлена целая масса других недопустимых знаков препинания URL. Для простого сайта, который не принимает произвольный текст, вам может это сойти с рук. Но обычно нет.
Так что вы можете сбежать на лету, только когда один тип текста переходит в другой. Наилучшая стратегия, позволяющая избежать этой проблемы, - избегать объединения текста в другие контексты настолько, насколько это возможно, например, с помощью параметризованных запросов вместо построения строк SQL и определения либо функции echo(htmlspecialchars())
с хорошим коротким именем для сделать его менее трудным для ввода или использования альтернативной системы шаблонов, которая по умолчанию экранирует HTML.