php,mysqli函数安全问题

时间:2013-09-19 23:46:32

标签: php sql mysqli sql-injection

我有安全功能,但我遇到了问题 我用 - 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()

谢谢!

3 个答案:

答案 0 :(得分: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,所以你有一个范围问题。

答案 1 :(得分: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,an example from the manual

/* 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();

答案 2 :(得分:0)

为什么要通过这些问题询问如何清理输入,以便从外部数据构建S​​QL语句? 从外部数据构建S​​QL语句很危险。

不要浪费你的时间来担心你如何能想出另一个想到“解决方案”的中途,停下来穿上你的大程序员裤子并开始使用准备好的语句和绑定变量。

这是一个很棒的答案,可以帮助您入门:How can I prevent SQL injection in PHP?

您还可以查看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