php – 安全地使用预准备语句来查询数据库

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了php – 安全地使用预准备语句来查询数据库脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试编写一个在允许的查询中具有多种功能函数,但也可以安全地注入.下面的代码按原样抛出一个错误,但如果我使用’name’而不是’:field’运行它,它可以正常工作.

$field = "name";
$value = "joe";

function selectquery($field,$value)
  {
  global $dbcon;

  $select = $dbcon->PRepare('SELECT * From @R_777_2187@er1 WHERE :field = :value');
  if($select->execute(array(':field' => $field,':value' => $value)));
    {
    $row = $select->fetch();
    for ($i=0; $i<3; $i++)
      {
      echo $row[$i]."\n";
      }
    }  
  }

何在不允许注入攻击的情况下允许更改表/字段/值? MysqL_real_escaPE_string()似乎有点像倒退了一步.有任何想法吗?

解决方法

我可能弄错了,但我不相信你可以在PDO中提供字段作为参数.

为什么不将它指定为函数的参数?与用户提供的数据不同,字段是有限的,定义良好且不经常更改.如在

selectquery('name',$value);

并有你的查询

$field = "name";
$value = "joe";

function selectquery($field,$value)
  {
  global $dbcon;

  $select=$dbcon->prepare("SELECT * From tester1 WHERE $field = :value");
  if($select->execute(array(':value' => $value)));
 //etcetera

由于您自己为函数调用提供字段名称,因此除非您担心自己会使用sql注入攻击自己,否则这是安全的.

如果由于某些奇怪的原因,该字段的名称来自用户输入,您可以创建一个允许字段数组.这样,您就可以安全地进行注射,因为这些值只能来自您的数组.我不知道为什么字段名称来自用户输入,因此不受信任,除非您正在制作API?另外,可能有更好的方法来实现目标.

无论如何,这将是一个潜在的解决方案,使用白名单表名:

$field = "name";
$value = "joe";

$Allowed_fields=array('name','other_name','sandwich');

function selectquery($field_name,$value)
  {
  global $dbcon,$allowed_fields;

  if(!in_array($field_name,$allowed_fields)){ return false; }
  else{ $field=$field_name; }

  $select=$dbcon->prepare("SELECT * FROM tester1 WHERE $field = :value");
  if($select->execute(array(':value' => $value)));
  //etcetera

脚本宝典总结

以上是脚本宝典为你收集整理的php – 安全地使用预准备语句来查询数据库全部内容,希望文章能够帮你解决php – 安全地使用预准备语句来查询数据库所遇到的问题。

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

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