Безопасность регистрации

Anton63

Новичок
Безопасность регистрации

Пытаюсь, при регистрации из логина удалить посторонние символы таким образом:
$text = preg_replace ("/@|#|$|%|^|&|*|+|=|<|>|?|\/|;|{|}|[|]|~|"|'|/", "", $text);
Это нормально? smile.gif
И ещё, если я сделаю проверку гостевой книги(хранится в mysql) через mysql_real_escape_string это будет безопасно или ещё какие нибудь меры надо предпринять? В плане js, иньекций и т.п.
И если это будет безопасно... то как мне на выводе этих сообщений в браузер обрезать вставленные слэши. При помощи $text = preg_replace("/\/", "", $text);?
 

zerkms

TDD infected
Команда форума
зачем убирать что-то, если можно просто оставить только нужное?
или ещё лучше, дать пользователю самому исправиться и не трогать ЕГО ЛИЧНЫХ ДАННЫХ.
 

iceman

говнокодер
при регистрации можешь не вырезать, но при выводе имени пользователя на сайт, спецсимволы хтмл переводить нужно в их мнемоники...

в sql-запросах всегда экранируй переменные
 

Anton63

Новичок
Автор оригинала: iceman
при регистрации можешь не вырезать, но при выводе имени пользователя на сайт, спецсимволы хтмл переводить нужно в их мнемоники...

в sql-запросах всегда экранируй переменные
Так при регистрации как раз и будет sql запрос... сравнить же нужно с БД существующих пользователей...

Автор оригинала: zerkms
зачем убирать что-то, если можно просто оставить только нужное?
Так ненужное уберётся, а нужное останется...
 

zerkms

TDD infected
Команда форума
Так ненужное уберётся, а нужное останется...
если у тебя всё так чудесно - зачем ты задаёшь вопрос? :)
сравни свою регулярку и мою: [^a-z\d\-_]
м?
 

DiMA

php.spb.ru
Команда форума
если нужно удалить, то не сочинай боянов с @|#|$|%|^|&|*|+|=|<|>|?|\/|;|{|}|[|]|~|"|'|
делай так /[@#$%^ ... ]/

но лучше делать, как написано выше
 

Anton63

Новичок
Автор оригинала: zerkms
сравни свою регулярку и мою: [^a-z\d\-_]
Помогите разобрать что значит [^a-z\d\-_].
Вот, что я прогуглил:
&#710; - этот знак в шаблоне обозначает, чтобы в начале обязательно стояли следующие за ним символы.
\d - любой цифровой символ [0-9].
\- это, как я понял, просто символ "-".
_ - это наверное просто символ "_".
Как это всё расшифровать?
 

iceman

говнокодер
каждый символ строки не должен быть буквой либо цифрой либо тире либо "подчеркиванием"

-~{}~ 21.07.09 14:24:

в твоем случае, символы не удовлетворяющие этому условию - буду заменены на NULL

-~{}~ 21.07.09 14:26:

или так понятней будет: заменяем все символы кроме букв, цифр, тире, подчеркивание

в квадратных скобках идет перечисление, подробности в мануале +)
 

The employer

Новичок
Вообще-то менять пользовательские данные - моветон. Ты можешь не разрешить юзеру указать при регистрации имя, не соответствующее заданному алфавиту - но молча менять это имя и регистрировать искаженное... За такое надо бы канделябром :)

И в БД должно лежать ровно то, что захотел туда положить пользователь. Никаких инъекций, ни sql ни xss не будет - достаточно правильно экранировать данные при переходе из среды в среду. Из среды PHP в среду SQL - mysql_real_escape_string (быстро и грязно), или приличный слой доступа к данным, основанный на bindings (например, PDO). Из SQL в HTML - htmlspecialchars. Из SQL в JSON - addcslashes.
 

Anton63

Новичок
Мануал по preg_replace читал... не понял.
Зачем писать [^\w-_] почему бы просто не оставить [\w-_]?
Из среды PHP в среду SQL - mysql_real_escape_string (быстро и грязно)... а при выводе в браузер из SQL в PHP пользуемся оператором preg_replace() с маской "[\\]"?
 

zerkms

TDD infected
Команда форума
Anton63
потому что с моей регуляркой ты поверяешь - есть ли в строке запрещённые символы
и потом у тебя есть возможность предупредить пользователя, что что-то н етак.
и не надо ничего пользовательского менять без его спроса.
 

iceman

говнокодер
Anton63
читать про параметр magic_quotes_gps

-~{}~ 22.07.09 10:02:

Anton63
в базе текст храниться без слэшей, экранируют когда ты вставляешь эти даныне sql запрос
 

Anton63

Новичок
Про то что я хотел пользовательские данные менять я уже понял, что это подло.
zerkms , а можно пример вашей регулярки с предупреждением пользователя в работе?
Я думаю, что то типо того:

//получаем логин, который ввёл пользователь
$text = "\*vasia*/";
// проверяем полученные данные
if (preg_replace("[^\w-_]", "", $text)){
echo "Логин дожен содержать только символы a-z, A-Z, 0-9, - и _";}
else{
echo "Вы добавлены";}

Так? Если нет, то можно пример как должна проходить проверка...
 

Anton63

Новичок
if (preg_match("[^\w-_]", $text)){
echo "Логин дожен содержать только символы a-z, A-Z, 0-9, - и _";}
else{
echo "Вы добавлены";}
 
Сверху