2013-09-19 4 views
0

У меня есть функция безопасности, но у меня есть проблема я использую - MySQLiPHP, MySQLi вопрос функция безопасности

Я использую эту функцию secure:

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

Проблема мне кажется, об ошибке:

Fatal error: Call to a member function real_escape_string() on a non-object in

Спасибо!

+2

переменная '$ mysqli' не в рамках этой функции. Передайте его как параметр 'function secure ($ string, $ mysqli)' –

+0

Вы не задали переменную '$ mysqli'. Вам либо нужно передать его как аргумент функции, либо объявить его с помощью 'global $ mysqli;'. – Barmar

+4

Thats over kill and wrong –

ответ

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, поэтому у вас есть проблема с областью.

0

Если вы хотите, чтобы ваша функция работает, вы должны передать в качестве аргумента $ MySQLi объект

Как это: советы

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

I к вам, не используйте эту функцию:

1- За убийство и ошибка @ Dagon. (Согласен)
2- Поскольку вы используете mysqli, почему вы делаете что-либо из этого, когда вы можете использовать подготовленные заявления? @ Комментарий barmar в. (Принимаю)
3- Вы не должны использовать htmlspecialchars() при вводе в базу данных, вы должны использовать htmlentities() при рендеринге @bamar комментарий. (Принимаю)

Выше для меня Основная причина отказа от использования


вы можете использовать Приготовьте 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(); 
0

Почему вы собираетесь через эти вопросы, спрашивая о том, как вы можете дезинфицировать свои входы, так что вы можете создавать операторы SQL из внешних данных? Создание операторов SQL из внешних данных является опасным.

Вместо того, чтобы тратить свое время на беспокойство о том, как вы можете придумать еще одно «продуманное» решение, остановите и наденьте штаны большого программиста и начните использовать подготовленные заявления и связанные переменные.

Вот фантастический ответ, который вы начали: 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

Смежные вопросы