我刚刚了解了mysql_real_escape_string
避免MySQL注入的重要性。所以我在php的注册表中使用了这个。这就是我得到的,
$password_string = mysql_real_escape_string($_POST['PASSWORD']);
$username = mysql_real_escape_string($_POST['USERNAME']);
$fname = mysql_real_escape_string($_POST['FNAME']);
$mname = mysql_real_escape_string($_POST['MNAME']);
$lname = mysql_real_escape_string($_POST['LNAME']);
问题:我是否还需要在仅验证数据库中条目的表单上使用mysql_real_escape_string
?或者仅在将数据插入数据库时才有用?我问这个是因为我还有一个验证表,其中用户将输入数据以查看数据库中是否存在这些记录。我还需要mysql_real_escape_string
来保证安全吗?
谢谢!
答案 0 :(得分:3)
mysql_real_escape_string
用于在执行查询之前从数据中转义特殊字符(可能会破坏查询)。它应与SELECT , INSERT , UPDATE, DELETE
一起使用。
假设您从数据库中选择数据:SELECT * from table WHERE id='1' and instead of 1
我们有“1”,这会破坏您的查询。 :SELECT * from table WHERE id='1''
在新版本的PHP中也弃用mysql_real_escape_string
,请使用mysqli
并尝试使用PDO
。
答案 1 :(得分:2)
一般情况下,如果这些字符串没有字面定义且完全在您的控制之下,您必须处理以某种方式注入sql语句的所有字符串。简化你可以说出来自客户端的所有内容,无论它是在那里可见还是隐藏,无论是输入字段还是其他一些交互方式。 Everything 可以在客户端进行更改或操作。所以永远不要相信你从那里收到任何东西
甚至有必要处理源自服务器端的某些字符串。或者,显然,从远程系统等其他数据源中检索数据,您读取的文件或是,您刚读取的数据库条目。
唯一可以考虑保存的东西是常量值,如文字字符串,数字,定义。但即使在这里你也要注意它们在sql中不包含任何具有特殊含义的字符。所以,如果有疑问,那就逃避吧。
那说......
您使用的旧版mysql
扩展程序(" mysql
函数")很久以前就已被弃用。它不应再被使用了。请考虑将您的代码移植到较新的mysqli
扩展程序或PDO
。两者都通过准备好的陈述提供更好的保护。和"参数绑定"。两种备选方案都有很好的Web文档,您可以找到许多教程和示例供其使用。