我必须修复一个易受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价值,因此有一种"快速"的解决方案可以实现
SubmitButton_Click()代码隐藏方法中执行的,我可以在这里处理这种情况吗?(编辑)编码/解码输入值怎么样?所以上面的例子将是:
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 ...
建议?
提前致谢.
我试图使用一个简单的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(),所以从这个角度来看任何洞察都是值得赞赏的.
我有一个由过去的开发人员执行过编程的客户。他们的代码最近变得可疑,我想知道他们是否在使用参数化查询。我希望可以通过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
我已经对此进行了研究,虽然下面的问题很相似,但我已经尝试了所有这些,但似乎都没有解决我的问题.
Access数据库的UPDATE查询不能正常工作C#.NET
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) 继我之前的一个与方法设计有关的问题之后,我被建议将我的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)
这个版本工作正常,在我的第一个例子中,我错过了参数化查询的要点,还是我错误地构造它们?
谢谢!
我正在编写一个C应用程序,它接受一些用户输入并执行一些数据库查询.我很清楚SQL注入的风险,并希望防止它.
理想情况下,我会使用参数化查询,但到目前为止无法在C中找到任何具有此功能的内容.我目前正在构建我的查询:
char *query;
asprintf(&query, "UPDATE SomeTable SET SomeField='%s';", userInput);
Run Code Online (Sandbox Code Playgroud)
如果我无法做到这一点,那么我必须过滤用户输入.该过滤应该如何进行?是否只删除所有和's?(有效输入不能包含它们).如果是这样,在C中执行此操作的最简单方法是什么?
(如果你能想到更好的东西,请随意改进问题标题.)
问题:考虑以下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) 假设我想显示一个完整的奖项列表,其中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部分的任何想法参数化?
我试图通过代码在 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 …
我正在使用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 时失败。