[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Класс для борьбы с SQL
Diamorph
Всем привет! Вот класс как написано "для борьбы с SQL атаками". Писал не я. Просто хочу услышать мнение, мне оно кажется дырой, а не защитой, только в классах я ни бум-бум/ Могу ошибаться.
class InitVars
{
# Недопустимые слова в запросахINSERT
var $deny_words = array('UNION', 'CHAR', 'INSERT', 'DELETE', 'SELECT', 'UPDATE', 'GROUP', 'ORDER', 'BENCHMARK',
'union', 'char', 'insert', 'delete', 'select', 'update', 'group', 'order', 'benchmark');

function InitVars()
{
}

# Метод конвентирует суперглобальные массивы $_POST, $_GET в перемнные
# Например : $_GET['psw'] будет переобразовано в $psw с тем же значением

function convertArray2Vars()
{
foreach ($_GET as $_ind => $_val) {
global $$_ind;
if (is_array($$_ind))
$$_ind = htmlspecialchars(stripslashes($_val));
}

foreach ($_POST as $_ind => $_val) {
global $$_ind;
if (is_array($$_ind))
$$_ind = htmlspecialchars(stripslashes($_val));

}
}

# Метод проверяет $_GET и $_POST переменные на наличие опасных данных и SQL инъекций
function checkVars()
{
//Проверка опасных данных.
foreach ($_GET as $_ind => $_val) {
$_GET[$_ind] = htmlspecialchars(stripslashes($_val));

$exp = explode(" ", $_GET[$_ind]);
foreach ($exp as $ind => $val) {
if (in_array($val, $this->deny_words))
$this->antihack("Запрещено!Доступ закрыт!<br> Ваш ip адресс помечен!");
}
}

foreach ($_POST as $_ind => $_val) {
$_POST[$_ind] = htmlspecialchars(stripslashes($_val));

$exp = explode(" ", $_POST[$_ind]);
foreach ($exp as $ind => $val) {
if (in_array($val, $this->deny_words))
$this->antihack("Запрещено!Доступ закрыт!<br> Ваш ip адресс помечен!");
}
}

}

function antihack($msg)
{
echo '<font color="red"><b>Antihack error: </b></font>' . $msg . '<br>\n';
die;
}
}




Спустя 1 минута, 24 секунды (9.05.2012 - 23:11) sharki написал(а):
Diamorph
Используй PDO и будет тебе счастье smile.gif Если я не ошибаюсь, там вроде уже идет автоматическое экранирование...

Спустя 5 минут, 5 секунд (9.05.2012 - 23:16) Invis1ble написал(а):
Че только люди не придумают, лишь бы не пользоваться нативными средствами...
mysql_real_escape_string() чем не угодил?
класс - гавно

Спустя 23 минуты, 4 секунды (9.05.2012 - 23:39) killer8080 написал(а):
Не знание сути проблемы порождает параною smile.gif

Спустя 7 минут, 42 секунды (9.05.2012 - 23:47) Diamorph написал(а):
Цитата (killer8080 @ 9.05.2012 - 19:39)
Не знание сути проблемы порождает параною

ты о чем?

Спустя 8 минут, 19 секунд (9.05.2012 - 23:55) killer8080 написал(а):
Цитата (Diamorph @ 9.05.2012 - 22:47)
ты о чем?

О том что люди пишущие подобные классы не понимают сути SQLi, и вместо корректной обработки данных, начинают изобретать не нужные фильтры, польза от которых весьма сомнительна, точней сказать её практически нет, а вот неудобств они доставляют море. Кто сказал что юзер не имеет право запостить слово JOIN или INSERT?
Достаточно просто обрабатывать строковые данные mysql_real_escape_string() (в случае с mysql), а числовые значения приводить к типу. Всё! Больше ничего делать не нужно, а подобные уродства нужно выкинуть на помойку.

Спустя 13 часов, 6 минут, 59 секунд (10.05.2012 - 13:02) Diamorph написал(а):
sharki, Invis1ble, killer8080, спасибо за комментарии

Спустя 14 минут, 9 секунд (10.05.2012 - 13:16) glock18 написал(а):
Скажите, вашего сына, правда, зовут Robert'; DROP TABLE students; ? ©

Тут уже все сказали по поводу бесполезности класса, помимо того, что пользователям зачем-то запрещает вводить самые обычные слова, дак еще до кучи не все фильтрует. Бросьте этот класс и используйте лучше mysql_real_escape_string - самое простое и понятное по началу будет.

Цитата (sharki @ 9.05.2012 - 19:11)
Используй PDO и будет тебе счастье  Если я не ошибаюсь, там вроде уже идет автоматическое экранирование...

ошибаетесь, PDO ничего не экранирует автоматически. святая вера в это может похуже быть, чем класс в этом топике smile.gif коли речь о подготовленных запросах, то это совсем отдельная песня

Спустя 2 часа, 50 минут, 23 секунды (10.05.2012 - 16:06) Diamorph написал(а):
glock18, спасибо. я уже такой вывод и сделал, а со временем увидим smile.gif

Спустя 6 минут, 53 секунды (10.05.2012 - 16:13) Игорь_Vasinsky написал(а):
Цитата
  var $deny_words = array('UNION', 'CHAR', 'INSERT', 'DELETE', 'SELECT', 'UPDATE', 'GROUP', 'ORDER', 'BENCHMARK',
                            'union', 'char', 'insert', 'delete', 'select', 'update', 'group', 'order', 'benchmark');


эх... а мне эти слова транскрипцией заменять? biggrin.gif

Спустя 1 час, 49 минут, 38 секунд (10.05.2012 - 18:03) twin написал(а):
Название темы символично smile.gif
Такие велосипеды предназначены именно для борьбы с SQL, ибо режут его возможности прямо на корню.

Спустя 10 минут, 1 секунда (10.05.2012 - 18:13) inpost написал(а):
Diamorph
Очень просто:
INSERT INTO `test` SET
`num` = (
SELECT `id`
FROM `designers`
WHERE `name` = 'Алёна'
LIMIT 1
)


Теперь вопрос, почему при INSERT нельзя использовать SELECT по этому кривому скрипту?

Спустя 22 часа, 33 минуты, 37 секунд (11.05.2012 - 16:47) Diamorph написал(а):
Если честно, то вообще не понимаю зачем использовать INSERT...SELECT. Мне просто не приходилось с таким ещё работать. Почитал про этого оператора и всё равно нифига не понял зачем он нужен...

Спустя 18 минут, 23 секунды (11.05.2012 - 17:05) Invis1ble написал(а):
Если не понимаешь - то в SQL-инъекции тебе точно рано лезть

Спустя 6 минут, 30 секунд (11.05.2012 - 17:11) killer8080 написал(а):
Я не знаю что имел ввиду Инпост, сейчас повнимательней глянул на исходник, это полный ппц.
Во первых он не от чего не защищает, кроме как некорректно завершает работу через die из ввода безобидных слов.
Во вторых вот это метод
Цитата (Diamorph @ 9.05.2012 - 22:09)
# Метод конвентирует суперглобальные массивы $_POST, $_GET в перемнные
# Например : $_GET['psw'] будет переобразовано в $psw с тем же значением
function convertArray2Vars()
{
foreach ($_GET as $_ind => $_val) {
global $$_ind;
if (is_array($$_ind))
$$_ind = htmlspecialchars(stripslashes($_val));
}

foreach ($_POST as $_ind => $_val) {
global $$_ind;
if (is_array($$_ind))
$$_ind = htmlspecialchars(stripslashes($_val));

}
}

просто убивает наповал. Мало того что тут элементарное не знание мат части (extract), так еще и открывается потенциальная уязвимость, сводя действие директивы register globals off на нет.

Спустя 5 минут, 35 секунд (11.05.2012 - 17:17) inpost написал(а):
killer8080
# Недопустимые слова в запросах INSERT.

Diamorph
Зачем лезть в безопасность, когда не знаешь, как делать запросы сами по себе, без всякой темы безопасности? Изучи пока MySQL.

Спустя 20 минут, 54 секунды (11.05.2012 - 17:38) killer8080 написал(а):
Цитата (inpost @ 11.05.2012 - 16:17)
killer8080
# Недопустимые слова в запросах INSERT.

Ну я так понимаю в $_POST придет только имя "Алёна", сам SQL запрос через $_POST никто же передавать не будет smile.gif

Спустя 1 минута, 59 секунд (11.05.2012 - 17:40) Diamorph написал(а):
Цитата (Invis1ble @ 11.05.2012 - 13:05)
Если не понимаешь - то в SQL-инъекции тебе точно рано лезть


Цитата (inpost @ 11.05.2012 - 13:17)
Зачем лезть в безопасность, когда не знаешь, как делать запросы сами по себе, без всякой темы безопасности? Изучи пока MySQL.


Я не понимаю оператор, а не всё. Не видел я его использования раньше нигде!

А что, лучше писать код с уязвимостями, мол сначала научусь коряво делать, а дальше как бог пошлёт? Я хочу учиться сразу правильно писать!

killer8080 расскажи пожалуйста, что означает $$

Спустя 2 минуты, 35 секунд (11.05.2012 - 17:43) killer8080 написал(а):
Цитата (Diamorph @ 11.05.2012 - 16:40)
killer8080 расскажи пожалуйста, что означает $$

лучше мануала я все равно не объясню smile.gif
http://php.net/manual/ru/language.variables.variable.php

Спустя 4 минуты, 53 секунды (11.05.2012 - 17:47) Invis1ble написал(а):
Diamorph
Ты прав, писать нужно сразу правильно.
Тебе просто нужно разобраться с основами SQL, а в эти основы как раз и входит понятие "обратные кавычки" и с чем их едят. Просто ты немного не с той стороны зашел, ИМХО. Разберись с этим вне контекста php сначала.

Спустя 7 минут, 41 секунда (11.05.2012 - 17:55) Diamorph написал(а):
Переменная переменной берет значение переменной и рассматривает его как имя переменной...
Опять же не понял зачем такое использовать??

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

Спустя 28 минут (11.05.2012 - 18:23) inpost написал(а):
Diamorph
Сначала учишься писать запросы, потом пару функций для безопасности smile.gif

Спустя 1 час, 40 минут, 34 секунды (11.05.2012 - 20:04) killer8080 написал(а):
Цитата (Diamorph @ 11.05.2012 - 16:55)
Переменная переменной берет значение переменной и рассматривает его как имя переменной...
Опять же не понял зачем такое использовать??

В том классе оно используется для рапаковки входного массива в глобальную символьную таблицу. Это значит к примеру, что из переменной $_GET['var1'] создается переменная $var1 в глобальной области видимости. Делать такое ни в коем случае нельзя!!! Это грозит уязвимостью в скриптах. Хакер сможет через эту дыру переопределить любую переменную в скрипте. Это даже опасней чем register_globals on, потому что последний может быть опасен только при некорректной инициализации переменных, а эта дыра может переопределять даже объявленные переменные (если они были инициализированы до вызова этого дырявого метода).
Цитата (Diamorph @ 11.05.2012 - 16:55)
Кстати буду очень признателен если есть у вас ссылочка на справочник по операторам, на доступном языке (от новичков-новичкам) или сайт от новичков к новичкам, а то не понимаю я мануала. Заумно всё.

Не советую учиться по таким статьям. Мануал это первоисточник, и ориентироваться нужно на него, а обучения по статьям "от новичков к новичкам", значит принимать их ошибочные суждения за истину.



Спустя 4 минуты, 22 секунды killer8080 написал(а):
Diamorph
собственно вам не мешало бы зайти на irbis-team для начала, там вроде все доступно расписано.
http://irbis-team.com/

Спустя 18 часов, 35 минут, 25 секунд (12.05.2012 - 14:39) Diamorph написал(а):
killer8080
Спасибо большое за объяснение и за ссылку.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.