php - 安全地使用准备好的语句来查询数据库

标签 php mysql pdo sql-injection prepared-statement

我正在尝试编写一个函数,该函数在允许进行的查询中通用,而且不会注入(inject) em>。下面的代码按原样抛出错误,但如果我使用“name”而不是“:field”运行它,它就可以正常工作。

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

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

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

如何在不允许注入(inject)攻击的情况下允许更改表/字段/值? 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 注入(inject)攻击自己。

如果出于某种奇怪的原因字段名称来自用户输入,您可以制作一个允许字段的数组。这样,您就可以避免注入(inject),因为这些值只能来自您的数组。我不知道为什么字段名称会来自用户输入并因此不受信任,除非您正在制作 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 - 安全地使用准备好的语句来查询数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2203588/

相关文章:

javascript - 使用 PDO 查询构建选择列表作为 optional

PHP PDO - 无法序列化或反序列化 PDO 实例

php - 数据库中的下拉菜单没有结果

php - WooCommerce 管理员报告 : Get custom product report based on date range

php - Mysql 在 xampp 上意外停止

php - 如何获得xpath 1.0中一个节点的最大深度

javascript - node-mysql2 Final block 和connection.end()不想被调用

MYSQL Performance Tuning with group by 子句

php - 如何在我使用 session 的地方发送 url?

PHP PDO 动态查询构建