【问题标题】:How to make a SQLite query that avoids injection?如何进行避免注入的 SQLite 查询?
【发布时间】:2014-05-22 22:00:45
【问题描述】:

我正在尝试检查 myusername 和 mypassword 是否在数据库中,以及它们是否正在打印结果。如果结果与数据库中的内容匹配,我无法返回并显示结果,有人可以帮忙吗?

// username and password sent from form 
$myusername=$_POST['myusername']; 
$mypassword=$_POST['mypassword']; 

//echo $myusername;
//echo $mypassword;

$stmt  = $db->prepare('SELECT * FROM ADMIN_LOGIN WHERE USERNAME = $myusername AND PASSWORD = $mypassword');
//var_dump($stmt->readOnly()); // -> true

【问题讨论】:

  • 你很容易受到sql injection attacks的攻击,这尤其糟糕,因为你已经在使用准备好的语句了。
  • 这就是我想要避免的(sql 注入攻击),你建议我如何让这段代码成为 sql 注入证明?
  • 为此,我只需转到 php.net/pdo 并单击 prepare - 那里会有一个示例。 PHP 手册非常适合初学者(如果有时过于详细) - 只需输入php.net/thing,它就会搜索您。
  • 我假设您正在使用 PDO,所以我重新标记了这个问题。如果您使用不同的引擎,请对其进行编辑。
  • 这个问题似乎跑题了,因为答案在documentation

标签: php pdo sqlite


【解决方案1】:

您没有正确使用准备好的语句。准备好的语句首先向服务器发送查询内容,然后发送参数。这样服务器就不能被利用了,因为查询结构“阶段”已经完成了。

$sql = "SELECT * FROM ADMIN_LOGIN WHERE USERNAME = ? AND PASSWORD = ? LIMIT 1"
$sth = $dbh->prepare($sql);
$sth->execute(array($_POST['username'], $_POST['password']));
$res = $sth->fetch();

【讨论】:

    【解决方案2】:

    将代码重写为:

    $result = $db->query("SELECT * FROM ADMIN_LOGIN WHERE USERNAME = '$myusername' AND PASSWORD = '$mypassword'");
    
    while ($row = $result->fetchArray()) {
        print $row["USERNAME"] . "\n";
        print $row["PASSWORD"] . "\n";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-05
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      • 2020-11-21
      • 1970-01-01
      • 2010-11-01
      • 2016-01-23
      相关资源
      最近更新 更多