Как обрабатывать пользовательский ввод со смесью HTML и знаков препинания? - PullRequest
1 голос
/ 09 февраля 2010

У меня есть поле формы, которое содержит смесь HTML и текста. Я хочу, чтобы пользователи могли использовать базовый HTML и знаки препинания.

В настоящее время я использую mysql_real_escape_string и preg_replace для очистки данных и их вставки в базу данных. Насколько я понимаю, preg_replace - лучший способ удалить любые символы, которые не входят в белый список разрешенных символов, и что mysql_real_escape_string защищает от внедрения SQL.

//How I collect and sanitise the data...
$var=mysql_real_escape_string(
 preg_replace("/[^A-Za-z0-9-?!$#@()\"'.:;\\@,_ =\/<> ]/",'',$_POST['var'])
);

Тем не менее, он продолжает работать, когда используется хэш-символ.

Мои вопросы:

1) Есть ли более эффективный способ сделать это?

2) Если это лучший способ, что я делаю не так?

Символы, которые мне нужно разрешить: все буквенно-цифровые символы и:

? ! @ # $% & () -. ,:; '"<> / + =

Спасибо!

Ответы [ 2 ]

4 голосов
/ 09 февраля 2010

Почему бы просто не использовать strip_tags () и ограничить его нужными тегами?

strip_tags ($str,"<br>")

Вы могли бы тогда сделать другую "очистку", которая не столь агрессивна.

2 голосов
/ 09 февраля 2010

Поскольку многие не алфавитно-цифровые символы имеют специальные значения в регулярном выражении, вам следует избегать их всех. Так

preg_replace("/[^A-Za-z0-9-?!$#@()\"'.:;\\@,_ =\/<> ]/",'',$_POST['var']) 

становится (есть несколько, которым, вероятно, не нужно убегать, но это не повредит)

preg_replace("/[^A-Za-z0-9-\?\!\$\#\@\(\)\"\'\.\:\;\\@\,\_ \=\/\<\> ]/",'',$_POST['var']) 
...