Является ли этот оператор PHP / MySQL уязвимым для внедрения SQL? - PullRequest
0 голосов
/ 18 июля 2009

Должен быть простой вопрос, я просто не знаком с синтаксисом PHP и мне интересно, безопасен ли следующий код от атак SQL-инъекций?:

private function _getAllIngredients($animal = null, $type = null) {
    $ingredients = null;
    if($animal != null && $type != null) {
        $query = 'SELECT id, name, brief_description, description, 
                         food_type, ingredient_type, image, price,
                         created_on, updated_on
                    FROM ingredient
                   WHERE food_type = \'' . $animal . '\'
                     AND ingredient_type =\'' . $type . '\';';
        $rows = $this->query($query);

        if(count($rows) > 0) {

и т. Д. И т. Д. И т. П.

Я немного погуглил, и кажется, что безопасный код для инъекций выглядит иначе, чем WHERE food_type = \ ''. $ животное. Синтаксис '\' используется здесь.

Извините, я не знаю, какая версия PHP или MySQL используется здесь, или если используются какие-либо сторонние библиотеки, может кто-нибудь с опытом предложить какой-либо вклад?

UPDATE

Какую цель \ служит в утверждении ?:

WHERE food_type = \'' . $animal . '\'  

В своем поиске я наткнулся на множество ссылок на mysql_real_escape_string ... это функция для защиты от SQL-инъекций и других мерзостей?

Объявление класса:

class DCIngredient extends SSDataController

Так возможно ли, чтобы туда включили mysql_real_escape_string?
Должен ли я просить увидеть реализацию SSDataController?

Ответы [ 7 ]

1 голос
/ 18 июля 2009

Вы также можете использовать mysql_real_escape_string в любом случае, чтобы избавиться от всего, что может сделать отбрасывание таблицы или выполнить любой другой произвольный код.

Неважно, где в операторе SQL вы помещаете значения, в любой момент у него может быть символ ';' в нем, который немедленно заканчивает утверждение и запускает новое, что означает, что хакер может делать практически все, что он хочет.

Чтобы быть в безопасности, просто оберните ваши значения в mysql_real_escape_string ($ variable). Итак:

WHERE Something='".mysql_real_escape_string($variable)."'
1 голос
/ 18 июля 2009

Да этот код уязвим для SQL-инъекций.

"\" экранирует только символ кавычки, иначе PHP думает, что кавычка завершит вашу (sql-) строку.

Кроме того, поскольку вы доставляете всю строку SQL в класс SSDataControler , больше невозможно избежать атаки, если подготовленная строка была введена.

Итак класс SSDataControler нарушен (уязвим) по замыслу.

попробуйте что-нибудь более безопасное, как это:

$db_connection = new mysqli("host", "user", "pass", "db");
$statement = $db_connection->prepare("SELECT id, name, brief_description, description, 
                     food_type, ingredient_type, image, price,
                     created_on, updated_on
                FROM ingredient
               WHERE food_type = ?
                 AND ingredient_type = ?;';");
$statement->bind_param("s", $animal);
$statement->bind_param("s", $type);
$statement->execute();

с помощью метода bind вы можете указать тип вашего параметра (s для строки, i для целого и т. Д.), И вы никогда больше не будете думать о внедрении sql

1 голос
/ 18 июля 2009

$animal может быть строкой, содержащей '; drop table blah; --, так что да, это уязвимо для внедрения SQL.

Вам следует использовать подготовленные операторы, в которых вы привязываете параметры, чтобы внедрение не могло произойти:

http://us3.php.net/pdo.prepared-statements

0 голосов
/ 18 июля 2009

Re: ОБНОВЛЕНИЕ

\ '' служит для того, чтобы заключить переменную в кавычки, чтобы при переходе к SQL ничего не нарушалось пробелами. IE: Где Something = Cold Turkey закончится ошибкой, а Something = 'Cold Turkey' - нет.

Кроме того, расширение класса не повлияет на то, как вы собираете MySQL Statements.

0 голосов
/ 18 июля 2009

Если это частная функция, то вроде. Если вы беспокоитесь о людях, имеющих доступ к источнику, вводящему SQL, есть более простые способы достичь своей цели. Я рекомендую передать аргументы mysql_real_escape_string() перед использованием, просто для безопасности. Как это:

private function _getAllIngredients($animal = null, $type = null) {
        $animal = mysql_real_escape_string($animal);
        $type   = mysql_real_escape_string($type);
        ...
        }

Для большей безопасности вы можете даже передать его на htmlentities() с флагом ENT_QUOTES - это также поможет защитить данные типа XSS, если только вы не поместите содержимое этих записей БД в <script> tag.

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

0 голосов
/ 18 июля 2009

Если пользователь или любая третья сторона каким-либо образом вводит значение $ animal в вашу систему (что они, вероятно, делают), то да, это уязвимо для sql-инъекции.

Способ обойти это можно сделать

private function _getAllIngredients($animal = null, $type = null) {
    $ingredients = null;
    if($animal != null && $type != null) {
        $query = 'SELECT id, name, brief_description, description, 
                         food_type, ingredient_type, image, price,
                         created_on, updated_on
                    FROM ingredient
        $rows = $this->query($query);
        if(count($rows) > 0) {
        if($rows['animal'] == $animal && $rows['ingredient_type'] == $type) {

Примечание: я удалил операторы WHERE из sql и добавил операторы if в цикл

0 голосов
/ 18 июля 2009

Это уязвимо. Если я прошел: '\'; Ингредиент DROP TABLE; ВЫБРАТЬ \'' как $ type, poof, до свидания таблица ингредиентов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...