我想知道在将输入数据插入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注入仍然可能)。
最好是多管齐下:
- 验证数据
- 干净数据
- 逃脱日期
验证是检查你得到的数据是否有意义。例如,如果您想要一个出生日期,您可以检查格式是否正确,甚至可能检查日期是否有意义。这不仅具有安全优势,而且还可以防止错误数据的一些(不是全部)错误。这里的工具取决于具体情况,正则表达式(preg_match)通常是一个不错的选择。
清理数据通常不是真正需要的,但是很好,例如,如果用户键入一些值,使用trim()来分割一些空白,这可能是复制和粘贴之类的错误。这没有安全方面的好处,但可以提高数据的整体质量。这很好。
这两件事都应该在脚本的早期完成。而"早"取决于你的架构。有时需要先清理一个validate,然后马上清理(preg_replace)
然后,当发送数据到数据库或将其放入HTML或任何这些东西时,您必须根据您正在使用的系统进行转义。您应该对所有数据都这样做,即使您事先为了安全起见验证了格式。当与mysql对话时,这些是real_escape_string函数,例如,对于HTML,它是htmlentities()或htmlspecialchars()。对于数据库,查看准备好的语句也是一个好主意,PDO->prepare +execute()或mysqli->prepare() +execute()