这个准备好的语句可以防止 SQL 注入吗? [复制]

Posted

技术标签:

【中文标题】这个准备好的语句可以防止 SQL 注入吗? [复制]【英文标题】:Can this prepared statement prevent SQL injection? [duplicate] 【发布时间】:2015-11-08 12:57:41 【问题描述】:
$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,再次检查代码。请告诉我! 我无法轻易解释这一点。幸运的是,an awesome answer 已经存在,它深入解释了一切。 【参考方案1】:

是的,它会阻止 SQL 注入,因为

准备好的语句使用绑定参数。

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

Prepared Statements 将变量与已编译的 SQL 语句组合在一起,这意味着 SQL 和变量是分开发送的,变量只是被解释为字符串,而不是 SQL 语句的一部分。

【讨论】:

谢谢! :) 我很担心。 如果答案对您有用,可以接受它作为答案!这样当看到您的问题的新人会从答案中学习! 它说我可以在六分钟内接受答案!而且我还没有对字符串进行任何清理,它仍然可以工作,对吧? 使用准备好的语句,您不需要转义值....这就是准备好的语句消除的内容....转义!== sanitizing....转义处理引号字符和类似的内部否则会破坏 SQL 并导致 SQL 注入风险的字符串值,使用 bind vars 消除了这种风险.... 清理是关于消除字符串中您不一定想要显示的数据,例如 html 标记或类似.... 使用 bind vars 并不能消除这种情况 添加到 Mark Ba​​ker 的评论中:您通常希望在输出时清理 HTML 并在数据库中保持原始数据完整(未更改)。

以上是关于这个准备好的语句可以防止 SQL 注入吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

使用prepared statement来防止SQL注入会影响性能吗?

PHP:使用准备好的语句并防止 SQL 注入与逃逸

是否可以在没有准备好的语句(Node.js 和 MSSQL)的情况下防止 SQL 注入

在codeigniter中逃避足够的防止sql注入的保护

我啥时候应该使用准备好的语句?

准备好的语句中的动态 where 条件的 SQL 注入