Возможный дубликат:
Что делает mysql_real_escape_string (), что делает addlashes ()?
Если вы пытаетесь предотвратить внедрение sql, первое, что вам нужно сделать, это использовать mysql_real_escape_string. Можно ли вводить базу данных с помощью функции addslashes ()?
addslashes является грубым эквивалентом str_replace($str, "'", "\\'")
. Вы можете обойти его тривиально с любым количеством последовательностей юникода, которые оцениваются до '
в mysql», но выглядят совершенно иначе, чем для addslashes()
.
Mysql_real_escape_String()
с другой стороны, использует фактическую внутреннюю функцию escaping mysql, которая точно знает, что искать и исправлять, чтобы сделать ее «безопасной» для mysql. То, что работает для mysql, может не работать для другой базы данных, так как у каждого есть несколько отличная семантика и требования к экранированию, но если вы работаете с mysql, то «реальная escape-строка» – это путь.
Это происходит, когда вы добавляете только косые черты на языке, который понимает кодировки Unicode (или смешивает кодировки при отправке запроса): http://bugs.mysql.com/bug.php?id=22243
В основном безопаснее знать, чего ожидает база данных в период кодирования – таким образом вы не сможете случайно избежать половину персонажа или оставить более позднюю часть символа без сохранения.
И все же это возможно, если вы добавите некотируемые данные в таблицу, т.е.
SELECT * FROM tbl WHERE id = 10
Здесь вы хотите убедиться, что этот идентификатор – это точно цифра
$id = intval( $_GET[ 'id' ] ) ; $query = "SELECT * FROM tbl WHERE id = {$id}" ; $result = mysql_query( $query ) ; // ... bla-bla