Php 停止用户多次发布
在发布我的表单之前,我正在检查数据库,以查看是否有来自用户的任何以前的帖子。如果有以前的帖子,那么脚本将回退一条消息,说你已经发布了 问题是,我试图实现的目标不起作用,在我的else声明之后,一切都出了问题。也可能存在sql注入漏洞。你能帮忙吗Php 停止用户多次发布,php,mysql,forms,post,Php,Mysql,Forms,Post,在发布我的表单之前,我正在检查数据库,以查看是否有来自用户的任何以前的帖子。如果有以前的帖子,那么脚本将回退一条消息,说你已经发布了 问题是,我试图实现的目标不起作用,在我的else声明之后,一切都出了问题。也可能存在sql注入漏洞。你能帮忙吗 <?php include '../login/dbc.php'; page_protect(); $customerid = $_SESSION['user_id']; $checkid = "SELECT customerid FROM
<?php
include '../login/dbc.php';
page_protect();
$customerid = $_SESSION['user_id'];
$checkid = "SELECT customerid FROM content WHERE customerid = $customerid";
if ($checkid = $customerid) {echo 'You cannot post any more entries, you have already created one';}
else
$sql="INSERT INTO content (customerid, weburl, title, description) VALUES
('$_POST[customerid]','$_POST[webaddress]','$_POST[pagetitle]','$_POST[pagedescription]')";
if (!mysql_query($sql))
{
die('Error: ' . mysql_error());
}
echo "1 record added";
?>
缺少花括号{}
:
<?php
if ($checkid == $customerid) {echo 'You cannot post any more entries, you have already created one';}
else
{
$sql="INSERT INTO content (customerid, weburl, title, description) VALUES
('$_POST[customerid]','$_POST[webaddress]','$_POST[pagetitle]','$_POST[pagedescription]')";
if (!mysql_query($sql))
{
die('Error: ' . mysql_error());
}
echo "1 record added";
}
?>
Re:sql注入-任何时候信任用户的数据都会受到攻击。把你的INSERT语句整理一下
$sql = sprintf("INSERT INTO content (customerid, weburl, title, description) VALUES ('%d','%s','%s','%s')",
$_POST['customerid'], //forced as digit
mysql_real_escape_string($_POST['webaddress']),
mysql_real_escape_string($_POST['pagetitle']),
mysql_real_escape_string($_POST['pagedescription']) );
此外,您应该在数组键中使用撇号。在双引号中,即:
echo "Post data webpage title is {$_POST['pagetitle']}";
要回答问题的第二部分:是的,您非常容易受到SQL注入的攻击:
$sql="INSERT INTO content (customerid, ...) VALUES ('$_POST[customerid]', ...)";
^
解释SQL注入以及如何避免PHP中的漏洞。$\u浏览器关闭时,会话将被清除。因此,我建议一定要使用Cookies
我已将您的代码更新如下:
include '../login/dbc.php';
page_protect();
$customerid = $_COOKIE['user_id'];
$checkid = "SELECT customerid FROM content WHERE customerid = $customerid";
if ($checkid = $customerid) {echo 'You cannot post any more entries, you have already created one';}else{
$sql="INSERT INTO content (customerid, weburl, title, description) VALUES
('$_POST[customerid]','$_POST[webaddress]','$_POST[pagetitle]','$_POST[pagedescription]')";
if (!mysql_query($sql))
die('Error: ' . mysql_error());
else
echo "1 record added";
}
如果您担心注入,请在插入查询之前添加此小贴士:
foreach($_POST as $key=>$value){
$_POST[$key] = addslashes($value);
}
除了前面提到的缺少的大括号外,看起来您正在if语句中赋值,这将导致语句的计算结果始终为true:
if ($checkid = $customerid) {echo 'You cannot post any more entries, you have already created one';}
应该是:
if ($checkid == $customerid) {echo 'You cannot post any more entries, you have already created one';}
另外,$checkid
包含一个SQL查询字符串。我假设您打算在实际进行比较之前,实际运行查询并使用类似于$customerid
的内容填充$checkid
。除了SQL注入(伙计,在开始之前阅读一本书/教程!)和else后面缺少的大括号,这里有两个错误:首先,您没有执行$checkid
查询,其次,if
中只有一个=
(因此您将$customerid
的值分配给$checkid
)
也可能存在sql注入漏洞
为什么“可能”?你自己难道看不出来吗?难道你编写代码的方式一开始就避免了这些问题吗?可能与仅供参考的内容重复,使用$\u会话
用户id验证客户可能不是最好的办法,但随后使用$\u POST
用户id插入记录。有人很容易欺骗另一个用户使用此方法,即使没有SQL注入。请注意,这不是我防止注入攻击的方法,但它是脚本的快速修补程序。只有在浏览器关闭时,如果使用查询变量而不是cookies,会话才会丢失(这两个选项都适用于本机PHP会话),如果cookie过期设置不正确。此外,用户可以使用一些简单的javascript更改cookie方法,因此,即使在应用了tidbit之后,cookie方法也可以被注入。不要忘了也要修复if()语句,因为这是一个默认值,并且将始终计算为true(Taiko提到)