Php:在将输入数据插入mysql数据库之前清除输入数据


php: clear input data before inserting it into mysql database

我想知道在将输入数据插入mysql数据库之前,清除输入数据的最佳方法是什么。有很多功能:trim, addslashes, mysql_real_escape_string等。此时此刻,我正在使用这个简单的函数:

function filter($var){
    $data = preg_replace('/[^a-zA-Z0-9]/','',$var);
    $data = trim(addslashes($data));
    return $data;
}

最好的方法是什么?由于

为了安全起见,在处理mysql时,mysql_real_escape_string()——总是使用这个。总是这样。

出于安全原因,使用mysql_real_escape_string()就足够了。另一种方法是使用预处理语句。

但是您应该检查您希望在数据库中使用哪种类型的信息。有几个函数和语言结构可以使用:typecast、filter_*()函数、int_val()、abs()、trim()等等。

我建议你看一下准备好的语句,它可以很好地保护你免受各种形式的SQL注入。

预处理语句的参数不需要加引号;驱动程序会自动处理这个问题。如果应用程序专门使用预处理语句,开发人员可以确保不会发生SQL注入(但是,如果查询的其他部分使用未转义的输入构建,SQL注入仍然可能)。

最好是多管齐下:

  1. 验证数据
  2. 干净数据
  3. 逃脱日期

验证是检查你得到的数据是否有意义。例如,如果您想要一个出生日期,您可以检查格式是否正确,甚至可能检查日期是否有意义。这不仅具有安全优势,而且还可以防止错误数据的一些(不是全部)错误。这里的工具取决于具体情况,正则表达式(preg_match)通常是一个不错的选择。

清理数据通常不是真正需要的,但是很好,例如,如果用户键入一些值,使用trim()来分割一些空白,这可能是复制和粘贴之类的错误。这没有安全方面的好处,但可以提高数据的整体质量。这很好。

这两件事都应该在脚本的早期完成。而"早"取决于你的架构。有时需要先清理一个validate,然后马上清理(preg_replace)

然后,当发送数据到数据库或将其放入HTML或任何这些东西时,您必须根据您正在使用的系统进行转义。您应该对所有数据都这样做,即使您事先为了安全起见验证了格式。当与mysql对话时,这些是real_escape_string函数,例如,对于HTML,它是htmlentities()或htmlspecialchars()。对于数据库,查看准备好的语句也是一个好主意,PDO->prepare +execute()或mysqli->prepare() +execute()