在PHP中制作评论部分的安全方法

时间:2014-04-23 11:30:17

标签: php html mysql comments

美好的一天!

今天正在为我的网站制作评论部分。我知道制作评论部分并不那么难,但我想让它安全并防止SQL注入。

您有什么建议,我应该如何制作以及我应该注意什么?

我会在这里发布我的想法,以便告诉我哪个部分不安全。

让我们假设您需要注册并登录才能发表评论。

<html>
<head>
require 'connect.inc.php';
require 'function.php';
</head>
<body>

<?php
if(loggedin()){
$id = $_SESSION['user_id']; //loggedin function check if user is logged in

if(isset($_POST['comment_button'])){
$comment = $_POST['comment'];

mysql_query("INSERT INTO comments  VALUES('','$id','$comment')");
}
?>

<form>
Comment:<br>
<textarea name='comment'></textarea>
<input type="submit" name="comment_button" value="Login"/>
</form>

<?php 
}else{header('location: index.php');
} ?>

</body>
</html>

这是一些基本的想法,请注意我是所有这一切的新手,所以如果你在上面的代码中看到不好的东西,不要感到惊讶。谢谢你的帮助。

3 个答案:

答案 0 :(得分:2)

我已经重新定义了部分内容。

 <html>
 <head>
 <?php
   require 'connect.inc.php';
   require 'function.php';
 ?>
 </head>
 <body>

 <?php
 if(loggedin())
 {
    $id = $_SESSION['user_id']; //loggedin function check if user is logged in

    if(isset($_POST['comment_button']))
    {
      $mysqli = new mysqli('localhost', 'user', 'password', 'mysampledb');

    /* check connection */
    if (mysqli_connect_errno()) {
      printf("Connect failed: %s\n", mysqli_connect_error());
      exit();
    }

    $stmt = $mysqli->prepare("INSERT INTO comments VALUES (?,?,?)");
    $stmt->bind_param('sss', '', '$id', '$comment');   // bind to the parameter

    // escape the POST data for added protection
    $comment = isset($_POST['comment'])
      ? $mysqli->real_escape_string($_POST['comment'])
      : '';

   /* execute prepared statement */
   $stmt->execute();

   printf("%d Comment added successfully.\n", $stmt->affected_rows);

  /* close statement and connection */
  $stmt->close();

  /* close connection */
  $mysqli->close();

}
?>

<form>
Comment:<br>
<textarea name='comment'></textarea>
<input type="submit" name="comment_button" value="Login"/>
</form>

<?php 
}else{header('location: index.php');
} ?>

</body>
</html>

答案 1 :(得分:1)

您应该在$ comment变量中替换MySQL关键字,然后再将其传递给查询字符串。使用filter_input或mysql_real_escape_string函数来防止注入。另外,您可以使用其他方法来执行更安全的SQL部分。

答案 2 :(得分:0)

$comment=filter_input(INPUT_POST,"comment",FILTER_SANITIZE_STRING);

有关此here

的更多信息