【问题标题】:Sanitize mysql injection string with preg_match [duplicate]使用 preg_match 清理 mysql 注入字符串 [重复]
【发布时间】:2014-01-23 21:16:40
【问题描述】:

我想清理数据以防止 mysql 注入。 所以我需要编写一个模式来识别和删除 4 个主要的 mysql SELECT、Replace、DELETE、UPDATE。

我想对 array_map 使用这个通用规则

$_POST = array_map('stz',$_POST);

但是我坚持编写该模式以防止像这样发生 " ' AND 1=1; SELECT * FROM test_table "

【问题讨论】:

标签: php mysql sanitization


【解决方案1】:

您可以通过多种方式做到这一点。以下是一些:

每次创建一个变量

$clean_forename = mysqli_escape_string($db, $_POST["forename"]);

创建一个干净的数组

$clean = array();
$clean["forename"] = mysqli_escape_string($db, $_POST["forename"]);

清理 SQL 查询

$sql_query = "UPDATE table SET forename='".mysqli_escape_string($db, $_POST["forename"])."'";

使用 foreach

$set = array();
$keys = array('forename', 'surname', 'email');
foreach($keys as $val) {
  $safe_value = mysqli_escape_string($db, $_POST[$val]);
  array_push($set, "$val='$safe_value'");
}
$set_query = implode(',', $set);
$sql_query = "UPDATE table SET $set_query";

【讨论】:

  • 如果您想保留注射剂的帖子以供进一步使用怎么办?
  • -1。永远不要修改超全局变量。
【解决方案2】:

不要使用正则表达式。 如果您想清洁所有的柱子阵列,有专门的清洁功能 你可以使用简单的foreach:

<?php
    $cleanpostArr = array();
    foreach($_POST as $postkey => $postvalue){
      $cleanpostArr[mysqli_escape_string($db,$postkey)] = mysqli_escape_string($db,$postvalue);
    }
?>

【讨论】:

  • mysql_real_escape 已弃用。
  • 现在您已编辑:mysqli_escape_string 需要数据库连接。
  • 是的,编辑的重点是为什么当你有专门的功能时使用正则表达式。
  • 这个答案有什么问题?,在键中添加了转义,因为它还可以包含 sql 注入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 2011-08-10
相关资源
最近更新 更多