恶意代码可以插入电子邮件吗?

时间:2014-10-20 16:11:20

标签: php security email

我正在编写一个一次性电子邮件脚本,它解析传入的电子邮件,删除一些数据并将其插入数据库,然后在页面上显示电子邮件。

我应该注意什么?

例如,我将解析为电子邮件,并确保它只是字母数字(在剥离我的域名后,因为我只接受字母数字ID)但是插入发件人名称(在解析发件人:行后)使用mysqli_real_escape_string()然后htmlentities()显示后,进入数据库?

2 个答案:

答案 0 :(得分:4)

使用预准备语句和参数化查询。这些是由数据库服务器与任何参数分开发送和解析的SQL语句。这样攻击者就无法注入恶意SQL。

  1. 使用pdo。

    $statement = $pdo->prepare('SELECT * FROM customers WHERE name = :name');
    $statement ->execute(array('name' => $name));
    foreach ($statement as $row) {
        // do something with $row
    }
    
  2. 使用mysqli来防止安全漏洞。

    $statement= $dbConnection->prepare('SELECT * FROM customers WHERE name = ?');
    $statement->bind_param('s', $name);
    $statement->execute();
    $result = $statement->get_result();
    while ($row = $result->fetch_assoc()) {
        // do something with $row
    }
    
  3. mysqli数据插入

  4. 插入清理数据的代码示例。

    $preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)');
    
    $preparedStatement->execute(array('column' => $unsafeValue));
    

    既然你在这里询问插入是通过使用这种方法防止sql注入的方法,攻击者将没有机会。

    1. 框架安全。

      一种简单的方法是使用像CodeIgniter或Laravel这样的PHP框架,它具有过滤和活动记录等内置功能,因此您不必担心这些细微差别。

      < / LI>
    2. 一些指导原则。

      用于转义SQL语句中的特殊字符。不使用MySQL,不推荐使用此扩展程序,使用MySQLiPDO

答案 1 :(得分:1)

你应该注意代码注入。基本上你为此做的是:

1)您确定的每个项目都是一个数字,将其解析为数字(可能带有try / catch),不接受这些字段中的任何字符串。

2)修剪()字符串字段有时是一种很好的做法。这会消除你场内所有不必要的空间。

3)不要以原始方式插入mysql。我不知道你使用的是哪种语言,但大多数语言都有Mysql语句。因此,不要进行简单的插入,而是执行类似(Java示例)的操作:

&#13;
&#13;
public static void main(String[] args)
  {
    try
    {
      // create a mysql database connection
      String myDriver = "org.gjt.mm.mysql.Driver";
      String myUrl = "jdbc:mysql://localhost/test";
      Class.forName(myDriver);
      Connection conn = DriverManager.getConnection(myUrl, "root", "");
     
      // create a sql date object so we can use it in our INSERT statement
      Calendar calendar = Calendar.getInstance();
      java.sql.Date startDate = new java.sql.Date(calendar.getTime().getTime());
 
      // the mysql insert statement
      String query = " insert into users (first_name, last_name, date_created, is_admin, num_points)"
        + " values (?, ?, ?, ?, ?)";
 
      // create the mysql insert preparedstatement
      PreparedStatement preparedStmt = conn.prepareStatement(query);
      preparedStmt.setString (1, "Barney");
      preparedStmt.setString (2, "Rubble");
      preparedStmt.setDate   (3, startDate);
      preparedStmt.setBoolean(4, false);
      preparedStmt.setInt    (5, 5000);
 
      // execute the preparedstatement
      preparedStmt.execute();
       
      conn.close();
    }
    catch (Exception e)
    {
      System.err.println("Got an exception!");
      System.err.println(e.getMessage());
    }
  }
&#13;
&#13;
&#13;

查看上面的示例并检查预准备语句的插入方式。这是最安全的方式

干杯!

希望有所帮助