自从阅读有关mysql注入的内容以来,我一直试图保护我的代码几天。我遇到的麻烦是,当我编辑我的代码以添加mysqli_real_escape_string时,它会将我尝试插入数据库的变量更改为null。
所以没问题,我想,我可以更进一步,使用准备好的声明。唯一的问题是,即将所有POST变量更改为null。不知道该怎么办。以下两个代码都运行没有错误,除了第一个将所有内容输入数据库,除了$ escapecomment和第二个插入NOTHING到数据库。
我已经看了很多,但在搜索其他人已经纠正的问题时似乎不是我的问题。我100%确定变量有一个值,就像我删除$ escapecomment = mysqli_real_escape_string($ _ POST ['comment']);并且只是使$ $ POST ['评论']而不是$ escapecomment它完美地工作,但显然,不是很安全。感谢您的时间和知识。
mysqli_real_escape_string
的第一个代码$con=mysqli_connect($host,$username,$password,$dbname);
if (mysqli_connect_errno())
{
mysqli_connect_error();
}
$escapecomment = mysqli_real_escape_string($_POST['comment']);
$sql="INSERT INTO comments (cid, username, comment)
VALUES
('$_POST[cid]','$_POST[username]','$escapecomment')";
if (!mysqli_query($con,$sql))
{
die('Error: ' . mysqli_error());
}
mysqli_close($con);
我使用预准备语句的第二个代码
$con=mysqli_connect($host,$username,$password,$dbname);
// Check connection
if (mysqli_connect_errno())
{
mysqli_connect_error();
}
/* Create the prepared statement */
if ($stmt = $con->prepare("INSERT INTO comments (cid, username, comment) values (?, ?, ?)")) {
/* Bind our params */
$stmt->bind_param('iss', $ccid, $cusername, $ccomment);
/* Set our params */
$ccid = $_POST[cid];
$cusername = $_POST_['username'];
$ccomment = $_POST['comment'];
/* Execute the prepared Statement */
$stmt->execute();}
$stmt->close();
有什么想法?谢谢
答案 0 :(得分:0)
您真正需要的是正确的错误报告。
ini_set('display_errors',1);
error_reporting(E_ALL);
在本地开发服务器上使用这些设置始终代码。并且在实时转向第一个选项为0.
这是你的主要问题,让你失明,无法看到发生了什么。
您提到的每个问题都会引发错误,非常冗长且信息丰富。但你蒙蔽了自己,却没有看到它们。程序员应该能够看到发生的每个错误。错误消息是您最好的朋友和帮助者,他们会告诉您比10 SO志愿者更多有用的代码信息。
顺便说一下,由于某种原因,你只格式化评论,但既不是id或名字。这样你就可以保护自己免受注射
然而,mysqli函数不会自己引发错误。你必须明确地问他们。总是检查每个mysqli操作的结果,如果它是假的 - 抛出$ mysqli->错误
答案 1 :(得分:-1)
$cusername = $_POST_['username'];
中有一个拼写错误,有一个额外的_
,应该是$cusername = $_POST['username'];