Обработка переменной

Pavel_M

Новичок
Обработка переменной

Есть ли смысл делать так:

Код:
config.php
<?
//.....
$table= "table";
//.....
?>

index.php

<?
include("config.php");
//....
$query = "SELECT * FROM ".quote_smart($table);  //Думаю про quote_smart() все знают
//....
?>
Или же можно обойтись
Код:
$query = "SELECT * FROM ".$table;
Возможен ли подмен переменной $table какими-то иными способами для внедрения SQL-инъекции?
 

FractalizeR

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

Фанат

oncle terrible
Команда форума
нет, не знают. что это за функция, и что она делает, и как хотя бы теоретически можно её применить в данном случае?

-~{}~ 29.01.08 21:05:

FractalizeR
Ты иногда умный, но иногда просто поражаешь свой тупостью.

Во-первых, "эскапировать" перед вставкой в запрос надо всё, что подлежит экранированию. ВСЁ! БЕЗ. ИСКЛЮЧЕНИЙ.
И инъекции здесь не при чем.

Во-вторых, в данном случае "эскапировать", если я правильно понимаю, что имеется в виду под этим словом, НЕ нужно. А нужно совсем другое.
 

Pavel_M

Новичок
Взято с php.net
<?php
// Функция экранирования переменных
function quote_smart($value)
{
// если magic_quotes_gpc включена - используем stripslashes
if (get_magic_quotes_gpc()) {
$value = stripslashes($value);
}
// Если переменная - число, то экранировать её не нужно
// если нет - то окружем её кавычками, и экранируем
if (!is_numeric($value)) {
$value = "'" . mysql_real_escape_string($value) . "'";
}
return $value;
}
?>


To: Ф а н а т

Конкретно в моем случае, что "совсем другое" нужно сделать?
 

FractalizeR

Новичок
Автор оригинала: *****
Ты иногда умный, но иногда просто поражаешь свой тупостью.

Во-первых, "эскапировать" перед вставкой в запрос надо всё, что подлежит экранированию. ВСЁ! БЕЗ. ИСКЛЮЧЕНИЙ.
И инъекции здесь не при чем.
Что за ерунда-то? В коде человек сам присваивает имя таблице. Он не берет его из GET, POST или других внешних источников, он просто сам его жестко прописывает в коде. Какой смысл экранировать, если имя таблицы и так можно переменной присвоить так, чтобы дополнительное экранирование было не нужно?

Конечно, если имена таблиц сильно варьируются и вы просто можете забыть, что после изменения имени нужно будет экранировать, или (не дай бог) имя таблицы берется из внешнего источника - это другое дело.
 

Фанат

oncle terrible
Команда форума
Читай ссылку выше. И про таблицы, и про не таблицы.
 

zerkms

TDD infected
Команда форума
Что за ерунда-то? В коде человек сам присваивает имя таблице. Он не берет его из GET, POST или других внешних источников, он просто сам его жестко прописывает в коде. Какой смысл экранировать, если имя таблицы и так можно переменной присвоить так, чтобы дополнительное экранирование было не нужно?
значение переменной может использоваться не только в sql. Именно поэтому изначально данные должны быть описаны as is, а уже в конкретных случаях - приведены к нужному виду
 

Фанат

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

Я вот не понимаю. Голова у него работает - аж пар идет. Но иногда как включит тормоз, так все, туши свет.
 

FractalizeR

Новичок
Автор оригинала: zerkms
значение переменной может использоваться не только в sql. Именно поэтому изначально данные должны быть описаны as is, а уже в конкретных случаях - приведены к нужному виду
Вы правы, но ведь в этом случае человек спрашивает именно про SQL. Или нет? Кроме того, в его коде написано $table= "table";


а во-вторых, считает, что ответ на вопрос - прослешивать данные, или нет, зависит от того, откуда они пришли.
Может, я действительно торможу, но не понимаю, зачем прослешивать, если я точно знаю, что это не нужно?
Скажем, у меня в классе есть такие строчки:
function __construct() {
//Setting internal data
$this->_idFieldName = 'user_id';
$this->_tableName = 'fr_users';
И, разумеется, во всех запросах я просто подставляю $this->_tableName в SQL безо всяких mysql_real_escape_string, quote_smart и т.д.. Просто потому, что я точно знаю, что мое мышление никогда не станет настолько извращенным, чтобы включать в имя таблицы символы, требующие экранирования. Зарезервированные слова в идентификаторах я тоже не использую.
 

Фанат

oncle terrible
Команда форума
идиот. в имени таблицы нечего экранировать функциями mysql_real_escape_string, quote_smart и т.д.!
 

FractalizeR

Новичок
Спасибо за комплимент. Вы очень вежливы.
Ну так и из-за чего тогда дискуссия-то, если в имени таблицы нечего экранировать, человек спрашивал про то, нужно ли что-то экранировать в имени таблицы, а я сказал, что не нужно?
 

Фанат

oncle terrible
Команда форума
В имени таблицы есть, что экранировать. Только не этими функциями.

Этими же функциями экранировать надо любые данные, попадающие в запрос. А не только те, которые поступают от пользователя. И не рассуждать, ковыряя в носу - "эти данные экранировать будем, а те - не будем"
 
Сверху