LINUX.ORG.RU

Вроде верно, но есть риск где-нибудь забыть применить mysql_escape_string. Потому лучше взять PDO и заюзать prepared statements. А еще лучше полновесную ORM сразу взять.

random_user_123816235182 ()

PDO::prepare, PDO::execure
на этом языке не пишу, но prepare statement есть гуд. :)

aol ★★★★★ ()
Ответ на: комментарий от aol

*execute, конечно же.
ну, мы тут уже хором советуем ;)

aol ★★★★★ ()

По мне, так лучше отдельно обработать переменную myvar, убедиться в том, что её тип и содержание соответствуют ожиданиям, а уже потом осуществить конкатенацию строк запроса.
Ну а так вроде норм.

Terrens ()
Ответ на: комментарий от Terrens

а уже потом осуществить конкатенацию

А еще лучше выпороть, за конкатенацию в выражении where

no-dashi ★★★★★ ()

А чё в mysql нет процедур или типа того? Как в оракле, например, функция или процедура с уже готовой командой sql и никаких проблем нету с никакими инъекциями.

anonymous ()
Ответ на: комментарий от anonymous

Как в оракле, например, функция или процедура

Хранимки головного мозга?

baverman ★★★ ()
Ответ на: комментарий от random_user_123816235182

> еще лучше полновесную ORM сразу взять.

шоб тормазилло и невякало1, это очень Ъ

visual_pipe ()
Ответ на: комментарий от visual_pipe

>шоб тормазилло и невякало1, это очень Ъ

1. Есть вагон PHP opcode кэшеров (самый нормальный из них APC, ИМХО), которые ускорят исполнение кода в разы; 2. Современные, нормальные ORM опять-таки умеют кэшировать все неплохо (мета-информацию о таблицах, сами данные и пр.).

random_user_123816235182 ()

Функция mysql_escape_string() устарела с версии 4.30, начиная с версии 5.3.0 выдает сообщение E_DEPRECATED, используйте mysql_real_escape_string(). Можно еще избавиться от конкатенации при построении запроса, например так:

$query = sprintf("DELETE FROM db WHERE name='%s'", mysql_real_escape_string($_GET['myvar']));

RR ()
Ответ на: комментарий от RR
$myvar = $_GET['myvar'];
settype($myvar, 'string');
$query = sprintf("DELETE FROM db WHERE name='%s'",
                 mysql_real_escape_string($myvar));
RR ()
Ответ на: комментарий от RR

OMG. мускул_экранировать_строку заменили на мускул_реально_экранировать_строку. Видимо до этого было не очень реально.

AlexKiriukha ★★★★ ()

Да тут конкурс на самый Ъ-способ сделать простую вещь! Я предлагаю так: сразу брать orm, лучше использовать Doctrine. А чтоб ей не было скучно, ее надо прикрутить в фреймворку. Зендовый пойдет. Конечно, под все это понадобится выделенный сервер, зато параметры запроса будут надежно экранированы.

heisenberg ★★ ()
Ответ на: комментарий от RR

>Можно еще избавиться от конкатенации при построении запроса, например так:

facepalm.php

И в чем сакральная суть замены явной конкатенации на неявную? Небольшое улучшение читаемости?
Если уж есть желание сделать правильно, то делать нормальные параметризованные запросы, пхп с мускулем их умеют.

И почему до сих пор никто не вспомнил про злобные magic_quotes ?

nu11 ★★★★★ ()
Ответ на: комментарий от visual_pipe

>> еще лучше полновесную ORM сразу взять.

шоб тормазилло и невякало1, это очень Ъ

код не профилируй @ сразу оптимизируй!

Где вас таких учат?

anonymous ()

если тебе это _действительно_ важно, лучше бери орм

а если нет, то какая разница как писать, лишь бы работало )))

stevejobs ★★★☆☆ ()
Ответ на: комментарий от nu11

> И почему до сих пор никто не вспомнил про злобные magic_quotes

потому что они deprecated? =)

stevejobs ★★★☆☆ ()
Ответ на: комментарий от nu11

nu11 (01.06.2011 22:09:21)> И почему до сих пор никто не вспомнил про злобные magic_quotes ?

stevejobs (01.06.2011 22:51:01)> потому что они deprecated? =)

или потомучто люди сёравно напрямую не извлекают $_GET и $_POST

...а всегда используют чтото типа

function stripslashes_if_gpc($str) {
    if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
        $str = stripslashes($str);
    }
    
    return $str;
}

function get_post($arg) {
    if(!array_key_exists($arg, $_POST)) {
        return NULL;
    }
    
    $value = stripslashes_if_gpc($_POST[$arg]);
    
    return $value;
}

стартер темы — просто образно написал $_GET .. я думаю :-)

user_id_68054 ★★★★★ ()

во втором запросе (там где LIKE) — кроме экранирования самого запроса (mysql_real_escape_string()) — нужно ещё и не забыть заэкранировать '%' через str_replace()

это не угрожает Инъекцией, но гарантирует корректность работы :-)

user_id_68054 ★★★★★ ()
Ответ на: комментарий от Deleted

Это да, но сейчас может начаться «у меня в моём фреймворке это решено». Против php даже рубисты с питонерами вместе.

AlexKiriukha ★★★★ ()

Жуть, что только не сделают, лишь бы Prepare не использовать.

AlexVR ★★★★★ ()
Ответ на: комментарий от stevejobs

>потому что они deprecated? =)

всего лишь с 5.3.0, что не мешает их использовать. У многих еще 5.2

nu11 ★★★★★ ()
Ответ на: комментарий от user_id_68054

>или потомучто люди сёравно напрямую не извлекают $_GET и $_POST

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

nu11 ★★★★★ ()
Ответ на: комментарий от Deleted

Ога, а разрабы мускуля проектируют апи только под пхп =)

RR ()

я бы советывал делать так

$var=(isset($_GET['some']))?mysql_escape_string($_GET['some'):'default value';
$query="WTF tablename QWE a=$var";

visual_pipe ()
Ответ на: комментарий от visual_pipe

ну и зря... :-) :

зря ты разбил одно логическое выражение на ДВЕ комманды

темболее если взять имя переменной типа $var (а не чтото типа $var_only_for_sql)

...то после если этих комманд если-захочется сделать чтото ещё с переменной, то СЛУЧАЙНО можно будет заиспользоввать УЖЕ заэкранированную переменную ($var) думая будтобы это просто обычное(оригинальное) значение параметра

в результате на сайте будет изредка проскальзывать всякие <\\> и <\«> ...

а всё потомучто было лень писать:

$query=sprintf(
    "WTF tablename QWE a='%s'",
    mysql_real_escape_string(get_post_or_default('some', 'default value'))
);

-- именно В ОДНОЙ СТРОЧКЕ :-D

user_id_68054 ★★★★★ ()
Ответ на: комментарий от user_id_68054

> — именно В ОДНОЙ СТРОЧКЕ :-D

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

visual_pipe ()

я в лохматые годы делал addslashes... видать нычне уже не модно...

Pinkbyte ★★★★★ ()
Ответ на: комментарий от RR

Ооо, спасибо. Оказывается это мускуловцы добавляют «реальности».

AlexKiriukha ★★★★ ()
Ответ на: комментарий от no-dashi

>А еще лучше выпороть, за конкатенацию в выражении where
Это чем-то опасно или вы за абсолютную читабельность?

Deleted ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.