Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql参数保护您什么?_Sql_Database_Security_Parameters - Fatal编程技术网

sql参数保护您什么?

sql参数保护您什么?,sql,database,security,parameters,Sql,Database,Security,Parameters,参数用于保护您免受恶意用户输入的影响 但是如果参数需要一个字符串,是否有可能写入将被解释为sql的输入,以便恶意用户可以使用诸如“DROP”、“TRUNCATE”等东西 asp、asp.net、java和其他语言中的参数在保护方面是否存在差异 另请参见:不作为参数。SQL注入依赖于将恶意代码连接到SQL字符串中,然后从该字符串执行SQL语句。准备好的语句接受参数,而不考虑内容。对于准备好的语句,SQL语句本身的实际文本永远不会更改。唯一的风险是对参数化字符串执行exec 在所有其他情况下,参数

参数用于保护您免受恶意用户输入的影响

但是如果参数需要一个字符串,是否有可能写入将被解释为sql的输入,以便恶意用户可以使用诸如“DROP”、“TRUNCATE”等东西

asp、asp.net、java和其他语言中的参数在保护方面是否存在差异



另请参见:

不作为参数。SQL注入依赖于将恶意代码连接到SQL字符串中,然后从该字符串执行SQL语句。准备好的语句接受参数,而不考虑内容。对于准备好的语句,SQL语句本身的实际文本永远不会更改。

唯一的风险是对参数化字符串执行
exec


在所有其他情况下,参数化查询都是安全的。

如果参数是幕后的字符串,则参数化查询通常会引用该参数,以便正常的SQL运算符不会被解释为这样。这意味着,即使用户输入了潜在的恶意数据,也只会将其视为字符串输入,而不会解释为SQL运算符/命令


在不同的框架中如何实现它可能存在技术差异,但基本思想(和结果)是相同的。

否。SQL注入攻击可以从任何SQL数据库中的任何语言发生。您所指的攻击类型是当程序员在其源代码中使用动态SQL(如“USER_NAME=sName”)时,用户可以为用户名输入不受限制的文本,以便添加注释,然后键入任何新的SQL语句,如“DROP”、“TRUNCATE”等。

通过bindWhather()输入的任何内容都不能作为参数调用可以作为SQL执行

在绑定ht可评估数据之前,已经对SQL进行了分析和评估,因此不可能将此数据误认为SQL

当然,当数据库将忠实地存储并可能在其他人的浏览器上执行时,有人仍然可以向您传递一些JavaScript


因此,您仍然需要删除输入(或至少转义)任何({[]})\type字符

你需要小心你的定义。”“参数”可能意味着很多事情;例如,存储过程的参数本身并不能保护您。以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 users;——”这样的字符串——也会被DB引擎正确转义并呈现为无害的


仍然有可能把它拧起来——例如,如果你的存储过程只是在内部构建SQL字符串并执行它,信任输入——但是用参数准备的语句意味着没有未逃脱的数据将永远到达DB服务器,完全切断该攻击向量。“DROP”语句等将被过滤?未过滤,从未实际执行。它们不能更改SQL查询的文本。如果您有一个实际构造和执行SQL字符串的存储过程(如海报所述),那么问题仍然可能发生。如果是参数化查询,SQL并不像其他人所指出的那样是通过字符串连接来构造的,因此执行的参数中不可能有令人讨厌的内容(除非您使用exec)此外,参数还可以为您执行数据转换。这在存储日期或日期时间值时特别有用。