0

我有一个安全功能,但我有一个问题我使用 - 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()

谢谢!

4

3 回答 3

0

您为什么要回答这些问题,询问如何清理输入以便从外部数据构建 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/手册/en/pdostatement.bindparam.php

于 2013-09-20T00:02:08.270 回答
0

你可以做几件事。也许做类似的事情:

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,所以你有一个范围问题。

于 2013-09-19T23:56:03.020 回答
0

如果你想让你的函数工作,你必须将 $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()。(同意)

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


您可以改用 Prepare Staments,这是手册中的一个示例

/* 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();
于 2013-09-19T23:56:43.220 回答