Прекратить публикацию пользователей более одного раза - PullRequest
2 голосов
/ 27 мая 2010

Перед размещением своей формы я проверяю базу данных, чтобы увидеть, есть ли какие-либо предыдущие сообщения от пользователя. Если есть предыдущие сообщения, сценарий отзовет сообщение о том, что вы уже опубликовали.

Проблема в том, что то, что я пытаюсь достичь, не работает, все идет не так, как надо после моего заявления else. Также вероятно, что существует уязвимость SQL инъекций. Вы можете помочь? 4

<?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";

?>

Ответы [ 6 ]

4 голосов
/ 27 мая 2010

Чтобы ответить на вторую часть вашего вопроса: да, вы очень уязвимы для SQL-инъекций :

$sql="INSERT INTO content (customerid, ...) VALUES ('$_POST[customerid]', ...)";
                                                     ^

В этой статье объясняется SQL-инъекция икак избежать уязвимости в PHP.

4 голосов
/ 27 мая 2010

Вам не хватает фигурных скобок {}:

<?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";
}

?>
2 голосов
/ 27 мая 2010

В дополнение к отсутствующим фигурным скобкам, упомянутым ранее, похоже, что вы назначаете в операторе 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. Я предполагаю, что вы действительно собираетесь выполнить запрос и заполнить $checkid чем-то сравнимым с $customerid, прежде чем приступить к сравнению.

1 голос
/ 28 мая 2010

В дополнение к SQL-инъекциям (человек, прочитайте книгу / учебник об этом перед тем, как начать!) И пропущенным скобкам после остального, у вас есть две ошибки: во-первых, вы не выполняете $checkid запрос, во-вторых, у вас есть только один = в if (поэтому вы присваиваете значение $customerid для $checkid.

Также вероятно, что существует уязвимость SQL инъекций.

Почему "возможно"? Вы сами этого не видите? Разве вы не пишете свой код таким образом, чтобы избежать подобных проблем?

0 голосов
/ 27 мая 2010

$_SESSION очистится при закрытии браузера. Поэтому я бы предложил использовать 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);
}
0 голосов
/ 27 мая 2010

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']}";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...