Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 停止用户多次发布_Php_Mysql_Forms_Post - Fatal编程技术网

Php 停止用户多次发布

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

在发布我的表单之前,我正在检查数据库,以查看是否有来自用户的任何以前的帖子。如果有以前的帖子,那么脚本将回退一条消息,说你已经发布了

问题是,我试图实现的目标不起作用,在我的else声明之后,一切都出了问题。也可能存在sql注入漏洞。你能帮忙吗

<?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提到)