我在做mysqli吗?

时间:2014-04-19 11:20:14

标签: php mysqli

我在stackoverflow上提出的每个问题都收到了一个问题,即我的脚本中很容易注入php。

我现在是一个例子,并在youtube上查看了一些教程。 我现在这样做吗? 这是我现在正在工作的一个例子

if($user->isLoggedIn()) {
    $pakuser = $user->data()->username;
    $sql = $db->query("SELECT * FROM users
        INNER JOIN post ON users.username = post.add
        WHERE post.id = $id AND post.add = '$pakuser'")
        or die(mysql_error());         

    if ($sql === FALSE) {

    }
    if($row = $sql->fetch_object())
    if($row->add)
    {               
?>     
    <p><a href="editpost.php?id=<?php echo htmlspecialchars($gooo->id);?>">edit this post</a><br><br>BEWARE OF DELETING YOUR CONTENT THERE IS NO GO-BACK<BR><a href="delete.php?id=<?php echo htmlspecialchars($gooo->id); ?>">Delete this post</a> </p>
<?php
    }
}

2 个答案:

答案 0 :(得分:-1)

看起来您仍然只是将变量直接传递到查询中。是的,这可能有效,但没有必要安全。

您可以查看使用PDO,它可以验证您想要传递到查询中的数据类型,而不仅仅是将变量传递给查询字符串。 / p>

在使用mysqli方面,如果你还没有,请查看mysqli_real_escape_string。它是well documented

答案 1 :(得分:-1)

每次用户都可以不受任何限制地操纵您的sql-query,就会出现安全问题。这是一个例子:

$query_string = "SELECT * FROM user WHERE (name='$username' AND password='$password')";

如果用户发送如下密码:

  

&#34;某事&#39;)或(&#39; 1&#39; =&#39; 1&#34;

查询将更改为:

$query_string = "SELECT * FROM user WHERE (name='Name' AND password='something') OR ('1' = '1')";

因为&#39; 1&#39; =&#39; 1&#39;总是如此,这将返回数据库中的每个用户。

相反,您可以将上面的示例更改为:

$query = mysqli->prepare('SELECT * FROM user WHERE (name=? AND password=?)');
$query->bind_param('ss', $username, $password);
$query->execute();

这将过滤掉所有可能破坏您的SQL查询的字符串。