【问题标题】:Php Numrows problemphp numrows 问题
【发布时间】:2009-10-22 09:36:44
【问题描述】:

我使用查询字符串来访问我的页面。如果有人手动键入未知查询字符串,我会尝试使其重定向到某个地方..

例如:

网址:test.php?m=1(这是一个有效的网址) test.php?m=1324234 (这不是一个有效的 url ) test.php?m=1asdaa(这不是一个有效的 url)

include("config/database.inc");
$qm=$_GET['m'];
 $query = "select acc from test where acc=$qm"; 
 $numresults=mysql_query($query);
 $numrows=mysql_num_rows($numresults);
  if ($numrows == 0){
          header("Location: index.php"); 
          exit;
     }

在数据库中我有两行,LINE 1: acc=1;第 2 行:acc=2;

如果我输入网址:test.php?m=12312431,然后重定向到 index.php 'coz $numrows=0.没关系。 但是如果我输入:test.php?m=1sdfsfsf,然后我得到这个错误消息: 警告:mysql_num_rows():提供的参数不是有效的 MySQL 结果资源。

我该怎么做?需要在从数据库查询之前检查 $_GET['m'] 吗?

谢谢。

【问题讨论】:

    标签: php sql


    【解决方案1】:

    在没有正确过滤和转义的情况下,永远不要将 GET 变量的值直接放入 SQL 查询中。您的问题是您允许将不是数字的内容放入 SQL 查询中。在这种特殊情况下,您的测试是无害的,只是错误,但恶意用户也可以通过 SQL 注入做更有害的事情。

    相反,您真正想要做的是将变量的值转换为您知道可以使用的类型(在本例中为整数),然后使用该类型查询数据库。试试这个:

    include("config/database.inc");
    $qm=intval($_GET['m']);
     $query = "select acc from test where acc=$qm"; 
     $numresults=mysql_query($query);
     $numrows=mysql_num_rows($numresults);
      if ($numrows == 0){
              header("Location: index.php"); 
              exit;
         }
    

    注意对 intval() 的调用,它强制结果为整数值,而不是可能有害的字符串。

    【讨论】:

    • “潜在有害字符串”当然是在这种情况下 SQL 注入。 en.wikipedia.org/wiki/Sql_injection
    • 谢谢! (我将阅读有关 sql_injection 的信息!感谢您的链接)
    • 顺便说一句。我可以检查查询字符串是否为整数吗? $qm=intval($_GET['m']);这将始终转换,但如果 somone 键入有效的 url,则没有必要..
    • 无论如何我都会使用 intval() 。如果它是一个有效的 URL,那么它仍然可以工作,而且它基本上和调用 is_numeric() 一样快。
    【解决方案2】:

    这样做:

    $qm=intval($_GET['m']);
    

    【讨论】:

      【解决方案3】:

      如果 m 无效,mysql_query 将返回 $query = false。

      如果你向 mysql_num_rows 提供“false”,它不知道你发送了什么查询,并且正确地得到一个无效的 numrows 结果,例如失败。

      用 intval($m); 检查 m 是否为整数;

      【讨论】:

        【解决方案4】:

        除了像其他人建议的那样验证输入或强制进行类型转换以确保输入有意义之外,请尝试养成将传递给查询的用户提交的值括在引号中的习惯,例如

        $query = "select acc from test where acc='$qm'"; 
        

        虽然在这里您在技术上将整数与字符串进行比较,但 MySQL 允许这样做(并且在可用的情况下仍将使用整数键),并且如果您忘记过滤输入,它会提供最后一道防线。

        【讨论】:

          猜你喜欢
          • 2015-04-10
          • 1970-01-01
          • 2012-09-01
          • 2021-06-09
          • 1970-01-01
          • 2018-01-12
          • 2010-09-10
          • 2011-10-12
          • 2010-10-10
          相关资源
          最近更新 更多