gpt4 book ai didi

php - (double) $user_input 和 bind_param ('d' , $user_input 之间的安全差异

转载 作者:可可西里 更新时间:2023-11-01 00:22:12 26 4
gpt4 key购买 nike

假设我要执行这样一个准备好的语句:

$qry->prepare('UPDATE table_name SET column1 = ? string_column = ? WHERE column3 = ? AND column4 = ?');
$qry->bind_param('sbid', $string, $blob, $int, $double);

$int = 'non int value'; /* gives 0 in the database */
$blob = 'some string';
$string = 'another string';
$double = $double;

$qry->execute();
$qry->close();

假设我只想执行一次查询,我只是以安全的名义使用了准备好的语句。从我一直在阅读的内容来看——只使用一次准备好的查询会产生更多的开销,这相当于为了安全利益而牺牲性能。话虽这么说 - 像这样执行一次相同的查询会有什么性能/安全差异。

$int = (int) $int;
$blob = "'" .mysql_real_escape_string($blob) ."'";
$string = "'" .mysql_real_escape_string($blob) ."'";
$double = (double) $double;

$db->query("UPDATE SET column1 = $int, column2 = $blob WHERE column3 = $string AND column4 = $double ");

附言。我对 Prepared 语句如何提高性能不感兴趣,但对单个查询的安全性和速度差异感兴趣。

最佳答案

其中有很多。一些随机点

  • 单独使用准备好的语句施加(比理论上的)性能损失,如果 MySQL 服务器存在大量连接,则性能损失会更高。 (思考:上下文切换)
  • 但是您不应该在接近极限的情况下运行数据库服务器,这会产生影响。
  • 但是您并不总是有选择(想想:共享主机)

或:

  • 在某些(甚至很多)情况下,准备好的语句不会提供安全优势 - 有很多业务逻辑,其中不涉及用户生成的数据(想想:Jointables ,仅携带 ID)或出于其他原因必须事先验证用户生成的数据(思考:价格计算、memcached 查找,...)
  • 但是为每个查询选择多种样式中的一种会导致代码无法维护。
  • 有时这是不可避免的(想想:IN ( ) 构造没有准备好的查询支持)

经常被忽视:

  • 准备好的查询有时会使 RDBMS 不可知论者变得更难
  • 但是准备好的查询提供了针对 SQL 注入(inject)的最佳已知保护。

我最喜欢的:

  • 常见的建议是总是使用准备好的查询
  • 但是这个星球上的大多数生物会建议您吃粪便或腐烂的有机物。

因此,样式的选择通常必须根据具体情况进行。我们采用了将所有数据库访问包括参数管理封装在一个标准化库中的方法,即简单的require()ed,因此您可以直接替换为准备好的查询、转义或任何你想要的和你的 RDBMS 支持的。

关于php - (double) $user_input 和 bind_param ('d' , $user_input 之间的安全差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16849420/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com