1

在使用 HTML/CSS 构建网站后,我只是在学习 PHP 和脚本的基础知识。我正在尝试制作一个提交到数据库的简单表单,只是为了收集电子邮件地址和姓名。以下是我正在使用的基本代码。我对它进行了一些调整,但没什么大不了的。我知道我需要清理这些数据,并且我已经阅读了数十篇关于如何执行此操作的帖子、文章等,我只是不知道如何向其中添加 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);
?>
4

2 回答 2

5

您的代码很容易发生SQL 注入。使用PDOMYSQLI

使用 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();

?>

这将允许您使用单引号插入记录。

于 2012-09-10T14:51:33.463 回答
0

我认为 John Woo 指的是您将 $_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);

此过程将使用函数 sanitize_system_string 的结果实例化变量 $firstname 和 $lastname;正在删除诸如“{,<,&,`,;”之类的字符 在您的 $_POST 变量中。这些可以被 mysql 引擎作为命令读取。此外,它设置最小和最大字符数。输入必须是最少 2 个字符且不超过 44 个字符。祝你好运

于 2012-09-10T19:44:40.410 回答