SQL参数化现在是一个热门话题,并且有充分的理由,但除了正确地逃避之外,它真的做了什么吗?
我可以想象一个参数化引擎只是在将数据插入查询字符串之前确保数据被正常转义,但实际上它是什么呢?在连接中做一些不同的事情会更有意义,例如:
> Sent data. Formatting: length + space + payload
< Received data
-----
> 69 SELECT * FROM `users` WHERE `username` LIKE ? AND `creation_date` > ?
< Ok. Send parameter 1.
> 4 joe%
< Ok. Send parameter 2.
> 1 0
< Ok. Query result: [...]
Run Code Online (Sandbox Code Playgroud)
这种方式可以简单地消除SQL注入的问题,因此您不必通过转义来避免它们.我可以想到参数化可能如何工作的唯一方法是通过转义参数:
// $params would usually be an argument, not in the code like this
$params = ['joe%', 0];
// Escape the values
foreach ($params as $key=>$value)
$params[$key] = …Run Code Online (Sandbox Code Playgroud) 当我们遇到关于SQL注入的问题时,我和同事正在浏览它,它让我们感到疑惑:参数化查询如何在内部工作?您使用的API(假设它支持参数化查询)是否执行连接,将查询与参数组合?或者参数是否与查询分开进入SQL引擎,并且根本不执行连接?
谷歌并没有很大的帮助,但也许我们没有找到正确的东西.
我dblArrayFld在表中有一个双精度数组字段myTable,我想使用 Spring 更新它NamedParameterJdbcTemplate(我使用的是 Postgres)。
我正在运行这样的代码:
SqlParameterSource params = (new MapSqlParameterSource())
.addValue("myarray", myDblArrayListVar)
.addValue("myid", 123);
namedJdbcTemplate.update("UPDATE myTable SET dblArrayFld = :myarray WHERE idFld = :myid", params);
Run Code Online (Sandbox Code Playgroud)
这将返回一个错误,读取“$2”处或附近的语法错误
我假设我的 :myarray 语法在这里有问题。我还尝试:myarray通过以下方式封装:
dblArrayFld={:myarray}dblArrayFld={ :myarray }dblArrayFld=[:myarray]dblArrayFld=ARRAY[:myarray]dblArrayFld=(:myarray)这里的正确语法是什么?
我正在尝试使用 PDO 中的绑定从 Microsoft SQL 数据库中选择一些条目。我使用的代码看起来与我在文档中找到的相似。但是,当我运行它时,我收到以下警告:
警告:PDOStatement::execute() [pdostatement.execute]:SQLSTATE[42000]:语法错误或访问冲突:1087 [Microsoft][SQL Native Client][SQL Server]必须声明表变量“@P1”。(SQLExecute[1087] at ext\pdo_odbc\odbc_stmt.c:254) in (long file path) on line 40
这是相关的代码:
$table = "[User Site]";
$user = "demo";
$sql = "SELECT * FROM ? WHERE user='?'";
$sth = $db->prepare($sql);
$sth->bindValue(1, $table, PDO::PARAM_STR);
$sth->bindValue(2, $user, PDO::PARAM_STR);
$sth->execute(); // <-- line 40
$data = $sth->fetch(PDO::FETCH_ASSOC);
Run Code Online (Sandbox Code Playgroud)
这可能是相关的。当我尝试使用命名参数标记 (:table, :user) 而不是问号时,我得到以下信息:
警告:PDOStatement::bindValue() [pdostatement.bindvalue]:SQLSTATE[HY093]:无效的参数号:参数未在第 39 行的(长文件路径)中定义
为什么它不喜欢我准备好的声明?
我有一个奇怪的继承问题,我不明白为什么它不应该工作:
public interface A { }
public interface B extends A {}
public class C {
void test() {
ArrayList<A> foo = new ArrayList<B>();
}
}
Run Code Online (Sandbox Code Playgroud)
但编译给我以下错误
Type mismatch: cannot convert from ArrayList<B> to ArrayList<A> C.java /bla/src/de/plai/test line 8 Java Problem
试着想办法从2小时减去5分钟.
从2中减去5是没有意义的,因为我们最终得到-3个通用时间单位,这是没用的.但如果"小时"是"分钟"的子类型,我们可以将2小时转换为120分钟,并且产生115分钟,或1小时55分钟.
同样地,如果我们想要将5个苹果添加到5个橙子中,我们无法用苹果来评估这个,但可能最终得到10个果实.
在上面的例子中似乎,并且通常当使用数字作为形容词时,整数需要通过它们描述的对象的类型来参数化.我认为如果不是宣布它会非常有用
val hours = 2
val minutes = 5
Run Code Online (Sandbox Code Playgroud)
你可以做点什么
val hours = 2[Hour]
val minutes = 5[Minute]
val result = hours - minutes
assert (result == 115[Minute])
Run Code Online (Sandbox Code Playgroud)
这样的事情是否存在,是否有用,是否可以实施?
编辑:澄清一下,上面的时间例子只是我想到的一个随机例子.我的问题更多的是,参数化数字的概念是否是一个有用的概念,就像你有参数化列表等(答案可能是"不",我不知道!)
我有一个选择声明
command.commandText = "SELECT FIRSTNAME, LASTNAME FROM MYTABLE" +
" WHERE STATE LIKE @STATE + '%';";
Run Code Online (Sandbox Code Playgroud)
这给了我一个"'"错误
我试过这个
command.commandText = "SELECT FIRSTNAME, LASTNAME FROM MYTABLE" +
" WHERE STATE LIKE @STATE" + "'%';";
Run Code Online (Sandbox Code Playgroud)
这给了'%'错误......正确的方法是什么
我有一个构建动态参数化SQL查询的应用程序.以下查询返回"语法错误在或附近"的内部异常="...
我认为这是我将参数分配给列名的方式但是,我不确定.代码如下.
SELECT TOP 50 77 AS Repository, DocID, LastFileDate, ImageCount,
LockedUserID, DocClass, Offline, FileType, OrigFileName, C_CredCardSSN, C_CredCardName,C_CredCardDocType, C_CredCardDocDate, C_CredCardStatus
FROM D77
WHERE C_CredCardSSN
LIKE C_CredCardSSN = @sp1%
ORDER BY C_CredCardSSN,C_CredCardName
Run Code Online (Sandbox Code Playgroud)
编辑:谢谢大家.所有这些答案都有帮助.=)
我有一个测试Web服务的应用程序.我想每天下午6点运行这个应用程序.
我想知道是否可以自动执行此操作?
*有关信息:此应用程序是使用Java,JUnit参数化测试,maven ..., OS:Windows 7*开发的
parameterized ×10
java ×3
sql ×3
asp.net ×1
c# ×1
inheritance ×1
jdbc ×1
jdbctemplate ×1
jenkins ×1
maven ×1
mysql ×1
pdo ×1
php ×1
postgresql ×1
scala ×1
select ×1
sql-server ×1
types ×1