我读到过,为了防止SQL注入,所有MySQL语句实际上应该是我的mysqli和参数。上面的代码连接到一个数据库,选择一个随机的"动词"行,然后使用mysql_fetch_assoc
获取与"动词"行和def列(该动词的定义)相交的单元格。
什么变化可以使随机查询从注入安全?
$user_name = "name";
$password = "password";
$database = "words";
$server = "host";
$db_handle = mysqli_connect($server, $user_name, $password) or die (mysqli_error($db_handle));
$db_found = mysqli_select_db($db_handle, $database) or die (mysqli_error($db_handle));
$randVerb = mysql_query("SELECT * FROM verbs ORDER BY RAND() LIMIT 1");
$db_field = mysql_fetch_assoc($randVerb);
$definition= $db_field['def'];
SQL注入只能在使用客户端给定的一些变量的查询中进行。这里没有,所以查询是安全的
你必须使用mysqli或PDO,因为mysql_*已被弃用,它将在PHP的未来版本中被删除!
你的代码是安全的,因为你没有使用任何参数。
BAD代码示例:mysql_query("SELECT * FROM verbs WHERE id = ".$_GET['id']);
如果您想在查询中使用参数,请使用准备好的语句!这是一个很好的教程:http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers
SQL中没有任何东西对注入本身是危险的。消毒(或使查询安全)的思想是当您基于某些用户输入变量运行查询时。
例如,有人正在登录。你会有一个像
这样的查询SELECT COUNT() FROM `users` WHERE `user`='$user' AND `pass`='$pass'
这意味着如果通过美元="' OR 1 = 1——";
他们将作为数据库中的第一个用户登录。因此,在查询中使用变量之前,需要对它们进行净化(基本上,在净化SQL数据时,要对引号进行转义)。这就是为什么PHP说使用mysqli而不是mysql.