|
|
|
| Здравствуйте.
Подскажите, пожалуйста, что такое "sql-инъекция" и как с ней бороться?? Встречаю не 1-й раз, но что это такое - не знаю. Жалуются, что вредоносные коды встраиваются в картинки... Как этого можно избежать?
С уважением,
Ярослав. | |
|
|
|
|
|
|
|
для: Jaroslav
(16.08.2008 в 14:40)
| | В интернете очень много информации об SQL-инъекциях и способах защиты о них:
http://ru.wikipedia.org/wiki/Инъекция_SQL | |
|
|
|
|
|
|
|
для: SportSoft
(16.08.2008 в 14:57)
| | Хорошая статья, от меня отдельное спасибо.
Можно, как нубу, спросить, есть ведь принципы построения SQL инъекций, наверное в определенных случаях должна срабатывать "универсальная" защита, наподобие этой (только принципов я не знаю):
<?
if(preg_match("/все, что опасно/i",$prov)){
header ("Location: go.nax")
}else{
echo "Добро пожаловать.";
}
|
| |
|
|
|
|
|
|
|
для: Николай2357
(16.08.2008 в 19:08)
| | Николай2357, пока на Вас не накинулись с дубинками, я Вам скажу, что "принципы построения SQL инъекций" основаны на уязвимостях. Нужно правильно обрабатывать данные, а не что-то проверять. Не будет уязвимости - не будет проблем.
Правила построения SQL-запросов очень простые:
0) Все строки перед обрамлением в кавычки/апострофы нужно обрабатывать функцией mysql_escape_string():
<?php
$string = "Любая строка '\\\0\r\n";
$query = "SELECT ... WHERE `string` = '" . mysql_escape_string($string) . "';";
?>
|
1) Все числа приводить к integer/float:
<?php
$num1 = isset($_GET['num1']) ? (int) $_GET['num1'] : 0;
$num2 = isset($_GET['num1']) ? (float) $_GET['num1'] : 0;
$query = "SELECT ... WHERE `num1` = {$num1} AND `num2` = {$num2};";
?>
|
2) Не позволять пользователю самому формировать части SQL-запроса вида
<?php
$query = "SELECT ... " . $_GET['something'];
?>
|
И всё!
P.S. Иногда, заметил, советуют решить вот эту задачу: http://softtime.ru/info/task.php?id_article=110
Вам тоже настоятельно рекомендую. После правильного и самостоятельного решения будет намного меньше подобных вопросов. | |
|
|
|
|
|
|
|
для: BinLaden
(16.08.2008 в 19:26)
| | Вот это да! Зачем читать учебники, долго и муторно, когда можно получить такой сногсшибательный ответ на форуме! (шутка конечно, читать буду, но тут гораздо продуктивней!)
Спасибо огромное, что делитесь опытом, Родина Вас не забудет!
Спасибо. | |
|
|
|
|
|
|
|
для: Николай2357
(16.08.2008 в 19:43)
| | Я вот только боюсь, что разобраться всё равно Вы не захотите. | |
|
|
|
|
|
|
|
для: BinLaden
(16.08.2008 в 19:49)
| | Это зря. | |
|
|
|
|
|
|
|
для: Николай2357
(16.08.2008 в 19:52)
| | Я тоже так думаю. | |
|
|
|
|
|
|
|
для: BinLaden
(16.08.2008 в 20:57)
| | Родина Вам не забудет :) | |
|
|
|
|
|
|
|
для: BinLaden
(16.08.2008 в 19:49)
| | Здравствуйте.
Пока тема не ушла в небытие, осмелюсь попросить совета.
Вот у меня много страниц, на которых много запросов в бд. Оправдано ли такое решение:
я хочу отдельным файлом сделать следующее
<?
function esc_str($string){
if (get_magic_quotes_gpc()) $string = stripslashes($string);
if (is_numeric($string)) {
$string=intval($string);
}else{
$string = mysql_real_escape_string($string);
}
return $string;
}
|
и обрабатывать поступающие данные этой функцией, подключая файл к нужным страницам. Или я опять намудрил?
И еще, чтоб не портить бумагу, что то не совсем я разобрался в сессиях. Вчера тестировал сайт на хостинге, потом отключил интернет, не закрывая страницу, и ушел спать. Сегодня был ос\чень удивлен, когда оказалось, что все переменные в сессии живы... Мне казалось, что сессия должна жить не больше 24 минут (где то прочитал)... Странно...
PS Не совсем понял про
>1) Все числа приводить к integer/float:
можно чуть подробнее, в комментариях к задаче, рекомендованной Вами, я такого не нашел.
Спасибо. | |
|
|
|
|
|
|
|
для: Николай2357
(19.08.2008 в 10:31)
| | Мне is_numeric() не очень нравится - если число будет в строковом представлении - оно не будет обработано при помощи функции intval(). | |
|
|
|
|
|
|
|
для: cheops
(19.08.2008 в 11:48)
| | Подскажите, а числовой строкой тоже можно навредить в запросе? | |
|
|
|
|
|
|
|
для: Николай2357
(19.08.2008 в 12:36)
| | Да здесь имеется ввиду, что не числом вы можете навредить, а тем ,что заместо числа, может подставиться кусок SQL-запроса. | |
|
|
|
|
|
|
|
для: Николай2357
(19.08.2008 в 10:31)
| | Можете попробовать применить Вашу функцию в решении 21-й задачи.
Всё же самому убедиться в чем-то - проще, чем разводить очередной флейм. | |
|
|
|
|
|
|
|
для: Trianon
(19.08.2008 в 12:58)
| | Прошу конечно прощенья, для Вас это наверное флейм и хиханьки, но как же я узнаю, правильно ли я решаю эту задачу, если не буду спрашивать?
Вы думаете я сижу, ножки свесил, и жду, когда мне на блюдечке супер решение выложат?
Просто по своей природной глупости и малоопытности многого не понимаю. Допустим, я "тестировал" свою функцию и пока не пойму, как можно "протащить" через нее вредный кусок запроса. Я ведь не знаю, какими они бывают. Служебные символы она экранирует, имя "I don't know" при обработке на выходе stripslashes() отображается корректно, что еще не так, пока не знаю, по этому и прошу совета. Вот можете мне показать маленький примерчик, как можно тут навредить?
PS Задача стоящая, полезная, но кто ответ оценит, конкурс то давно тютю... | |
|
|
|
|
|
|
|
для: Николай2357
(19.08.2008 в 13:55)
| | > но как же я узнаю, правильно ли я решаю эту задачу, если не буду спрашивать?
Тестировать свой скрипт. Конкретно - скрипт с авторизацией в 21-ой задаче. А не одну единственную функцию.
> Задача стоящая, полезная, но кто ответ оценит, конкурс то давно тютю...
Если Вы за это волнуетесь, то не стоит - по крайней мере я могу. Выложите, как будет готово в соответствующем разделе. | |
|
|
|
|
|
|
|
для: BinLaden
(19.08.2008 в 14:11)
| | Спасибо, я так и сделаю. | |
|
|
|
|
|
|
|
для: Николай2357
(19.08.2008 в 13:55)
| | 1. Не беспокойтесь, проверить решение поможем.
2. поймите, важно не только зарезать вредноносное обращение.
Важно еще и не испортить данные, которые были введены.
примеров (маленьких и не очень) в обсуждениях к решениям было достаточно.
Специально для Вашего случая приведу еще один.
Регистрируется некий Джеймс Бонд под ником 007. Что Ваша функция с ним сделает? | |
|
|
|
|
|
|
|
для: Trianon
(19.08.2008 в 14:42)
| | Точно.
Ну все, не отвлекайте меня, я задачей увлекся.
(Шутка, спасибо, обязательно ее решу.) | |
|
|
|