Member 10850253 Ответов: 1

Входная строка не была в правильном формате исправлена


Я знаю, что это может привести к sql-инъекции, но я просто хочу знать, как исправить эту ошибку.
У меня есть БД с несколькими столбцами, и я использую этот код для вставки в таблицу:
ed.addproy("avance_presupuestario", "nombre,usuario,año,proyecto,porcentajeejecucionglobal,porcentajeejecucionpresupuestaria,fecha", name.Text + "','" + user.Text + "','"+yr.Text+"','" + proy.Text + "','" + Int32.Parse(tec.Text) + "','" + Int32.Parse(pre.Text) + "','" + date.Text);
        System.Threading.Thread.Sleep(10);
        //name.Text = "";
        //user.Text = "";
        //proy.Text = "";
        tec.Text = "";
        pre.Text = "";
        date.Text = "";

это класс редактирования ("ed")
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
/// Summary description for EditClass
/// </summary>
/// 
public class EditClass
{
    MySql.Data.MySqlClient.MySqlConnection conn;
    MySql.Data.MySqlClient.MySqlCommand cmd;
    MySql.Data.MySqlClient.MySqlDataReader reader;
    String queryStr;
    String proyecto = "";
    public static String proyecto2 = "";
    String cargo = "";
    String usuario = "";
    public EditClass()
    {
        //
        // TODO: Add constructor logic here
        //
    }
    public void addproy(String table, String columns, String data)
    {
        String connString = System.Configuration.ConfigurationManager.ConnectionStrings["web"].ToString();
        conn = new MySql.Data.MySqlClient.MySqlConnection(connString);
        conn.Open();
        queryStr = "";
        queryStr = "INSERT INTO " + table + " (" + columns + ")" + "VALUES('" + data + "')";
        cmd = new MySql.Data.MySqlClient.MySqlCommand(queryStr, conn);
        cmd.ExecuteReader();
        conn.Close();
        //id_area.Text = "";
    }
    public void deleteproy(String column, String table, String data)
    {
        String connString = System.Configuration.ConfigurationManager.ConnectionStrings["web"].ToString();
        conn = new MySql.Data.MySqlClient.MySqlConnection(connString);
        conn.Open();
        queryStr = "";
        queryStr = "DELETE FROM "+table+" WHERE "+column+" like'" + data + "'";
        cmd = new MySql.Data.MySqlClient.MySqlCommand(queryStr, conn);
        reader = cmd.ExecuteReader();
        while (reader.HasRows && reader.Read())
        {

        }
        reader.Close();
        conn.Close();
    }
}

Пожалуйста, помогите мне исправить эту ошибку.
Спасибо.

Что я уже пробовал:

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

RossMW

Проверьте структуру таблицы на соответствие тому, что вы пытаетесь вставить. Кроме того, вы можете скопировать текст QueryStr и запустить его непосредственно в базу данных и expeiement, чтобы узнать, где он идет не так. Вы также должны быть осторожны с форматами дат, так как sql имеет плохую привычку по умолчанию возвращаться к американскому формату.

Member 10850253

Я проверил, и начальный и закрывающий теги находятся в классе редактирования, а остальные-в первой строке кода. У вас есть еще какие-нибудь идеи, чтобы помочь мне исправить это? Спасибо.

RossMW

Извините, не хватает информации, чтобы определить больше вариантов. Пактикулярно вокруг структуры базы данных. Это, по-видимому, неправильная конструкция sql-оператора (следовательно, запустите его непосредственно в базе данных для тестирования). Многие из этих проблем могут быть решены с помощью параметров, выделенных OriginalGriff. Это хорошая практика, чтобы попасть в нее. Особенно там, где у пользователя может быть какой-то отдаленный шанс войти в него.

1 Ответов

Рейтинг:
2

OriginalGriff

Никогда так не делай. Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

Исправьте это, и ваша проблема с конверсией, вероятно, исчезнет в то же время.