Вурдалак
Продвинутый новичок
mysql_real_escape_string() не работает
[sql]CREATE TABLE `tbl` (
`id` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR( 100 ) CHARACTER SET big5 COLLATE big5_chinese_ci NOT NULL ,
`img` BLOB NOT NULL ,
PRIMARY KEY ( `id` )
);[/sql]
PHP version: 5.3.1
MySQL version: 5.1.40-community
Что за херня, собственно? Я получаю то, что как раз быть не должно: SQL injection. Запрос получается таким:
[sql]INSERT INTO tbl (name, img) VALUES ('α', 0x1234) -- ', '')[/sql] (вместо α буква «альфа»).
Аналогично не работает и с GBK, т.е. mysql_escape_string($name) === mysql_real_escape_string($name). Скорее всего mysql_real_escape_string() не получает кодировку текущего соединения. Почему?
P.S. Кстати, с каких пор требуется завершение комментария «*/»?
PHP:
<?php
error_reporting(E_ALL | E_STRICT);
set_error_handler(function($errno, $errstr, $errfile = '', $errline = 0, array $errcontext = NULL) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
});
try {
$charset = 'big5'; // Chinese encoding
header('Content-type: text/plain; charset=' . $charset);
mysql_connect('localhost', 'root', 'qwerty');
mysql_select_db('test_db');
if( ! mysql_query('SET NAMES ' . $charset) ) {
die('Error while executing query: ' . mysql_error());
}
$name = "\xA3', 0x1234) -- ";
$name_lit = "'" . mysql_real_escape_string($name) . "'";
$query = "INSERT INTO tbl (name, img) VALUES ($name_lit, '')";
if( ! mysql_query($query) ) {
die('Error while executing query "' . $query . '": ' . mysql_error());
}
} catch(ErrorException $e) {
echo $e->getMessage();
}
`id` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR( 100 ) CHARACTER SET big5 COLLATE big5_chinese_ci NOT NULL ,
`img` BLOB NOT NULL ,
PRIMARY KEY ( `id` )
);[/sql]
PHP version: 5.3.1
MySQL version: 5.1.40-community
Что за херня, собственно? Я получаю то, что как раз быть не должно: SQL injection. Запрос получается таким:
[sql]INSERT INTO tbl (name, img) VALUES ('α', 0x1234) -- ', '')[/sql] (вместо &#945; буква «альфа»).
Аналогично не работает и с GBK, т.е. mysql_escape_string($name) === mysql_real_escape_string($name). Скорее всего mysql_real_escape_string() не получает кодировку текущего соединения. Почему?
P.S. Кстати, с каких пор требуется завершение комментария «*/»?