SQL 参数

SQL 参数 - 防止 SQL 注入

SQL 参数(参数化查询)可用于保护网站免受 SQL 注入攻击。

参数化查询是一种使用占位符的 SQL 语句,而不是将输入值直接添加到查询文本中。当查询执行时,占位符会被实际值替换。这使得查询更安全且更可重用。

大多数数据库支持参数化查询,但语法各不相同:

  • MySQL 使用 ? 作为参数
  • SQL Server 使用 @ 作为参数
  • PostgreSQL 使用 $ 作为参数

SQL 参数在查询执行时以受控的方式添加到 SQL 查询中。

ASP.NET Razor 示例

userid = getRequestString("UserId");
query = "SELECT * FROM Users WHERE UserId = @userid";
db.Execute(query, userid);

请注意,SQL Server 中的参数由 @ 标记表示。

SQL 引擎会检查每个参数,以确保其对于所在列是正确的,并按字面意思处理,而不是作为要执行的 SQL 的一部分。

另一个示例

cname = getRequestString("CustomerName");
caddress = getRequestString("Address");
ccity = getRequestString("City");
query = "INSERT INTO Customers (CustomerName, Address, City) Values(@cname, @caddress, @ccity)";
db.Execute(query, cname, caddress, ccity);

Examples

以下示例展示了如何在一些常见的 Web 语言中构建参数化查询。

ASP.NET 中的 SELECT 语句:

userid = getRequestString("UserId");
query = "SELECT * FROM Customers WHERE CustomerId = @userid";
cmd = new SqlCommand(query);
cmd.Parameters.AddWithValue("@userid", userid);
cmd.ExecuteReader();

ASP.NET 中的 INSERT INTO 语句:

cname = getRequestString("CustomerName");
caddress = getRequestString("Address");
ccity = getRequestString("City");
query = "INSERT INTO Customers (CustomerName, Address, City) Values(@cname, @caddress, @ccity)";
cmd = new SqlCommand(query);
cmd.Parameters.AddWithValue("@cname", cname);
cmd.Parameters.AddWithValue("@caddress", caddress);
cmd.Parameters.AddWithValue("@ccity", ccity);
cmd.ExecuteNonQuery();