我意识到参数化SQL查询是构建包含用户输入的查询时消毒用户输入的最佳方式,但我想知道使用用户输入并转义任何单引号并用单引号包围整个字符串有什么问题.这是代码:
sSanitizedInput = "'" & Replace(sInput, "'", "''") & "'"
Run Code Online (Sandbox Code Playgroud)
用户输入的任何单引号都被双单引号替换,这消除了用户结束字符串的能力,因此他们可能键入的任何其他内容(例如分号,百分号等)都将成为字符串的一部分而不是实际上作为命令的一部分执行.我们使用的是Microsoft SQL Server 2000,我相信单引号是唯一的字符串分隔符,也是逃避字符串分隔符的唯一方法,因此无法执行用户键入的任何内容.
我没有看到任何方法发起针对此的SQL注入攻击,但我意识到,如果这是像我看来一样的防弹,其他人会想到它,这将是常见的做法.我的问题是:这段代码有什么问题?有没有人知道通过这种清理技术获得SQL注入攻击的方法?利用此技术的示例用户输入将非常有用.
更新:
感谢大家的回答; 几乎我在研究中遇到的所有信息都出现在这个页面的某个地方,这表明那些在忙碌的日子里抽出时间帮助我解决这个问题的人的智慧和技巧.
我还没有接受任何答案的原因是我仍然不知道如何有效地针对此代码启动SQL注入攻击.有些人建议反斜杠会转义一个单引号而另一个引用字符串结束,以便字符串的其余部分作为SQL命令的一部分执行,我意识到这个方法可以将SQL注入一个mySQL数据库,但在MS SQL 2000中,唯一的方法(我能够找到)逃避单引号是另一个单一的qoute; 反斜杠不会这样做.除非有办法停止单引号的转义,否则其余的用户输入都不会被执行,因为它将全部作为一个连续的字符串.
我知道有更好的方法来消毒输入,但我真的更有兴趣了解为什么我上面提供的方法不起作用.如果有人知道对这种清理方法进行SQL注入攻击的任何特定方法,我很乐意看到它.
我必须从文本文件中插入大约200万行.
插入时我必须创建一些主表.
将如此大量的数据插入SQL Server的最佳和快速方法是什么?
在构建 sql 查询和更新以提交到我的数据库之前,我需要清理一些用户输入的数据。
我知道最好使用准备好的语句,但这不是一个选项。不幸的是,我坚持要转义所有用户提供的 Input。
看起来 Postgres JDBC 库附带了一个工具来进行字符串转义。见org.postgresql.core.Utils.escapeLiteral(..)(见下文)。我希望因为 Postgres 附带了它,所以使用起来是安全的。经过几个小时的谷歌搜索和查看 SQL 备忘单后,我无法找到一个可以打破这个的例子。
以下看起来足够安全吗?
public class FruitDb {
private Connection connection;
public void findFruit ( String /* user enterable field */ fruitColor ) {
String query = "SELECT * FROM fruit WHERE fruit_color = " + quote( fruitColor );
Statement statement = connection.createStatement();
statement.executeQuery( sql );
}
private String quote( String toQuote ) {
return "'" + Utils.escapeLiteral( null, s, true ).toString() + "'"; …Run Code Online (Sandbox Code Playgroud) 实习生编写了以下vb.net代码:
Public Sub PopulateUsersByName (name As String)
'Here, the parameter 'name' is unsantized, coming straight from the form
Dim query As String = ""
query += vbNewLine + " SELECT Id, FirstName, LastName FROM dbo.[Users]"
query += vbNewLine + " WHERE FirstName LIKE '" + REPLACE(name, "'", "''") + "'"
query += vbNewLine + " OR LastName LIKE '" + REPLACE(name, "'", "''") + "'"
'Execute SQLCommand with above query and no parameters
'Then do some other stuff
END Sub …Run Code Online (Sandbox Code Playgroud) Dim connection As New adodb.connection
Dim sql As String
Dim years As Integer
years = 2011
Run Code Online (Sandbox Code Playgroud)
所以我在这里有一些很好的声明变量.现在我要展示完美无缺的说法:
sql = "insert into crimeData(reportYear) values(2011)"
connection.Execute sql
Run Code Online (Sandbox Code Playgroud)
注意我今年硬编码.现在,如果我尝试:
sql = "insert into crimeData(reportYear) values(years)"
connection.Execute sql
Run Code Online (Sandbox Code Playgroud)
将变量名替换为值,我得到错误: No value given for one or more required parameters
不可否认,我假设必须有一个简单的语法问题,或者一些我缺少变量的meta.请赐教.我怎样才能在这里正确地交换变量(所以我可以以编程方式使用它,而不是在值中进行硬编码)
sanitization ×2
access-vba ×1
ado.net ×1
asp.net ×1
c# ×1
database ×1
excel ×1
excel-vba ×1
java ×1
ms-access ×1
postgresql ×1
security ×1
sql ×1
sql-server ×1
t-sql ×1
vb.net ×1
vba ×1