我正在编写一个一次性电子邮件脚本,它解析传入的电子邮件,删除一些数据并将其插入数据库,然后在页面上显示电子邮件。
我应该注意什么?
例如,我将解析为电子邮件,并确保它只是字母数字(在剥离我的域名后,因为我只接受字母数字ID)但是插入发件人名称(在解析发件人:行后)使用mysqli_real_escape_string()
然后htmlentities()
显示后,进入数据库?
答案 0 :(得分:4)
使用预准备语句和参数化查询。这些是由数据库服务器与任何参数分开发送和解析的SQL语句。这样攻击者就无法注入恶意SQL。
使用pdo。
$statement = $pdo->prepare('SELECT * FROM customers WHERE name = :name');
$statement ->execute(array('name' => $name));
foreach ($statement as $row) {
// do something with $row
}
使用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
}
mysqli数据插入
插入清理数据的代码示例。
$preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)');
$preparedStatement->execute(array('column' => $unsafeValue));
既然你在这里询问插入是通过使用这种方法防止sql注入的方法,攻击者将没有机会。
答案 1 :(得分:1)
你应该注意代码注入。基本上你为此做的是:
1)您确定的每个项目都是一个数字,将其解析为数字(可能带有try / catch),不接受这些字段中的任何字符串。
2)修剪()字符串字段有时是一种很好的做法。这会消除你场内所有不必要的空间。
3)不要以原始方式插入mysql。我不知道你使用的是哪种语言,但大多数语言都有Mysql语句。因此,不要进行简单的插入,而是执行类似(Java示例)的操作:
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());
}
}

查看上面的示例并检查预准备语句的插入方式。这是最安全的方式
干杯!
希望有所帮助