美好的一天!
今天正在为我的网站制作评论部分。我知道制作评论部分并不那么难,但我想让它安全并防止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>
这是一些基本的想法,请注意我是所有这一切的新手,所以如果你在上面的代码中看到不好的东西,不要感到惊讶。谢谢你的帮助。
答案 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
的更多信息