Explay CMS - бесплатная система управления соц. сетями

zerkms

TDD infected
Команда форума
Т.о. включая квоты, мы автоматически переключаемся с mysql_real_escape_string() на addslahes(). Вот тут то точно будет инъекция, если проект перейдет на китайскую кодировку. И это не смотря, что мы следовали совету zerkms - "ставим mysql_real_escape_string и все будет автоматически безопасно"! Хрен вам, а не безопасность, нужно говолой думать.
ну и бред :) если квоты автоматом включены, то повторный mysql_real_escape_string поверх просто добавит повторно слеши. а безопасность не пострадает ни капли. ололо?

ps: магические кавычки нужно выключить отдельно (или убирать в начале скрипта) - но это уже другая опера.

-~{}~ 29.08.09 21:31:

С учетом тупизма с магикквоатами ты меня по прежнему подозреваешь в придиркам? .-)
всё остальное в норме. а конкретно этот пунктик - придирка ;-)
 

DiMA

php.spb.ru
Команда форума
Ты сам понял, что написал? Какой нах двойной addslashes+mysql_real_escape_string ???

Внимательно перечитай функцию и мой предыдущий пост:

PHP:
function safeSql ($s) { 
    if (!get_magic_quotes_gpc()) {
        if (is_string ($s)) { 
            $s = mysql_real_escape_string ((string) $s); 
            return $s; 
        } 
        elseif (is_array ($s)) { 
            foreach ($s as $key => $v) { 
                $s[$key] = mysql_real_escape_string ((string) $v); 
            } 
            return $s; 
        } else { 
            return $s;  
        } 
    } 
     
    return $s; 
}
 

vovanium

Новичок
Вставлю 5 копеек насчет mysql_real_escape_string, не так давно разбирался с этим вопросом.
1. Она нужна только для нескольких китайских кодировок двухбайтных, в которых одинарная кавычка может быть первым байтом символа. Для UTF8 она абсолютно не нужна, так как все спец. символы в этой кодировке также однобайтные.
2. mysql_real_escape_string вообще почти не имеет смысла использовать, т.к. эта функция не обращает внимание на SET NAMES, и будет работать с кодировкой которая установлена на сервере по умолчанию, а не кодировкой соединения. Нормально менять кодировку для этой функции можно только в mysqli.
3. mysql_real_escape_string медленнее mysql_escape_string процентов на 25-30.
4. хотя addslashes я бы тоже не советовал использовать, есть вполне прекрасная функция mysql_escape_string, которая быстрее работает, хотя и экранирует больше символов.
 

DiMA

php.spb.ru
Команда форума
vovanium

addslashes заменяет ровно 4 известных символа, известно на что

а досканально ли ты знаешь, что делает mysql_escape_string, давая советы? Что именно и на что она меняет? Конкретно, по каждому символу.
 

Фанат

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

vovanium

Новичок
DiMA
Да знаю, меняет вполне определенные 7 символов, ковырялся в исходниках и багрепорте mysql, когда выяснял зачем нужно mysql_real_escape_string.

Фaнат
В любом случае нужно четко знать как это работает. Ведь если к примеру на стандарном mysql сервере с кодировкой latin1 ты захочешь юзать китайскую кодировку GBK, то mysql_real_escape_string выдаст точно такую же ошибку как и mysql_escape_string или addslashes.
Зацитирую доку, чтобы не быть голословным
If you need to change the character set of the connection, you should use the mysql_set_character_set() function rather than executing a SET NAMES (or SET CHARACTER SET) statement. mysql_set_character_set() works like SET NAMES but also affects the character set used by mysql_real_escape_string(), which SET NAMES does not.
При этом функция mysql_set_character_set в php-модуле mysql не реализована, она есть только в mysqli.
 

fixxxer

К.О.
Партнер клуба
Еще можно добавить, что у mysql_*_escape_string есть то преимущество, что ее реализация в libmysqlclient, а не в php - соответственно, если ВНЕЗАПНО в Mysql 6.0 (скажем) добавится еще какой-то символ, который надо экранировать, или в зависимости от настроек изменятся правила экранирования, то все заработает само.

Высосано из пальца, конечно. :) Ну и еще sybase quotes меняют поведение addslashes, экзотика конечно но все же.

А вот побочный эффект с автоматическим установлением mysql_real_escape_string-ом дефолтного соединения с базой иногда может быть веселым. :) Как следствие, ее не получится использовать для подготовки отложенных запросов (например, когда sql-запросы пишутся в какой-нибудь memcacheq для последующего фонового исполнения).

-~{}~ 29.08.09 17:35:

>> При этом функция mysql_set_character_set в php-модуле mysql не реализована, она есть только в mysqli.

Щито?

fixxxer@cs2713 ~
$ php -r 'var_dump(function_exists("mysql_set_charset"));'
bool(true)
fixxxer@cs2713 ~
$ php -m | grep mysql
mysql
mysqlnd
 

zerkms

TDD infected
Команда форума
А вот побочный эффект с автоматическим установлением mysql_real_escape_string-ом дефолтного соединения с базой иногда может быть веселым.
ага????? жесть
 

fixxxer

К.О.
Партнер клуба
Ага ;)

$ php -r 'error_reporting(E_ALL);ini_set("display_errors",1);echo mysql_real_escape_string("123");'

Warning: mysql_real_escape_string(): Access denied for user ''@'localhost' (using password: NO) in Command line code on line 1

Warning: mysql_real_escape_string(): A link to the server could not be established in Command line code on line 1
 

vovanium

Новичок
fixxxer
Да, пардон добавили в 5.2.3, я немного раньше разбирался с вопросом :)
 

AmdY

Пью пиво
Команда форума
а разве mysql_real_escape_string не выдаёт ошибку типо E_SCTRICT если не передавать конекшин? а если передаётся конекшин, то по идее mysql_real_escape_string должно работать в кодировке в соответствии с указаным соединением. (хотя даже если это не так, то когда-нить доделают)
 

vovanium

Новичок
pilot911
Без разницы какое поле, так как всё это экранирование нужно на этапе парсинга запроса, и в случае с UTF-8 достаточно addslashes либо mysql_escape_query.
 

pilot911

Новичок
Автор оригинала: vovanium
pilot911
Без разницы какое поле, так как всё это экранирование нужно на этапе парсинга запроса, и в случае с UTF-8 достаточно addslashes либо mysql_escape_query.
ясно, спасибо

-~{}~ 30.08.09 03:51:

Автор оригинала: fixxxer
А зачем хранить текстовую информацию в BLOB?
не текстовую, конечно )
 

fixxxer

К.О.
Партнер клуба
Вот уж точно последний аргумент %)

Ты еще про двойные кавычки расскажи
 

tf

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

Smelo

Новичок
PHP:
<?
include_once "timer.class.php";

$str="sjakdj\"fsdf'dsfsdf'df\dsfsdf'dsdfsd\"fsdfsd";

/*
Timer::Run("main");
for($i=0;$i<10000;$i++){
    addslashes($str);
}
print Timer::End("main",null,"AddSlashes Time - {time}\r\n");
*/

mysql_connect("localhost","root","");
Timer::Run("main");
for($i=0;$i<10000;$i++){
    mysql_real_escape_string($str);
}
print Timer::End("main",null,"EscapeString Time - {time}\r\n");
?>

AddSlashes Time - 0.00989699363708
AddSlashes Time - 0.00966501235962
AddSlashes Time - 0.00951504707336
EscapeString Time - 0.0138909816742
EscapeString Time - 0.0130221843719
EscapeString Time - 0.0127539634705
 
Сверху