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

Php 如何以正确的方式准备一份声明?,php,mysql,Php,Mysql,我目前正在写一个CMS,我想阻止SQL注入 我有一个变量$url\u variable,它是一个$\u GET。现在,我想准备语句并在表中搜索$url_变量 $stmt = $db_connect->prepare("SELECT * FROM $url_table WHERE url = ?"); $url_variable = $stmt->quote($url_variable); $stmt->bind_param("s", $url_variable); 现在我的问

我目前正在写一个CMS,我想阻止SQL注入

我有一个变量$url\u variable,它是一个$\u GET。现在,我想准备语句并在表中搜索$url_变量

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

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

您不应该在准备好的语句中引用绑定变量-该语句为您解决了这一问题:

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

您不应该在准备好的语句中引用绑定变量-该语句会为您提供:

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

您应该为$url\u表变量创建一个白名单,并在查询中使用该表之前检查该表名是否在白名单中。例如,您可以通过一个简单的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');
}

您不应该引用绑定的变量,您可以使用准备好的语句

您应该为$url\u表变量创建一个白名单,并在查询中使用该表之前检查该表名是否在白名单中。例如,您可以通过一个简单的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');
}

您不应该引用绑定的变量,您可以使用准备好的语句

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

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

在此代码中:

如果使用Url_Variable by method,则可以添加strip_标记或htmlenties,通过完全删除找到的任何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,因为它已被用于准备语句绑定参数,以确保不会忘记转义导致潜在安全问题的特定字符串。

在此代码中:

如果使用Url_Variable by method,则可以添加strip_标记或htmlenties,通过完全删除找到的任何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,因为它已被使用准备语句绑定参数,以确保不会忘记转义导致潜在安全问题的特定字符串。

创建一个包含所有有效表名的数组,然后检查数组中是否存在
$url\u table
。如果是-使用它,否则-不要。在使用
bind_参数时,不应使用
$stmt->quote
。绑定参数会处理所有事情。$url_表已经是安全的,并且是预先设置的。我想知道如何保护$url\u变量的安全性,这样我就可以执行它而不必冒SQL注入的风险。@Barmar:所以如果我删除第二行,就可以开始了?创建一个包含所有有效表名的数组,然后检查数组中是否存在
$url\u table
。如果是-使用它,否则-不要。在使用
bind_参数时,不应使用
$stmt->quote
。绑定参数会处理所有事情。$url_表已经是安全的,并且是预先设置的。我想知道如何保护$url_变量的安全性,这样我就可以执行它而不必冒SQL注入的风险。@Barmar:所以如果我删除第二行,应该可以继续了吧?