[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: SQL инъекция
Alexey_2011
Доброе время суток всем, я в php новичек, и хотел спросить является ли защитой данных от SQL инъекция такой метод приведенный ниже, если поиск осуществляется имено по id которая является числом
код

<?php include_once ($_SERVER['DOCUMENT_ROOT'].'/connect/include.php');

if (isset($_GET['id']))
$id = $_GET['id'];
if($_GET['id']){
$id2 = preg_replace('%[^0-9]+%', '', $id);
$a = mysql_query("SELECT `name` FROM users WHERE `id`='$id2'");
$aa = mysql_fetch_array($a);
$name = $aa['name'];
if(empty($id2)){ echo 'Такого пользователя не существует'; } else {
echo ''.$name.'';
}
}

?>


preg_replace все цифры буквы кавычки удалила оставила только цифры, осуществила поиск по новой переменной с цифрами и вывела имя запрошеного ida на экран, если такого пользователя нет то выводим сообщение "Такого пользователя не существует", по моему инъекция тут не прокатит, или я ошибаюсь?




Спустя 4 минуты, 48 секунд (30.09.2011 - 08:04) Alexey_2011 написал(а):

if(empty($id2)){ echo 'Такого пользователя не существует'; } else {
echo ''.$name.'';

исправил

if(empty($name)){ echo 'Такого пользователя не существует'; } else {
echo ''.$name.'';



Спустя 9 минут, 4 секунды (30.09.2011 - 08:13) ApuktaChehov написал(а):
$id2 = (int)$id;

Спустя 6 минут, 20 секунд (30.09.2011 - 08:20) Alexey_2011 написал(а):
можно и так, я интересуюсь мой пример обезопасил скрипт от инъекции, он защищен на 100%?

Спустя 11 минут, 18 секунд (30.09.2011 - 08:31) ApuktaChehov написал(а):
Ну вроде как да. Только для чего такие извращения с регулярками?

Спустя 2 минуты, 23 секунды (30.09.2011 - 08:33) Alexey_2011 написал(а):
новичек я и мало функций знаю, сегодня дописал некоторые скрипты и решил защитить их от инъекций, про (int) узнал только сегодня ночью) переделаем, спасибо за ответ!)

Спустя 10 минут, 2 секунды (30.09.2011 - 08:43) linker написал(а):
Всё это записывается так
$id = isset($_GET['id']) ? (int)$_GET['id'] : 0;
$a = mysql_query("SELECT `name` FROM users WHERE `id` = " . $id);
if ($aa = mysql_fetch_array($a))
echo $aa['name'];
else
echo 'Такого пользователя не существует';
но можно и вообще в три строчки.

Спустя 2 часа, 37 минут, 22 секунды (30.09.2011 - 11:21) Alexey_2011 написал(а):
linker Буду пользоваться вашим методом спасибо

Спустя 22 минуты, 27 секунд (30.09.2011 - 11:43) Игорь_Vasinsky написал(а):
Этот "метод"

первая его строчка - называется "тернарный оператор", помогает избавиться от нескольких строчек использования оператора if else

В моём журнале есть описание.

Спустя 8 минут, 4 секунды (30.09.2011 - 11:51) Winston написал(а):
Только вместо этого
Цитата (linker @ 30.09.2011 - 08:43)
if ($aa = mysql_fetch_array($a))

Пиши
if ($aa = mysql_fetch_assoc($a))

Спустя 33 минуты, 51 секунда (30.09.2011 - 12:25) linker написал(а):
Да, точно, не обратил внимание.

Спустя 8 минут, 41 секунда (30.09.2011 - 12:34) Игорь_Vasinsky написал(а):
Winston
Ну чтож ты не объяснил то почему?

Вообщем mysql_fetch_array() - создаёт 2 массива: индексный и ассициативный
а mysql_fetch_assoc - только ассициативный

Таз зачем те ресурсы тратить? если ты пользуешь ассициативный массив на выходе. Вот по этому.

Спустя 17 часов, 23 минуты, 13 секунд (1.10.2011 - 05:57) Alexey_2011 написал(а):
спасибо всем за ответы

Спустя 1 час, 14 минут, 55 секунд (1.10.2011 - 07:12) imbalance_hero написал(а):

<?php

include_once $_SERVER['DOCUMENT_ROOT'].'/connect/include.php';
if(isset($_GET['id'])) {
$res = mysql_query("
SELECT `id`
FROM `users`
WHERE `id`='"
.(int)$_GET['id']."'
LIMIT 1
"
);

if(!mysql_num_rows($res))
echo 'Такого пользователя не существует';
else
echo $name;
}
?>

Спустя 3 минуты, 18 секунд (1.10.2011 - 07:15) Alexey_2011 написал(а):
С числами разобрались, еще один вопросик по поводу sql инъекций и xss атак


<?php include_once ($_SERVER['DOCUMENT_ROOT'].'/connect/include.php');
$text =$_POST['text'];
if ($_POST['send']){

$text2 = htmlentities($text, ENT_QUOTES);

$text3 = mysql_real_escape_string($text2);

$ins="INSERT forum SET `otprav`='{$_SESSION['name']}', `words`='$text3'";
mysql_query($ins) or die ("");
}
?>


Можно ли как то провести xss атаку или sql инъекцию обойдя вот этот фейс контроль указанный ниже?


$text2 = htmlentities($text, ENT_QUOTES);

$text3 = mysql_real_escape_string($text2);

Спустя 1 минута, 8 секунд (1.10.2011 - 07:16) imbalance_hero написал(а):
Я бы не использовал htmlentities, а при выводе просто: echo htmlspecialchars($text);

И ещё, посмотри мой пример, что я выше дал, это я обработал и сделал красивый и удобный тебе скрипт. Обрати внимание на стиль, потому что у тебя его вообще нет!

Спустя 29 минут, 7 секунд (1.10.2011 - 07:45) Alexey_2011 написал(а):
Цитата (imbalance_hero @ 1.10.2011 - 04:12)

<?php

    include_once $_SERVER['DOCUMENT_ROOT'].'/connect/include.php';
    if(isset($_GET['id'])) {
        $res = mysql_query("
            SELECT `id`
            FROM `users`
            WHERE `id`='"
.(int)$_GET['id']."'
            LIMIT 1
        "
);

        if(!mysql_num_rows($res))
            echo 'Такого пользователя не существует';
        else
            echo $name;
    }
?>

А для чего вы в конце вставляете LIMIT 1? просто у меня все запросы в базу которые по id ищутся без лимита написаны, я когда писал скрипты подумал что база должна понимать сколько ей нужно искать значений по id то есть 1 раз, так как у id прописан auto_increment и второго такого значения не может быть, например двух id с значением 45?
Мне тоже нужно вставлять лимит после таких запросов?

И данный пример не какого имени не выводит на экран, я вывожу теперь данные вот так

<?php

include_once $_SERVER['DOCUMENT_ROOT'].'/connect/include.php';
if(isset($_GET['id'])) {
$a = mysql_query("SELECT `name` FROM users WHERE `id` ='".(int)$_GET['id']."'");
if ($aa = mysql_fetch_assoc($a))
echo $aa['name'];
else
echo 'Такого пользователя не существует';
}
?>


Правильно?

Спустя 38 минут, 59 секунд (1.10.2011 - 08:24) Alexey_2011 написал(а):
Цитата (imbalance_hero @ 1.10.2011 - 04:16)
Я бы не использовал htmlentities, а при выводе просто: echo htmlspecialchars($text);

Можно и так, можно ли обойти данные функции и провести xss атаку или sql инъекцию?

Спустя 2 часа, 35 минут, 4 секунды (1.10.2011 - 10:59) imbalance_hero написал(а):
Alexey_2011
конечно же нет smile.gif Их придумали, чтобы обойти XSS, поэтому их можно обойти? smile.gif
Быстрый ответ:

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