PDA

Просмотр полной версии : Простите за нубский вопрос про рег.выражения


EST a1ien
02.11.2006, 13:19
Ещё раз прошу прощения за тупой вопрос, но незнаю как реализовать.

Нужно проверять введенные данные пользователя чтобы защетится от SQL-inj
Говорю сразу addslashes не предлогать.
Так-как по непняной пречине на MSSQL работает очень криво.

Подскажите способ как защетится но при учете того что пользователь должен использовать спец символы.


==================
Вобщнм принемаю любые варианты решения

PS: Язык php.

Ладно тогда предложите хороший метод защиты от SQL-inj

hidden
02.11.2006, 18:58
$txt="Текст Текст Text Text";
$txt=str_replace(array('%','+'),array('\\x',' '),urlencode($txt));
echo $txt;

EST a1ien
02.11.2006, 19:58
Не к сожалению не катит так-как к примеру есть пользователь >l<izn-
Он захочет посмотреть инфу о себе введет свой логин он обработается и вот что получится
select * from memb WHERE Name='\x3El\x3Cizn-';
И такой запрос вернёт не точто надо.

Но всёравно спс. за идею у кого ещё есть какиенибудь идеи

hidden
02.11.2006, 20:12
Ну тогда кодируй всё в base64_encode

EST a1ien
02.11.2006, 20:32
Ну закодирую и что дальше делать с закодированой строкой?

hidden
02.11.2006, 21:08
Ну закодирую и что дальше делать с закодированой строкой?Ну а потом раскодируешь.

А ещё строки в SQL можно в HEX кодировать, тапа того
select * from memb WHERE Name=0x3E6C3C697A6E2D;
$txt=">l<izn-";

$ret='0x';
$hex='0123456789ABCDEF';
for($x=0;$x<strlen($txt);$x++){
$ret.=$hex{ord($txt{$x})>>4}.$hex{ord($txt{$x})&15};
}

echo $ret;

ShAnKaR
02.11.2006, 22:28
я не понял - экранировать спецсимволы нельзя? или именно addslashes нельзя?

nc.STRIEM
02.11.2006, 23:21
Перед сохранением данных в базе кодируй их например при помощи urlencode() ! тоесть пользователя >l<izn- сохраняй в базе как %3El%3Cizn- ивсе!!!
а при выводе данных обратно раскодируй их! надеюсь понял идею...

nerezus
02.11.2006, 23:53
Определить спецсимволы и заэкранировать слешами.

EST a1ien
03.11.2006, 21:48
я не понял - экранировать спецсимволы нельзя? или именно addslashes нельзя?
Нет просто MSSQL както криво работает спри этом тоесть вот такой запрос вызывает ошибку в MSSQL

select * from memb WHERE Name='test\'';

Server: Msg 105, Level 15, State 1, Line 1
Unclosed quotation mark before the character string 'test\';
'.
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near 'test\';
'.


Перед сохранением данных в базе кодируй их например при помощи urlencode() ! тоесть пользователя >l<izn- сохраняй в базе как %3El%3Cizn- ивсе!!!
а при выводе данных обратно раскодируй их! надеюсь понял идею...

Понял но некатит так-как это база одной онлайн игры и я немогу редактировать то как данные хранятся в базе потомучто допустим пользователь зарегался с ником >l<izn- в базе он сохранился как %3El%3Cizn- и поэтому пользователю предётся вводить %3El%3Cizn- чтобы войти в игру.

Ладно тогда так каие символы надо фильтровать для защиты понятно что " ' + какие ещё?

nc.STRIEM
03.11.2006, 21:55
о допустим пользователь зарегался с ником >l<izn- в базе он сохранился как %3El%3Cizn- и поэтому пользователю предётся вводить %3El%3Cizn- чтобы войти в игру.

НЕ прийдеться! все данные которыйе он вводит, опять кодируй, и ищи в базе уже закодированные! а перед выводом раскодируй!

короч суть така примерно!
пользовательские данные -> кодируем их -> выполняем различные операции че надо, с базой работаем и.т.д -> раскодируем -> выводим пользователю!
В базе все в закодированном виде храниться!

EST a1ien
03.11.2006, 22:40
Нельзя кодировать данные так-как с базой работает нетолько сайт а ещё игра и вот она данные не будет декодировать(и исправить это я немогу).

ЗЫ надо защетить сайт. Какие символы надо фильтровать????

hidden
03.11.2006, 23:03
Ну а вариант с HEX'ом чем не устраивает, MySql и MSSql понимают его как текст, так что он будет храница в текстовом виде.

EST a1ien
03.11.2006, 23:28
Ну а вариант с HEX'ом чем не устраивает, MySql и MSSql понимают его как текст, так что он будет храница в текстовом виде.

Ксожалению он тоже непотходит по двум причинам первая(правда не очень значительная) в базе имя чара хранится как nvarchar(50) и менять это не желательно дак вот этот тип не потдерживает HEX и вторая причина это нельзя работать с HEX'om при запросе с like.