参数用于保护您免受恶意用户输入.
但是如果参数需要一个字符串,是否可以编写将被解释为sql的输入,因此恶意用户可以使用"DROP","TRUNCATE"等内容......?
asp,asp.net,java等参数之间的保护是否存在差异?
另请参阅:参数是否足以阻止SQL注入?
参数化查询通常引用参数,如果它是场景后面的字符串,那么普通的SQL运算符不会被解释为这样.这意味着即使用户输入潜在的恶意数据,也只是将其视为字符串输入而不是解释为SQL运算符/命令.
在各种框架中如何实现它可能存在技术差异,但基本思想(和结果)是相同的.
你需要小心你的定义.'参数'可能意味着许多事情; 例如,存储过程的参数根本不会保护您自己.以Java为例:
sql = "exec proc_SearchForUser '" + userNameToSearch + "'";
没有比原始更好或更差
sql = "SELECT * FROM Users WHERE userName = '" + userNameToSearch + "'";
并且对用户名也很敏感
';DROP TABLE users;--
另一方面,参数化查询是安全的.他们可能看起来像
PreparedStatement statement = con.prepareStatement("SELECT * FROM Users WHERE userName = ?");
或者确实
PreparedStatement statement = con.prepareStatement("exec proc_SearchForUser ?");
这是安全的原因是因为当你填写价值时......比方说,
statement.setString(1, userName);
然后字符串 - 甚至像"'; DROP TABLE用户; - " - 将由数据库引擎正确转义并呈现无害.
它仍然可以搞砸 - 例如,如果你的存储过程只是在内部构建一个SQL字符串并执行它,信任输入 - 但是带参数的预处理语句意味着没有未转义的数据将永远不会到达数据库服务器切断那个攻击向量.