PHP,Mysqli函数安全问题


php, mysqli function security issue

我有一个安全功能,但我有一个问题我使用 - MySQLi

我在secure使用此功能:

function secure ($string) {
  $string = htmlspecialchars($string);
  $string = strip_tags($string);
  $string = stripcslashes($string);
  $string = $mysqli -> real_escape_string($string);
  return $string;}

在我看来,这是一个错误:

致命错误:在 中的非对象上调用成员函数 real_escape_string()

谢谢!

你可以做几件事。也许做这样的事情:

function secure($connection, $string) {
  return $connection->real_escape_string(htmlentities(strip_tags(stripcslashes($string))), 3, 'UTF-8');
}

就个人而言,我会在安全页面上存储一些东西,例如:

function db(){
  return new mysqli(/*arguments here*/);
}

然后执行以下操作:

function secure($string){
  $db = db();
  $str = $db->real_escape_string(htmlentities(strip_tags(stripcslashes($string))), 3, 'UTF-8');
  $db->close();
  return $str;
  }

显然,这不是JavaScript,所以你有一个范围问题。

如果你想

让你的函数工作,你必须将$mysqli对象作为参数传递

喜欢这个:

function secure ($string,$mysqli) {
  $string = htmlspecialchars($string);
  $string = strip_tags($string);
  $string = stripcslashes($string);
  $string = $mysqli -> real_escape_string($string);
  return $string;}

我建议你,不要使用这个函数:

1-过度杀戮和错误的@Dagon评论。(同意)
2-既然您正在使用mysqli,那么当您可以使用预准备语句时,为什么要这样做? @barmar的评论。(同意)
3-放入数据库时不应使用htmlspecialchars(),在呈现@bamar注释时应使用htmlentities()。(同意)

以上是我不使用的主要原因


您可以改用"准备状态",这是手册中的一个示例
/* create a prepared statement */
$stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?");
/* bind parameters for markers */
$stmt->bind_param("s", $city);
/* execute query */
$stmt->execute();
/* bind result variables */
$stmt->bind_result($district);
/* fetch value */
$stmt->fetch();
printf("%s is in district %s'n", $city, $district);
/* close statement */
$stmt->close();

你为什么要问这些问题,询问如何清理你的输入,以便你可以从外部数据构建SQL语句? 从外部数据构建 SQL 语句是危险的。

与其浪费时间担心如何想出另一个半途而废的"解决方案",不如停下来穿上你的大程序员裤子,开始使用准备好的语句和绑定变量。

这里有一个很棒的答案,可以帮助你入门:如何防止PHP中的SQL注入?

您还可以查看 http://bobby-tables.com/php 以获取其他示例。

在我看来,您仍然可以使用 Oracle:http://php.net/manual/en/function.oci-bind-by-name.php 或通过 PDO http://php.net/manual/en/pdostatement.bindparam.php 来执行预准备语句和绑定变量