Очистить данные формы

Я только изучаю основы PHP и сценариев после создания сайтов с помощью HTML/CSS. Я пытаюсь создать простую форму, которая отправляется в базу данных, просто для сбора адресов электронной почты и имен. Ниже приведен основной код, который я использую. У меня есть несколько настроек в нем, но ничего серьезного. Я знаю, что мне нужно очистить эти данные, и я прочитал десятки сообщений, статей и т. д. о том, как это сделать, но я просто не понимаю, как добавить к этому функции escape_string или PHP. Я думал, что да, и я пробовал это десятками способов, но когда я проверяю, кажется, что они не имеют никакого значения. Я знаю, что это просто мое нубское невежество, но я как бы дергаю себя за волосы, поэтому любая помощь была бы отличной.

    <?php
    $con = mysql_connect("localhost","peter","abc123");
    if (!$con)
   {
   die('Could not connect: ' . mysql_error());
   }

    mysql_select_db("my_db", $con);

    $sql="INSERT INTO Persons (FirstName, LastName, Age)
    VALUES
    ('$_POST[firstname]','$_POST[lastname]','$_POST[age]')";

    if (!mysql_query($sql,$con))
    {
    die('Error: ' . mysql_error());
    }
    echo "1 record added";

    mysql_close($con);
    ?> 

@ rwhite35 так должен выглядеть конечный результат?

<?php
// sanitize a string in prep for passing a single argument to system() (or similar)
function sanitize_system_string($string, $min='', $max='')
{
  $pattern = '/(;|\||`|>|<|&|^|"|'."\n|\r|'".'|{|}|[|]|\)|\()/i'; 
  // no piping, passing possible environment variables ($),
  // seperate commands, nested execution, file redirection, 
  // background processing, special commands (backspace, etc.), quotes
  // newlines, or some other special characters
 $string = preg_replace($pattern, '', $string);
 //make sure this is only interpreted as ONE argument
 $string = '"'.preg_replace('/\$/', '\\\$', $string).'"'; 
 $len = strlen($string);
  if((($min != '') && ($len < $min)) || (($max != '') && ($len > $max)))
    return FALSE;
    return $string;
  }

$con = mysql_connect("localhost","root","root");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("form-try", $con);

$firstname = sanitize_system_string($_POST['firstname'],2,44);
$lastname = sanitize_system_string($_POST['lastname'],2,44);

$sql="INSERT INTO Persons (FirstName, LastName, Age)
VALUES
('$_POST[firstname]','$_POST[lastname]','$_POST[age]')";

if (!mysql_query($sql,$con))
  {
  die('Error: ' . mysql_error());
  }
echo "1 record added";

mysql_close($con);
?>

person SolidSnake    schedule 10.09.2012    source источник
comment
Если вы находитесь на начальном этапе изучения PHP, начните с использования mysqli или < href="http://php.net/manual/en/book.pdo.php" rel="nofollow noreferrer">PDO для использования в базе данных   -  person dbf    schedule 10.09.2012
comment
Также обратите внимание на подготовленные операторы, использование подготовленных операторов уменьшит вероятность атак SQL-инъекций на ваши скрипты/код.   -  person Geek Num 88    schedule 06.10.2012


Ответы (2)


Ваш код подвержен внедрению SQL. Используйте PDO или MYSQLI

Пример использования расширения PDO:

<?php

    $stmt = $dbh->prepare("INSERT INTO Persons (FirstName, LastName, Age) VALUES (?,?,?)");
    $stmt->bindParam(1, $_POST[firstname]);
    $stmt->bindParam(2, $_POST[lastname]);
    $stmt->bindParam(3, $_POST[age]);

    $stmt->execute();

?>

это позволит вам вставлять записи с одинарными кавычками.

person John Woo    schedule 10.09.2012
comment
Если вы хотите учиться и знать, что делаете, не используйте PDO. Используйте функции mysql и mysqli, чтобы узнать, что происходит внутри этих герметичных объектов. Затем, когда вы начнете с реальных приложений, используйте PDO. - person Alex Monthy; 10.09.2012
comment
ты имеешь в виду mysql_*? он уже обесценился по мануалу. - person John Woo; 10.09.2012
comment
Позвольте мне посмотреть, правильно ли я это понимаю, я бы использовал приведенный выше пример PDO вместо этой части того, что я использую? ‹code›'$sql=INSERT INTO Persons (FirstName, LastName, Age) VALUES ('$ _POST[имя]','$_POST[фамилия]','$_POST[возраст]'); if (!mysql_query($sql,$con)) { die('Ошибка: ' . mysql_error()); } добавлена ​​запись echo 1;‹/code› - person SolidSnake; 10.09.2012
comment
значения вставки должны быть параметризованы. PDO автоматически очистит значения для вас. - person John Woo; 10.09.2012
comment
Хорошо, мне, очевидно, нужно многое узнать об этом. Я не уверен, что понимаю, что вы имеете в виду, говоря, что значения ввода должны быть параметризованы, но я ценю вашу попытку помочь и, по крайней мере, указать мне новое направление для обучения. - person SolidSnake; 10.09.2012
comment
@ user1660445 должно быть INSERT INTO Persons (FirstName, LastName, Age) VALUES (?,?,?) - person John Woo; 10.09.2012
comment
@John Woo Значит, это должно выглядеть так? <?php $con = mysql_connect("localhost:8888","root","root"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("form-try", $con); $stmt = $dbh->prepare("INSERT INTO Persons (FirstName, LastName, Age) VALUES (?,?,?)"); $stmt->bindParam(1, $_POST[firstname]); $stmt->bindParam(2, $_POST[lastname]); $stmt->bindParam(3, $_POST[age]); $stmt->execute(); mysql_close($con); ?> Похоже, что информация не отправляется в мою базу данных. Хотя я знаю, что это мое невежество. - person SolidSnake; 10.09.2012
comment
@ user1660445, потому что вы не создали активное соединение для своего pdo. перед подготовкой вставки добавьте этот код, $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass); - person John Woo; 11.09.2012

Я думаю, что Джон Ву имеет в виду, что вы передаете $_POST[firstname] непосредственно в свой оператор INSERT. Это опасно. Вот простая функция, которую я использую для очистки ввода, затем я буду использовать mysqli для запроса. Это подход «пояс и подтяжки».

// sanitize a string in prep for passing a single argument to system() (or similar)
function sanitize_system_string($string, $min='', $max='')
{
  $pattern = '/(;|\||`|>|<|&|^|"|'."\n|\r|'".'|{|}|[|]|\)|\()/i'; 
  // no piping, passing possible environment variables ($),
  // seperate commands, nested execution, file redirection, 
  // background processing, special commands (backspace, etc.), quotes
  // newlines, or some other special characters
 $string = preg_replace($pattern, '', $string);
 //make sure this is only interpreted as ONE argument
 $string = '"'.preg_replace('/\$/', '\\\$', $string).'"'; 
 $len = strlen($string);
  if((($min != '') && ($len < $min)) || (($max != '') && ($len > $max)))
    return FALSE;
    return $string;
  }

Затем позже в вашем коде, который обрабатывает данные формы...

$firstname = sanitize_system_string($_POST['firstname'],2,44);
$lastname = sanitize_system_string($_POST['lastname'],2,44);

Этот процесс создаст экземпляр переменных $firstname и $lastname с результатом функции sanitize_system_string; который удаляет такие символы, как "{,‹,&,`,;" в вашей переменной $_POST. Они могут быть прочитаны движком mysql как команды. Кроме того, он устанавливает минимальное и максимальное количество символов. Ввод должен быть минимум 2 символа и не более 44. Удачи

person rwhite    schedule 10.09.2012
comment
Пожалуйста, смотрите выше :) Он по-прежнему отправляет информацию в базу данных, но я не уверен, что я запускаю вашу функцию. Я не совсем уверен, как это проверить. - person SolidSnake; 11.09.2012
comment
Возможно, вы уже пробовали это, но в поле формы введите 'string then {‹&`; больше текста' Тогда, если ваше входное имя было name=someText, вы бы вызвали функцию с помощью $testVar = sanitize_system_string($_POST['someText'],2,44); эхо $testVar; Вывод должен быть жалом, а затем больше текста. Что бы опустить специальные символы. - person rwhite; 11.09.2012