-2

好的,所以我有一些 PHP 将变量传递到页面的 URL。PHP 页面选择名为“item1”的变量,然后在变量前面添加一个字符串,如下所示(例如,假设变量为 10):

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

这会在网页上打印“table-10”。杰出的。

现在我想将它传递给 MySQL 选择语句,以便它可以查询名为“table-10”的表:

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

但是,这不起作用。我在这里做了什么很愚蠢的事情吗?任何帮助表示赞赏。

编辑:

感谢所有帮助人员,关于 SQLi 注入,您的评论表示赞赏,但是这是一个仅限本地的系统,没有外部暴露,因此任何漏洞利用都相当不重要。这个系统只是一个概念证明,所以当我真正构建完整的系统时,我会确保它不包含任何漏洞。问题已通过使用反引号解决,非常感谢!

4

3 回答 3

0

使用如下查询

$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博客上的一篇文章解释了它和处理它的措施。

于 2013-02-14T16:11:47.890 回答
0

试试这个:

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

顺便说一句,您的代码容易受到SQL 注入的攻击。使用 PDO 扩展而不是 mysql_* 函数。

于 2013-02-14T16:12:20.497 回答
0
  1. 因为表名中有一个连字符,所以您需要在 SQL 字符串中用反引号字符将其包装起来,以便 mySQL 识别它。例如:

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

    为避免这种情况,您需要“清理”输入。在您的情况下,由于您知道该值应该始终是一个数字,因此将其强制为整数就足够了,因此它会丢弃黑客可能传递的任何偷偷摸摸的额外查询数据。例如:

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

    (另请注意,如果item1根本没有通过,那么当您尝试引用它时,PHP 会抛出一条警告消息。我现在将忽略它,但您也应该修复它)

  3. 您没有提供太多关于您的数据库结构的信息,但是您提供的代码中给出的提示指向一个非常糟糕的数据库设计。因为这是一个很大的话题,所以我不会在这里详细介绍,但可以说动态表名通常是一个坏主意,就像没有WHERE子句的 select 一样。并且SELECT *在某些圈子中也不受欢迎,因为最好明确指定字段(尽管*如果您有很多字段,这可能是一个有用的快捷方式)。

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

于 2013-02-14T16:33:52.260 回答