2013-02-14 58 views
-2

好的,所以我有一些PHP将一个变量传递给页面的URL。 PHP页面拿起名为“物品1”的变量,它然后添加一个字符串变量前面如下(为示例的缘故可以说,该变量为10):将一个PHP变量传递给SQL select查询

$v1 = $_GET['item1']; 
echo "$v1"; 
$v2 = 'table-'; 
$v3 = $v2.$v1; 
echo "$v3"; 

这版画“表-10 “在网页上。辉煌。

现在我想这个传递到一个MySQL的SELECT语句,以便它可以查询命名为“表10”表:

$sql = "select * from $v3"; 
     $result = mysql_query ($sql); 

然而,这是行不通的。我在这里做一些非常愚蠢的事情吗?任何帮助表示赞赏。

编辑:

感谢所有帮助家伙,关于SQLI注入你的意见是赞赏然而,这是一个没有对外暴露什么那么所以任何攻击都是因为它的立场相当不重要本地唯一的系统。这个系统只是一个概念证明,所以当我真正建立完整的系统时,我会确保它不包含任何漏洞利用。通过使用反引号解决了这个问题,非常感谢!

+6

[**请不要在新的代码中使用'mysql_ *'功能**]( http://bit.ly/phpmsql)。他们不再被维护[并被正式弃用](https://wiki.php.net/rfc/mysql_deprecation)。看到[**红框**](http://j.mp/Te9zIL)?学习[*准备的语句*](http://j.mp/T9hLWi),并使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [这篇文章](http://j.mp/QEx8IB)将帮助你决定哪个。如果你选择PDO,[这里是一个很好的教程](http://www.brightmeup.info/article.php?a_id=2)。 – insertusernamehere 2013-02-14 16:11:59

+3

请仔细阅读:http://bobby-tables.com – insertusernamehere 2013-02-14 16:13:07

+0

你这样做的方式,它是*宽*开放被黑客入侵。你需要立即停止你正在做的事情,并且去研究一下“SQL注入攻击”的主题。确保你了解它们是什么以及它们是如何执行的,以及为什么你的代码易受攻击。 – SDC 2013-02-14 16:13:59

回答

0
  1. 因为表名中有一个连字符,所以需要将它包装在SQL字符串中的反引号字符中,以便mySQL识别它。例如:

    SELECT * FROM `table-10` 
    
  2. 因为你接受表名作为$_GET变量的一部分,它是容易受到SQL注入式攻击。这意味着黑客可以向包含其他SQL命令的$_GET['item1']发布值,并在您不知情的情况下执行这些命令。通过这样做,可以从数据库中找到他想要的任何数据,并且还可以修改数据。

    为了避免这种情况,您需要“清理”输入。在你的情况中,因为你知道值始终应该是一个数字,所以强制它成为一个整数就足够了,因此它可以抛弃黑客可能通过的任何鬼鬼祟祟的额外查询数据。例如:

    $v1 = (int)$_GET['item1']; 
    

    (也注意,如果item1完全不通过,那么PHP会当您尝试引用它抛出一个警告消息,我会忽略了一步,但你或许应该解决这个问题。太)

  3. 你还没有给出关于你的数据库结构的很多信息,但是你提供的代码中给出的提示指向了非常差的数据库设计。由于这是一个很大的话题,所以我不会在这里详细讨论,但可以说动态表名通常是一个坏主意,就像没有WHERE条款的选择一样。 SELECT *在一些圈子中也不被赞同,因为最好明确指定字段(尽管如果你有很多字段,*可能是一个有用的捷径)。

  4. 最后,请避免使用旧的mysql函数。他们已经过时了。 mysqli库非常相似,并且很容易切换到。 (如果你基于老mysql功能阅读教程,那么你应该找到一些更好的教程!)

0

使用query如下

$sql = "select * from '$v3'"; 
     $result = mysql_query ($sql); 

和不使用mysql_ * https://wiki.php.net/rfc/mysql_deprecation。使用mysqli_ *代替

使用它作为

$sql = "select * from '$v3'"; 
      $result = mysqli_query ($sql); 

但还是很容易受到SQL注入。

使用

mysqli_real_escape_string 



$v3= $mysqli->real_escape_string($v3); 


    //Now this is the string with special chars escaped 

,现在用它作为查询

$sql = "select * from '$v3'"; 
      $result = mysqli_query ($sql); 

simonwhatley博客上的一篇文章解释了它和措施来处理它。

+0

实际上,由于'$ v3'是一个表名,所以它应该包含在反标记中,而不是引号中。而且你甚至没有解决这个巨大的安全漏洞。 – SDC 2013-02-14 16:15:29

+0

哦,对不起..我编辑它。 – prakashchhetri 2013-02-14 16:15:57

+0

我看到一个编辑,但我没有看到任何反引号,也没有关于如何解决SQL注入攻击的任何建议。 – SDC 2013-02-14 16:20:18

0

试试这个:

$result = mysql_query ($sql) or die(mysql_error()); 

顺便问一下,你的代码很容易受到SQL Injection。使用PDO扩展而不是mysql_ *函数。

+1

只是切换到pdo或mysqli不会解决在这种情况下的SQL注入。建议切换到较新的API是一件好事,但如果实际的SQL字符串仍然存在漏洞,则它们不能解决问题。 – SDC 2013-02-14 16:19:35

+0

谢谢,我总是忘记提及这一点。 – fonini 2013-02-14 16:21:00