使PHP SQL随机查询从注入安全


Making a PHP SQL random query safe from injection?

我读到过,为了防止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.