如何允许用户在不执行的情况下编写查询

时间:2016-05-25 13:59:12

标签: php mysql mysqli

好吧我正在制作一个差不多完成的博客..我wana允许用户发布问题,他们可以发布查询作为评论,而不允许这个查询实际执行..我试图做一些安全..我使用mysql_real_escape_string ,htmlentities(),htmlspecialchars(),strip_tags()和addslashes() ..但是,当我写的东西像 SELECT * FROM TABLE发生错误,使我无法发布评论

使用此查询插入评论

$sql = 'INSERT INTO comments (topic_id,commenters_id,comment,media,mediaType) VALUES ("' . $topic_id . '", "' . $commenter_id . '", "' . $comment . '", "' . $media . '", "' . $mediaType . '")';

1 个答案:

答案 0 :(得分:0)

您应该能够插入包含SQL的注释而不执行它。您遇到问题的原因是您将用户输入连接到SQL字符串中。如果您使用预准备语句并将用户输入绑定为参数,则您不会遇到此问题。这是一个如何执行此操作的示例(改编自PHP quickstart guide on mysqli prepared statements)。

$sql = 'INSERT INTO comments 
           (topic_id,commenters_id,comment,media,mediaType) VALUES (?, ?, ?, ?, ?)';

// prepare
if (!($stmt = $mysqli->prepare($sql))) {
    echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}

// bind parameters (I'm not sure if I picked the correct types here)
if (!$stmt->bind_param("iisss", $topic_id, $commenter_id, $comment, $media, $mediaType)) {
    echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
}

// execute
if (!$stmt->execute()) {
    echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}