|
|
|
| Как защитить свои SQL Injection? | |
|
|
|
|
|
|
|
для: Arfey
(14.12.2008 в 16:01)
| | Чо? | |
|
|
|
|
|
|
|
для: Arfey
(14.12.2008 в 16:01)
| | Не очень понятно если честно... Вы хотите чтобы инъекции выполнялись или нет? Если не сложно опишите подробнее. | |
|
|
|
|
|
|
|
для: cheops
(14.12.2008 в 16:25)
| | просто часто слышу, что необходимо ставить защиту от SQL-инъекций. но как тогда самому получать данный из БД? | |
|
|
|
|
|
|
|
для: Arfey
(16.12.2008 в 22:22)
| | >что необходимо ставить защиту от SQL-инъекций.
Защита - это правильная обработка данных извне.
>но как тогда самому получать данный из БД?
также, как и всегда. | |
|
|
|
|
|
|
|
для: Arfey
(14.12.2008 в 16:01)
| | SQL-инъекция - просто так от нее не защититься. Необходимо всегда следить за SQL запросами, обрабатывать все переменые введеные пользователями, строго обрабатывать $_GET,$_POST переменые. Основная атака приходится через адрес строку для доступа к вашему сайту.
Например:
http://www.site.ru/article.php?id=10 - тут расположена статья с номером 10
Ваш SQL запрос к примеру:
$id = $_GET['id'];
$query = "SELECT * FROM `article` WHERE `id_art` = $id";
|
а теперь допустим злоумышленик вводит такой адрес:
http://www.site.ru/article.php?id=10//
то мы получим запрос:
$id = $_GET['id'];
$query = "SELECT * FROM `article` WHERE `id_art` = 10//";
и тут уже будет коментарий!
|
// Если вы не проверите эту переменную, то есть шанс на вашем сайте, выполнить инъекцию
if (!is_int($_GET['id']) {
echo "Попытка инъекции";
exit();
}
|
| |
|
|
|
|
|
|
|
для: tokmak
(17.12.2008 в 22:32)
| | > "SELECT * FROM `article` WHERE `id_art` = 10//"
> и тут уже будет коментарий!
Однострочные комментарии в SQL -- "--"
> if (!is_int($_GET['id']) {
Нельзя так проверять, так как $_GET['id'] никогда просто так не будет integer. Это может быть NULL, string или array. | |
|
|
|
|
|
|
|
для: BinLaden
(17.12.2008 в 22:41)
| | насчет комментария , перепутал извеняюсь /*
>> if (!is_int($_GET['id']) {
>Нельзя так проверять, так как $_GET['id'] никогда просто так не будет integer. Это может быть NULL, string или array.
BinLaden, Но согласитесь, лучше уж, хоть какая-та защита, чем вообще никакой. ;)
Ну можно и вот так (это для автора):
if (!preg_match("/[0-9]/i",$_GET['id'])) {
echo "ID параметр указан неверно!";
exit();
}
|
| |
|
|
|
|
|
|
|
для: tokmak
(17.12.2008 в 23:41)
| | >Ну можно и вот так (это для автора):
А не проще воспользоваться intval().
P.S. Да кстати, в вашем РВ зачем модификатор i ? :) | |
|
|
|
|
|
|
|
для: tokmak
(17.12.2008 в 23:41)
| | > Но согласитесь
Не соглашусь. Ваш код неверен и условие !is_int($_GET['id']) будет выполняться всегда. Для проверки того, что $_GET['id'] - набор цифр существует, например, ctype_digit().
> "/[0-9]/i"
Вы проверяете наличие хотя бы одной цифры. | |
|
|
|
|
|
|
|
для: BinLaden
(17.12.2008 в 23:46)
| | опа... прошу поправьте меня насчет preg_match. Как необходимо правильно проверить?
Сорри за оффтоп... | |
|
|
|
|
|
|
|
для: tokmak
(17.12.2008 в 23:57)
| | /^[0-9]+$/ или /^\d+$/ | |
|
|
|
|
|
|
|
для: BinLaden
(17.12.2008 в 23:58)
| | /^[0-9]+$/
?id=111d если ввести такое значение, то preg_match думает, что это все цифры :D
именно при таком значении id, а остальные работают норм.
Спасибо! Пригодится!
Блин, вот что значит пишут в статьях по безопастности кода! | |
|
|
|
|
|
|
|
для: tokmak
(18.12.2008 в 00:04)
| | Вообще говоря, нужно поставить ! перед preg_match() теперь | |
|
|
|
|
|
|
|
для: BinLaden
(18.12.2008 в 00:11)
| | Теперь вот сижу ищу инфу по preg_match... чтобы более подробней с ней разобраться.... | |
|
|
|
|
|
|
|
для: tokmak
(17.12.2008 в 23:41)
| | >... Но согласитесь, лучше уж, хоть какая-та защита, чем вообще никакой. ;)
А я не соглашусь с самим принципом.
Защита дарит надежду.
А негодная защита имеет следствием атаку тогда и там, где её совсем не ждешь. | |
|
|
|