我们正在讨论在我们的代码中使用参数化sql查询的另一个讨论.我们在讨论中有两个方面:我和其他一些人说我们应该总是使用参数来防止sql注入以及其他不认为有必要的人.相反,他们想要在所有字符串中用两个撇号替换单撇号以避免sql注入.我们的数据库都在运行Sql Server 2005或2008,我们的代码库运行在.NET framework 2.0上.
让我在C#中给你一个简单的例子:
我希望我们使用这个:
string sql = "SELECT * FROM Users WHERE Name=@name";
SqlCommand getUser = new SqlCommand(sql, connection);
getUser.Parameters.AddWithValue("@name", userName);
//... blabla - do something here, this is safe
Run Code Online (Sandbox Code Playgroud)
而其他人想要这样做:
string sql = "SELECT * FROM Users WHERE Name=" + SafeDBString(name);
SqlCommand getUser = new SqlCommand(sql, connection);
//... blabla - are we safe now?
Run Code Online (Sandbox Code Playgroud)
SafeDBString函数定义如下:
string SafeDBString(string inputValue)
{
return "'" + inputValue.Replace("'", "''") + "'";
}
Run Code Online (Sandbox Code Playgroud)
现在,只要我们在查询中的所有字符串值上使用SafeDBString,我们就应该是安全的.对?
使用SafeDBString函数有两个原因.首先,它是自石头老化以来完成的方式,其次,由于您看到在数据库上运行的精确查询,因此更容易调试sql语句.
那么.我的问题是使用SafeDBString函数是否真的足以避免sql注入攻击.我一直试图找到破坏这种安全措施的代码示例,但我找不到任何示例.
那里有人可以打破这个吗?你会怎么做?
编辑: 总结到目前为止的答复:
可能重复:
如何从"Bobby Tables"XKCD漫画中注入SQL?
https://stackoverflow.com/search?q=sql+injection
有人可以解释SQL注入吗?它是如何导致漏洞的?注入SQL的确切位置在哪里?
初学者:
在我对如何将数据插入SQL Server的问题的答案中,他提到了传递参数而不是像我目前所拥有的字符串连接.
这对安全来说真的有必要吗?如果是这样,究竟是什么传递参数?当我谷歌它我得到很多关于存储过程.这就是我想要的,我不知道存储过程....
如果你能指出我正确的方向,我将不胜感激.
谢谢.
编辑:
好的,这就是我得到的.它似乎正确地更新了数据库,最终我将硬编码的int更改为标签的输入.请确认我是如何做到这一点不容易受到任何SQL注入或攻击.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;
public partial class Stats : System.Web.UI.Page
{
public SqlDataReader DataReader;
public SqlCommand Command;
string queryString = ("INSERT INTO UserData (UserProfileID, ConfidenceLevel, LoveLevel, HappinessLevel) VALUES (@UID, @CL, @LL, @HL);");
//string queryString = ("INSERT INTO UserData (UserProfileID, ConfidenceLevel, LoveLevel, HappinessLevel) VALUES ('a051fc1b-4f51-485b-a07d-0f378528974e', 2, 2, 2);");
protected void Page_Load(object sender, EventArgs e)
{ …Run Code Online (Sandbox Code Playgroud) 我已经做了很多阅读,但仍然不理解100%SQL注入的发生方式!
我想从那些知道基于我的例子的SQL注入的具体例子中看到它,因此它可以被复制,测试和修复.我试过SQL注入我的代码而不能,所以我希望有人来证明我的意思!
1.我认为SQL注入只能通过POST或GET方法进行,这意味着在网站上它应该是帖子形式,例如'注册或搜索'或查询如'search.php?tags = love'?
说这可以注入以下具有POST方法的代码吗?
$name = trim($_POST['username']);
$mail = trim($_POST['email']);
$password = trim($_POST['password ']);
if ($errors == "false") {
$sql =
"INSERT INTO
clients
SET
name='" . mysql_real_escape_string($name) . "',
mail='" . mysql_real_escape_string($mail) . "',
password='" . mysql_real_escape_string(sha1($password)) . "'";
$connection->execute($sql);
}
Run Code Online (Sandbox Code Playgroud)
2.另一个有GET方法: rate.php?like&videoID=250&userID=30
$sql =
"SELECT
videoID
FROM
likes
WHERE
videoID = '" .mysql_real_escape_string($videoID). "' AND UID = '" .mysql_real_escape_string($userID). "' LIMIT 1";
$connection->execute($sql);
Run Code Online (Sandbox Code Playgroud)
请帮助那些对主题感到自由的人,但请使用具体的例子.
提前谢谢,
伊利亚
我听说当对 SQL Server 使用 ADO.NET SQLParameter(参数化查询)时,仍然可以进行 SQL 注入。
我正在寻找 C#/VB 代码中的真实示例作为证据。
编辑:我正在寻找具体的工作示例。没有介绍 sql 注入或如何防止它。
参数用于保护您免受恶意用户输入.
但是如果参数需要一个字符串,是否可以编写将被解释为sql的输入,因此恶意用户可以使用"DROP","TRUNCATE"等内容......?
asp,asp.net,java等参数之间的保护是否存在差异?
另请参阅:参数是否足以阻止SQL注入?
我是ASP.NET和C#编程的新手.
我想知道在SQL语句中使用参数而不是连接有什么区别和优点加上缺点,因为我听说这是防止SQL注入的更好方法(?)
下面是我使用串联更改为参数的示例INSERT语句:
级联:
string sql = string.Format("INSERT INTO [UserData] (Username, Password, ...) VALUES ('" + usernameTB.Text + "', '" + pwTB.Text + "',...);
Run Code Online (Sandbox Code Playgroud)
参数:
cmd.CommandText = "INSERT INTO [UserData] (Username, Password, ...) VALUES (@Username, @Password, ...)";
cmd.Parameters.AddWithValue("Username", usernameTB.Text);
cmd.Parameters.AddWithValue("Password", pwTB.Text);
Run Code Online (Sandbox Code Playgroud)
提前感谢您提供的任何知识.
我有两个数据库。一种在像 O'Bannon 这样的名字中有撇号,而另一种则没有。我需要合并它们并找到重复项。由于添加撇号更难,我正在尝试将其删除
但是这个...
UPDATE Client
SET Last_Name = REPLACE(''','')
Run Code Online (Sandbox Code Playgroud)
显然行不通。如何摆脱'.
我正在使用 Xojo(不是 PHP)
我希望这是一个正确的问题,parameters.addwithvalue工作怎么样?我正在考虑防止SQL注入?我一直在Stackoverflow上看很多,很多人说"//反对sql注入".我一直在盲目地使用它,但现在我必须提交一份关于我的任务的文章,我需要解释为什么它是保护.我一直试图在MSDN上找到一些东西,找到了这个:
SQL注入但它使用了parameters.add.然后我读到他们替换.Add了.AddWithValue,是真的吗?那么任何官员呢?
所以基本上,任何人都可以更好地搜索一些可以防止SQL注入的官方文书工作?或者可以告诉我它是如何工作的?
我不是想让你做我的工作,我只是找不到自己.
我这样使用它:
using (SqlConnection conn = new SqlConnection(connectionString))
using (var cmd = conn.CreateCommand())
{
conn.Open();
String queryString = "DELETE FROM dbo.SecurityAccess WHERE Username = ' @Username ";
cmd.CommandText = queryString;
cmd.Parameters.AddWithValue("@Username", Username);
cmd.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud) 运行我的字符串以确保MySQL注入不可能的最佳功能是什么?
此外,它是否需要在出路时通过另一个功能运行它才能使其正确显示?
参数真的足以阻止Sql注入吗?
C#参数化查询MySQL withinclause
我可以通过使用单引号转义单引号和周围用户输入来防止SQL注入吗?