标签: parameterized-query

在大型asp.net C#Web应用程序中修复SQL注入表单

我必须修复一个易受SQL注入攻击的项目.

项目中每个页面中的所有表单都不使用参数化查询,而只使用字符串查询.

对于例如我有搜索页,看着后面的代码我看到有一个方法CreateQuery()创建的文本字段作为例如查询筑底:

string sQuery = "";
sQuery += "b.name like '%" + txtName.Text + "%'";
Run Code Online (Sandbox Code Playgroud)

然后在btnSearch_Click()我有查询的方法:

query = CreateQuery();
var totalList = GetAllBlaBla(query);
Run Code Online (Sandbox Code Playgroud)

我的问题是:

由于我有数百种形式和成千上万的formTextFIX价值,因此有一种"快速"的解决方案可以实现

  1. 一个全局函数,用于参数化查询或以某种方式处理情况?
  2. 由于在每个类中查询都是在SubmitButton_Click()代码隐藏方法中执行的,我可以在这里处理这种情况吗?
  3. 我是否应该修改表单代码中的每个表单和每个条目以参数化SQL字符串,这将需要一百万年?
  4. (编辑)编码/解码输入值怎么样?所以上面的例子将是:

    string sQuery = "";
    var txt = var txt = HttpUtility.HtmlEncode(txtName.Text);
    sQuery += "b.name like '%" + txt + "%'";
    
    Run Code Online (Sandbox Code Playgroud)

    这是一个可能的临时补丁吗?

5-(编辑)这是一个可能的解决方案,还是根本不改变任何东西?

        cmd.Parameters.Add("@txtNameParameter", SqlDbType.VarChar);
        cmd.Parameters["@txtNameParameter"].Value = txtName.Text;
        sQuery += "b.name like '%" + (string)cmd.Parameters["@txtNameParameter"].Value + "%'";
Run Code Online (Sandbox Code Playgroud)

问题是我必须返回一个字符串,因为处理查询的逻辑是在另一个将字符串作为查询的业务类中定义的,我不能给它一个CommandType或SqlDataAdapter ...

建议?

提前致谢.

c# asp.net sql-injection parameterized-query

5
推荐指数
1
解决办法
1532
查看次数

PDO错误:"参数号无效:参数未定义"

我试图使用一个简单的MySQL插入查询与数组形式的参数.它一直告诉我参数的数量是错误的.我试过以下,都产生了同样的错误:

$stmt3 = $link->prepare('INSERT INTO messages VALUES(null, :room, :name, :message, :time, :color)');
$stmt3->execute(array(':room' => $Clean['room'],':name' => $Clean['name'],':message' => $Clean['message'],':time' => $time,':color:' => $Clean['color']));
Run Code Online (Sandbox Code Playgroud)

$stmt3 = $link->prepare('INSERT INTO messages VALUES(:null, :room, :name, :message, :time, :color)');
$stmt3->execute(array(':null' => null, ':room' => $Clean['room'],':name' => $Clean['name'],':message' => $Clean['message'],':time' => $time,':color:' => $Clean['color']));
Run Code Online (Sandbox Code Playgroud)

以及专门声明列以避免空插入:

$stmt3 = $link->prepare('INSERT INTO messages (room, name, message, time, color) VALUES(:room, :name, :message, :time, :color)');
$stmt3->execute(array(':room' => $Clean['room'],':name' => $Clean['name'],':message' => $Clean['message'],':time' => $time,':color:' => $Clean['color']));
Run Code Online (Sandbox Code Playgroud)

这是我第一次使用PDO(我通常使用mysqli,但我当前的共享主机没有mysqlnd插件,阻止我使用prepare(),所以从这个角度来看任何洞察都是值得赞赏的.

php mysql pdo prepared-statement parameterized-query

5
推荐指数
1
解决办法
2万
查看次数

SQL Server:检测非参数化查询

我有一个由过去的开发人员执行过编程的客户。他们的代码最近变得可疑,我想知道他们是否在使用参数化查询。我希望可以通过SQL Server检测到非参数化的请求,但是我还没有找到一种方法来执行此操作。我了解并非所有查询都需要参数化,因为查询可能类似于

select count(*) from Customers
Run Code Online (Sandbox Code Playgroud)

但是,如果SQL Server可以通过编程方式告诉我哪些查询具有任何字符串常量输入而不是参数输入,那就太好了。顺便说一句,关闭所有SQL查询并用@符号删除所有行的操作已关闭,但是下面的查询将被视为合法:

select * from Users where Username='user' and Password=@Password
Run Code Online (Sandbox Code Playgroud)

因此,我确实需要SQL Server读入命令的内容并确定是否所有输入都已参数化。谢谢。

sql sql-server security parameterization parameterized-query

5
推荐指数
1
解决办法
1400
查看次数

C#Microsoft Access参数化查询无法正常工作

我已经对此进行了研究,虽然下面的问题很相似,但我已经尝试了所有这些,但似乎都没有解决我的问题.

从Access数据库获取数据的正确方法

使用参数将数据插入访问数据库

通过单击按钮将数据从Access获取到C#中的文本框

Access数据库的UPDATE查询不能正常工作C#.NET

传递参数以从c#访问查询

用于插入值的参数化查询

以下是相关代码的一部分:

private void LoadDetails(int index)
{
    try
    {
        connection.Open();
        command = new OleDbCommand("SELECT * from tagsTbl WHERE ID=@1", connection);
        command.Parameters.AddWithValue("@1", index);
        reader = command.ExecuteReader();
        while (reader.Read())
        {
            nameTextBox.Text = reader["leName"].ToString();
            altTextBox.Text = reader["altName"].ToString();
            unitTextBox.Text = reader["currUnit"].ToString();
            tagTextBox.Text = reader["currTag"].ToString();
            oldTextBox.Text = reader["oldTag"].ToString();
            descTextBox.Text = reader["currDesc"].ToString();
        }
        connection.Close();
    }
    catch
    {
        connection.Close();
        MessageBox.Show(errortxt);
        Application.Exit();
    }
}

private void testWin_Load(object sender, EventArgs e)
{
    loadFileDialog.ShowDialog();
    connection = new OleDbConnection(strConn);
    if (!blnLoaded)
        Application.Exit();
    else
    {
        errortxt …
Run Code Online (Sandbox Code Playgroud)

c# oledb ms-access parameterized-query c#-4.0

5
推荐指数
1
解决办法
953
查看次数

简单参数化查询出错 - Java/SQL

继我之前的一个与方法设计有关的问题之后,我被建议将我的SQL查询实现为参数化查询,而不是简单的字符串.

我之前从未使用参数化查询,所以我决定从简单的开始,采取以下Select语句:

String select = "SELECT * FROM ? ";

PreparedStatement ps = connection.prepareStatement(select);
ps.setString(1, "person");
Run Code Online (Sandbox Code Playgroud)

这给了我以下错误:"[SQLITE_ERROR] SQL错误或缺少数据库(接近"?":语法错误)"

然后我尝试了一个具有附加标准的修改版本;

String select = "SELECT id FROM person WHERE name = ? ";

PreparedStatement ps = connection.prepareStatement(select);
ps.setString(1, "Yui");
Run Code Online (Sandbox Code Playgroud)

这个版本工作正常,在我的第一个例子中,我错过了参数化查询的要点,还是我错误地构造它们?

谢谢!

java sql netbeans parameterized-query

4
推荐指数
1
解决办法
1548
查看次数

在C中防止SQL注入

我正在编写一个C应用程序,它接受一些用户输入并执行一些数据库查询.我很清楚SQL注入的风险,并希望防止它.

理想情况下,我会使用参数化查询,但到目前为止无法在C中找到任何具有此功能的内容.我目前正在构建我的查询:

char *query;
asprintf(&query, "UPDATE SomeTable SET SomeField='%s';", userInput);
Run Code Online (Sandbox Code Playgroud)

如果我无法做到这一点,那么我必须过滤用户输入.该过滤应该如何进行?是否只删除所有和's?(有效输入不能包含它们).如果是这样,在C中执行此操作的最简单方法是什么?

c mysql sanitization sql-injection parameterized-query

4
推荐指数
1
解决办法
1853
查看次数

参数化SQLite查询的奇怪行为

(如果你能想到更好的东西,请随意改进问题标题.)

问题:考虑以下SQLite查询:

SELECT COUNT(*)
  FROM (SELECT 1 AS value UNION SELECT 2 AS value)
 WHERE value <= ?
Run Code Online (Sandbox Code Playgroud)

当我1用作参数时,我希望查询能够产生1,但它会产生2.为什么会这样?


其他信息:

这是重现问题的最小工作示例(Android):

Cursor c = db.rawQuery(
        "SELECT COUNT(*) " +
        "  FROM (SELECT 1 AS value UNION SELECT 2 AS value) " +
        " WHERE value <= ? ",
        new String[] {String.valueOf(1)});

c.moveToFirst();
Log.i("", "Result: " + String.valueOf(c.getInt(0)));
Run Code Online (Sandbox Code Playgroud)

可能与参数作为字符串传递这一事实有关,但是,唉,没有其他方法可以将参数传递给SQLite API,所以我想我在这里没做任何"错误"而且它是SQLite的工作来适当地转换价值.在使用查询的非参数化版本时,我也观察到以下情况(这可能与问题有关,也可能不相关):

SELECT COUNT(*)
  FROM (SELECT 1 AS value UNION SELECT …
Run Code Online (Sandbox Code Playgroud)

sql sqlite android parameterized-query

4
推荐指数
1
解决办法
672
查看次数

Laravel Eloquent/Query Builder中LEFT JOIN的ON子句中的参数化查询绑定

假设我想显示一个完整的奖项列表,其中type ="color":

Awards        Type     2013 Winner
======        ====     ===========
Blue Award    color       Tom
Red Award     color
Green Award   color       Dan  
Run Code Online (Sandbox Code Playgroud)

为了达到这个结果,我可以在Laravel中查询如下:

$year = '2013';

$awards = DB::table('awards')
             ->leftJoin('winners', function($join) use ($year)
                   {
                        $join->on('awards.id','=','winners.award_id');
                        $join->on('winners.year','=',DB::raw("'".$year."'"));
                   }
             ->where('awards.type','color')
             ->get();
Run Code Online (Sandbox Code Playgroud)

如果输出Laravel生成的SQL,您将看到只有WHERE子句被参数化,并且如果从不受信任的源获取它,则ON子句中的$ year 容易受到sql注入的攻击.此外,查询的缓存潜力也会降低,因为$ year会经常更改.注意:如果您认为我只是将第二个左连接条件添加到查询的WHERE,则 这些不一样.

有关如何获取查询的$ year部分的任何想法参数化?

php parameterized-query laravel eloquent laravel-4

4
推荐指数
1
解决办法
3059
查看次数

SqlCommand.Prepare 方法要求所有可变长度参数都具有显式设置的非零大小

我试图通过代码在 SQL 数据库中插入一些值:

var connstring = ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString; ;
var conn = new SqlConnection(connstring);
conn.Open();
SqlCommand command = new SqlCommand("INSERT INTO [Trainer] (Name, ID, [Trainee Counter], image, [Mobile NO], Email, Password) VALUES(:v1, :v2,:v3,:v4,:v5,:v6,:v7);", conn);

command.Parameters.Add(new SqlParameter("v1", SqlDbType.VarChar));
command.Parameters.Add(new SqlParameter("v2", SqlDbType.Int));
command.Parameters.Add(new SqlParameter("v3", SqlDbType.Int));
command.Parameters.Add(new SqlParameter("v4", SqlDbType.VarBinary));
command.Parameters.Add(new SqlParameter("v5", SqlDbType.VarChar));
command.Parameters.Add(new SqlParameter("v6", SqlDbType.VarChar));
command.Parameters.Add(new SqlParameter("v7", SqlDbType.VarChar));
command.Prepare();
command.Parameters[0].Value = TextBox1.Text;
command.Parameters[1].Value = 0;
command.Parameters[2].Value = 0;
command.Parameters[3].Value = FileUpload1.FileBytes;
command.Parameters[4].Value = TextBox3.Text;
command.Parameters[5].Value = TextBox4.Text;
command.Parameters[6].Value = TextBox5.Text;


command.ExecuteNonQuery();

conn.Close();
Run Code Online (Sandbox Code Playgroud)

但我总是得到这个例外:

SqlCommand.Prepare …

c# database sql-server asp.net parameterized-query

4
推荐指数
1
解决办法
9564
查看次数

参数化查询的查询格式

我正在使用pg-promisePostgreSQL 中的 like 子句执行选择查询。不幸的是,查询失败,错误代码为08P01和错误消息

绑定消息提供 1 个参数,但准备好的语句 "" 需要 0

查询如下

select user_name, user_id from users where user_name like '$1#%'
Run Code Online (Sandbox Code Playgroud)

我使用参数化查询作为

var userQuery:pgp.ParameterizedQuery = new pgp.ParameterizedQuery("<above_query>", [userName]);
Run Code Online (Sandbox Code Playgroud)

用于执行查询的 API 是

each(query:TQuery, values:any, cb:(row:any, index:number, data:Array<any>)=>void, thisArg?:any):XPromise<Array<any>>;
Run Code Online (Sandbox Code Playgroud)

我查看了 pg-promise 示例,但它没有将 LIKE 子句与参数化查询一起使用。

环境细节是

PG承诺:4.3.2

PostgreSQL:9.6

节点:5.7.1

更新:1 我可以使用queryAPI(纯文本 sql)运行查询,但不能使用each. 任何人都可以解释为什么 LIKE 子句each在使用ParameterizedAPI 时失败。

postgresql parameterized-query pg-promise

4
推荐指数
1
解决办法
1万
查看次数