2015-01-31 5 views
1

В настоящее время я пишу CMS и хочу предотвратить SQL-инъекцию.Как правильно подготовить заявление?

У меня есть переменная $ url_variable, которая является $ _GET. Теперь я хочу подготовить инструкцию и выполнить поиск $ url_variable в моей таблице.

$stmt = $db_connect->prepare("SELECT * FROM $url_table WHERE url = ?"); 
$url_variable = $stmt->quote($url_variable); 
$stmt->bind_param("s", $url_variable); 

Теперь мои вопросы: Правильно ли этот код? Мне нужна цитата? И безопасно ли это от любой SQL-инъекции?

+1

Создайте массив со всеми допустимыми именами таблиц, затем проверьте, существует ли в массиве '$ url_table'. Если это - используйте его, иначе - не делайте этого. – zerkms

+0

Вы должны ** не ** использовать '$ stmt-> quote', когда используете' bind_param'. Параметры привязки заботятся обо всем. – Barmar

+0

$ url_table уже безопасен и установлен заранее. Я хочу знать, как защитить $ url_variable, поэтому я могу выполнить его без риска внедрения SQL. – iMpuLz

ответ

1

Использование bind_param защищает эти параметры от SQL-инъекции. Вам не нужно $stmt->quote, и это может привести к сбою запроса. Он добавит escape-символы, и когда вы используете bind_param, он будет искать эти символы буквально.

0

Вы не должны процитировать переменные связывания в подготовленных операторах - оператор заботится о том, что для вас:

$stmt = $db_connect->prepare("SELECT * FROM $url_table WHERE url = ?"); 
$stmt->bind_param("s", $url_variable); 
3

Вы должны создать белый список для вашего $ url_table переменного и проверить, если имя таблицы в вашем белый список, прежде чем использовать его в своем запросе. Например, вы можете сделать это с простым, если проверка:

if ($url_table == 'allowedTableName' || $url_table == 'anotherAllowedTableName') 
{ 

    $stmt = $db_connect->prepare("SELECT * FROM $url_table WHERE url = ?"); 
    $stmt->bind_param("s", $url_variable); 
    //........ 
} 
else { 
    die('Illegal table name provided'); 
} 

Вы не должны цитировать переменную, которая связана, вы хорошо идти с готовым заявлением!

1

В этом коде:

если вы используете Url_Variable метода GET может быть добавлены strip_tags или htmlenteties для удаления/предотвращения межсайтовых-сценарии атак путем полного удаления любого HTML и PHP тегов, которые он находит, как в:

$url_variable=$_GET['url_variable']; 
$url_variable=strip_tags($url_variable); 

Это делается для того, чтобы избежать неправильной программы/скрипта. Более безопасный будет обработана подготовленными заявлениями, как:

$stmt = $db_connect->prepare("SELECT * FROM $url_table WHERE url = ?"); 
$stmt->bind_param("s", $url_variable); 

Поэтому нет необходимости использовать Quote в Mysqli, так как он был использованы подготовленных заявлений и свяжите параметры, чтобы обеспечить, что вы надеваете» я забыл избежать конкретной строки, которая привела к потенциальной проблеме безопасности.

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