这个准备好的语句能够防止SQL注入吗?

3
$string = trim($_POST['string'])
$sql = "INSERT INTO table (string) VALUES(:string)";
$query = $db->prepare($sql);
$query->execute(array(
    ":string" => $string
));

这段代码能够防止SQL注入吗?

编辑:
这是我与数据库建立的连接。这段代码的字符集是否允许上述代码块执行并防止SQL注入?

//database credentials
define('DBHOST','localhost');
define('DBUSER','root');
define('DBPASS','');
define('DBNAME','table');

//application address
define('DIR','http://localhost/');
define('SITEEMAIL','noreply@example.com');

try {

//create PDO connection 
$db = new PDO("mysql:host=".DBHOST.";port=3306;dbname=".DBNAME, DBUSER, DBPASS);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

} catch(PDOException $e) {
//show error
echo 'Looks like server is down please check back later';
exit;
}

你还应该确保数据库连接和数据库具有相同的字符集编码。 - AnotherGuy
@AnotherGuy,请再检查一下代码。然后告诉我,好吗? - user3436939
我无法轻易地解释这个问题。幸运的是,已经有一个很棒的答案(https://dev59.com/xHVC5IYBdhLWcg3w9GLM#12202218),它详细地解释了一切。 - AnotherGuy
1个回答

3

是的,它可以防止SQL注入攻击,因为

预处理语句使用绑定参数。

预处理语句不会将变量与SQL字符串组合,因此攻击者无法修改SQL语句。

预处理语句将变量与编译后的SQL语句结合,这意味着SQL和变量分别发送,变量仅被解释为字符串,而不是SQL语句的一部分。


我很担心。 - user3436939
如果这个答案对您有用,可以将其接受为答案!这样,当新的人看到您的问题时,就可以从答案中学习! - vinoth.kumar
@user3436939 - 是的,由于您正在使用预处理语句,因此您不需要这个。 - vinoth.kumar
3
通过使用预处理语句,您无需转义值......这就是预处理语句的作用。 转义 !== 清理。转义处理字符串值内的引号字符等内容,否则会破坏SQL并导致SQL注入风险,而使用绑定变量可以消除此风险。 清理是指消除字符串中您不希望显示的数据,例如HTML标记或类似内容。使用绑定变量对此没有影响。 - Mark Baker
1
补充Mark Baker的评论:通常情况下,您希望在输出时对HTML进行清理,并保持数据库中的原始数据不变。 - Scott Arciszewski
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接