mysqli_real_escape和mysqli准备两个转变量null?

时间:2013-04-08 15:47:11

标签: php mysql

自从阅读有关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();

有什么想法?谢谢

2 个答案:

答案 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'];