2010-02-17 6 views
17

У меня есть следующий код:Должен ли я использовать mysql_real_escape_string, если я связываю параметры?

function dbPublish($status) 
{ 
global $dbcon, $dbtable; 

if(isset($_GET['itemId'])) 
{ 
    $sqlQuery = 'UPDATE ' . $dbtable . ' SET active = ? WHERE id = ?'; 
    $stmt = $dbcon->prepare($sqlQuery); 
    $stmt->bind_param('ii', $status, $_GET['itemId']); 
    $stmt->execute(); 
    $stmt->close(); 
} 
} 

Мне нужно mysql_real_escape_string в этом случае или я хорошо делать?

+1

Обратите внимание, что только параметры не защищены от SQL-инъекций; любая переменная, интерполированная непосредственно в строку запроса (например, '$ dbtable'), является потенциальным вектором, если его значение исходит от пользовательского ввода. Конечно, такие вещи, как имена таблиц и столбцов, никогда не должны поступать непосредственно из пользовательского ввода. – outis

ответ

27

Нет, вы не должны бежать значение сами (т.е. нет вам не нужно звонить mysqli_real_escape_string), когда вы используете подготовленные заявления: двигатель DB будет делать это сам.

(На самом деле, если вы звонили mysql_real_escape_string и используя связанные параметры, ваши строки будут получать убежали два раза - что не было бы здорово: вы бы в конечном итоге вытекания символы везде ...)


В качестве побочного элемента: ваши значения передаются как целые числа (как указано 'ii'), поэтому вам не нужно было бы звонить mysql_real_escape_string, даже если вы не использовали подготовленные операторы: по мере того как его имя указывает, эта функция используется бежать ... струны.

Для целых чисел я обычно просто использую intval, чтобы убедиться, что данные, которые я вставляю в мои SQL-запросы, действительно являются целыми числами.

(Но, как вы используете подготовленные запросы, еще раз, вы не должны делать вид, что вытекающие себя)

1

Нет, вы не должны. Объединение двух приведет к появлению в видимых escape-символах, отображаемых в ваших данных.

0
function dbPublish($status)  
{  
global $dbcon, $dbtable;  

if(isset($_GET['itemId']))  
{  
    $sqlQuery = 'UPDATE ' . $dbtable . ' SET active = ? WHERE id = ?';  
    $stmt = $dbcon->prepare($sqlQuery);  
    $stmt->bind_param('ii', $status, $_GET['itemId']);  
    $stmt->execute();  
    $stmt->close();  
}  
} 
Смежные вопросы