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();