当前位置: 首页 > 面试题库 >

如果使用MySQLi预备语句,是否需要转义变量?

端木淇
2023-03-14
问题内容

如果我使用MySQLi准备的语句,如下所示:

$stmt = $con1->prepare("UPDATE Login SET Session='LoggedOut' where Session=?");
$stmt->bind_param('s',$Session);
$stmt->execute();
$stmt->close();

我是否仍然需要像下面这样$Session对变量进行转义mysqli_real_escape_string();

$Session = mysqli_real_escape_string($con1, $_COOKIE['Session']);
$stmt = $con1->prepare("UPDATE Login SET Session='LoggedOut' where Session=?");
$stmt->bind_param('s',$Session);
$stmt->execute();
$stmt->close();

问题答案:

不,如果您在应用程序中的任何地方都使用准备好的语句,那么可以避免SQL注入。但是,一个重要的“陷阱”是二阶注入攻击,当某些查询使用准备好的语句而其他不使用准备好的语句时,就会发生这种攻击。

根据这个答案在SO类似的问题:

准备好的语句/参数化查询足以防止对该语句进行一阶注入。如果在应用程序的其他任何地方使用未经检查的动态sql,则仍然容易受到二阶注入的攻击。

总而言之,准备好的语句在发送的数据和SQL查询本身之间建立了分隔,确保不会将数据误解为SQL查询。但是,攻击者仍然可以将SQL作为数据输入,尽管如果使用的是准备好的语句,则在首次存储SQL时将不会执行该SQL,但在检索该结果时仍必须谨慎。准备好的语句在那个特定的位置保护您的应用程序,但是由于仍然允许将SQL存储在数据库中,因此如果您稍后在不带参数化的情况下使用该数据,则您的应用程序是不安全的。



 类似资料:
  • 问题内容: 在PDO :: Prepare页上指出: “并且通过消除对参数的手动引用来帮助防止SQL注入攻击” 知道这一点,是否有一个像mysql_real_escape_string()这样的PHP函数可以照顾到PDO的转义?还是PDO会为我做好一切转义? 编辑 我现在意识到我问了一个错误的问题。我的问题确实是,“ PDO会为我做什么?” 我现在通过这些答案意识到,它实际上仅消除了对引号进行转义

  • 问题内容: 对于此查询,有必要使用吗? 任何改进或查询是否还好? 在这种情况下,查询速度很重要。 问题答案: 否,准备好的查询(正确使用时)将确保对数据进行正确的转义以进行安全查询。您有点正确地使用它们,只需要更改一件事。因为您使用的是“?” 占位符,最好通过execute方法传递参数。 请注意,如果要将其输出到页面,数据库清理并不意味着可以在HTML中安全显示,因此也可以在其上运行htmlspe

  • 问题内容: 我之前在一个PHP项目中工作过,其中准备好的语句使SELECT查询的速度提高了20%。 我想知道它是否适用于Python?我似乎找不到任何明确表明可以或不能做到的事情。 问题答案: 直接回答,不,不是。 joshperry的答案很好地解释了它的作用。 从eugene y答案到类似问题, 检查MySQLdb 包注释: 在MySQLdb中,通过转义字符串然后将其盲目插入到查询中来进行“参数

  • 问题内容: 我需要转义[在SQL Server的sql查询中 实际上,我实际上是在寻找[[,但我不希望它像通配符一样起作用。我试过了 : 但是从这里得到错误信息: 消息102,级别15,状态1,行1“某物”附近的语法不正确。消息105,级别15,状态1,行1字符串’后的右引号; 问题答案: 使用: 您也可以使用: 在MSDN上的LIKE(Transact-SQL)中描述。

  • 问题内容: 我正在尝试准备好的语句,但是下面的代码不起作用。我收到错误消息: 致命错误:在第12行的/var/www/prepared.php中的非对象上调用成员函数execute() 另外,我需要对准备好的语句使用mysqli吗?谁能指出我关于从连接到插入再到带有错误处理的选择的准备好的语句的完整示例? 问题答案: 从文档: 在执行语句或获取行之前,必须使用mysqli_stmt_bind_pa

  • 问题内容: 我只是想知道是否有一种方法可以在MySQL中使用某种形式的预处理语句,这样就不必逃避所有输入,也不必将所有文件从MySQL切换到MySQLi。我真的不相信转义功能,因此,如果在常规MySQL中有任何可行的替代方法,那就太好了。 问题答案: 使用PDO(PHP数据对象)连接到MySQL数据库。此方法将确保所有数据库输入将始终被视为文本字符串,并且您将不必进行任何手动转义。 结合正确使用h