我一直在对SQL注入进行一些研究,到目前为止我所能看到的是当你将查询字符串与变量连接起来时,你就会遇到问题。
我的问题是:
如果我有这段代码:
$query = "SELECT id, name, inserted, size FROM products";
$result = odbc_exec($conn, $query);
我是否接受sql注入?我不这么认为,但我在stackoverflow上发现了一个帖子,表明它是。
现在,如果我有这段代码:
$variable = "name";
$query = "SELECT"' .$variable. ' FROM products";
$reulst = odbc_exec($conn, $query);
我还在注射吗?在我看来,我完全控制了该变量,代码在服务器端运行,这样才是安全的。这是对的吗?
提前感谢任何输入!
答案 0 :(得分:6)
如果您有来自您无法信任的来源的输入,则SQL注入通常是个问题。在你的两个例子中都没有看到这种情况,就恶意攻击而言,你就没事了。
但是,最好在将$variable
插入查询字符串之前将其转义,即使您控制它也是如此。
答案 1 :(得分:2)
如果您允许任何用户输入您的查询,则您很容易进行SQL注入。通过提供的两个示例,用户没有输入任何内容,因此这些都是安全的。
答案 2 :(得分:2)
第一个查询不受注入,因为没有动态部分。
第二个是。即使您想,您也可以完全控制您的变量,如果您使用的是用户提供的数据(无论是来自表单sumbit,cookies等......),您也可能容易受到攻击。
始终通过SQL库使用参数化查询,以确保数据安全转义。
答案 3 :(得分:1)
查询可以曝光的唯一情况是当部分内容从输入传递时。
$variable = $_GET["name"];
$query = "SELECT " .$variable. " FROM products"; // now things can get bad
$reulst = odbc_exec($conn, $query);
在查询中使用输入变量的一种正确方法是转义:
$variable = addslashes($_GET["name"]); // sanitizing input
$query = "SELECT " .$variable. " FROM products"; // all good here
$reulst = odbc_exec($conn, $query);
答案 4 :(得分:0)
问题是“你的变量的价值来自哪里?”如果您在查询中使用用户提交的数据,那么您需要小心如何使用它。在你的情况下,就我所知,你是安全的。
答案 5 :(得分:0)
对于第一个示例,不,您将不会受到任何SQL注入,因为用户无法输入任何内容来更改您的查询。
在第二种情况下,如果$variable
来自某些用户输入,则只能进行注射。
答案 6 :(得分:0)
只要你将用户输入直接输入$ query,就很容易被sql注入。您显示的第一个代码很好,它是一个直接查询,用户无法输入任何有害代码。
$query = "SELECT id, name, inserted, size FROM products";
$result = odbc_exec($conn, $query);
但是第二个代码片段(如果$ variable是从表单中获取的),任何人都可以输入有害代码并终止您的数据库。
$variable = $_POST['name']; **for instance, this would be bad!
$query = "SELECT"' .$variable. ' FROM products";
$reulst = odbc_exec($conn, $query);
$ variable如何获得其值?