php – (double)$user_input和bind_param(‘d’,$user_input)之间的安全性差异

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了php – (double)$user_input和bind_param(‘d’,$user_input)之间的安全性差异脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
让我们说我要执行这样一个准备好的声明:

$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 ");

PS.我对Prepared语句如何改进性能以及单个查询的安全性和速度差异感兴趣.

解决方法

这有很多.一些随机

>如果MysqL服务器存在大量连接,则单次使用预处理语句会产生(超过理论上)性能损失,这会更高. (想一想:上下文切换)
>但是你不应该运行如此接近其极限的数据库服务器,这才会产生影响.
>但你并不总是有选择(想想:共享主机)

要么:

>有一些(甚至很多)案例,其中准备好的语句不提供安全性好处 – 有很多业务逻辑,其中不涉及用户生成的数据(想想:Jointables,只携带ID)或者用户生成的数据必须事先通过其他原因进行验证(思考:价格计算,memcached查找,……)
>但是为每个查询选择多种样式之一会导致代码无法维护.
>但它有时是不可避免的(想一想:IN()构造没有准备好的查询支持)

经常被忽视

>准备好的查询有时会使与RDBMS无关的内容变得更加困难
>但是准备好的查询提供了针对sql注入的最佳知识保护.

我的最爱:

>通常建议只使用准备好的查询
>但是这个星球上的大多数生物会建议你粪便或腐烂的有机物质.

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

脚本宝典总结

以上是脚本宝典为你收集整理的php – (double)$user_input和bind_param(‘d’,$user_input)之间的安全性差异全部内容,希望文章能够帮你解决php – (double)$user_input和bind_param(‘d’,$user_input)之间的安全性差异所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。