如何以正确的方式准备声明?

时间:2015-01-31 21:04:26

标签: php mysql

我目前正在编写CMS,我想阻止SQL注入。

我有变量$ url_variable,这是一个$ _GET。现在我想准备语句并在我的表中搜索$ url_variable。

$stmt = $db_connect->prepare("SELECT * FROM $url_table WHERE url = ?");
$url_variable = $stmt->quote($url_variable);
$stmt->bind_param("s", $url_variable);

现在我的问题:这个代码是否正确?我需要报价吗?任何SQL注入都安全吗?

4 个答案:

答案 0 :(得分:3)

您应该为$ url_table变量创建一个白名单,并在查询中使用之前检查表名是否在白名单中。例如,您可以通过简单的if检查来执行此操作:

if ($url_table == 'allowedTableName' || $url_table == 'anotherAllowedTableName') 
{

    $stmt = $db_connect->prepare("SELECT * FROM $url_table WHERE url = ?");
    $stmt->bind_param("s", $url_variable);
    //........
}
else {
    die('Illegal table name provided');
}

你不应该引用你绑定的变量,你最好使用准备好的声明!

答案 1 :(得分:1)

使用bind_param保护这些参数不受SQL注入的影响。您不需要$stmt->quote,它实际上可能导致查询失败。它将添加转义字符,当您使用bind_param时,它将逐字搜索这些字符。

答案 2 :(得分:1)

在此代码中:

如果您通过方法GET使用Url_Variable,则可以添加strip_tags或htmlenteties来删除/阻止跨站点脚本攻击,方法是完全删除它找到的任何HTML和PHP标记,如下所示:

$url_variable=$_GET['url_variable'];
$url_variable=strip_tags($url_variable);

这是为了避免恶意程序/脚本。 更安全的将由准备好的语句处理,如:

$stmt = $db_connect->prepare("SELECT * FROM $url_table WHERE url = ?");
$stmt->bind_param("s", $url_variable);

因此,不需要在Mysqli中使用Quote,因为它已被用于预备语句绑定参数以确保您不会忘记逃避导致潜在安全问题的特定字符串。

答案 3 :(得分:0)

你不应该在准备好的陈述中引用绑定变量 - 声明会为你处理:

$stmt = $db_connect->prepare("SELECT * FROM $url_table WHERE url = ?");
$stmt->bind_param("s", $url_variable);