1

Тема: Безпечні екрановані SQL запити (перекладіть мені з Python)

Я страждаю... :(

От я роблю запити так:

        $result = mysql_query(
            "select count(*) from streets where name='$name';"
        ) or die(mysql_error());

Але це не добре, тому що
http://cybportal.univ.kiev.ua/w/images/%D0%9C%D0%B0%D0%BC%D0%B8%D0%BD%D1%96_%D0%B5%D0%BA%D1%81%D0%BF%D0%BB%D0%BE%D1%96%D1%82%D0%B8.png

Прочитав що є такий ніштячок як mysql_real_escape_string. Реально крута назва для функції, але кожну змінну загорнути я можу й забути. Тепер питання, чи можу я написати функцію sq, так щоб вона працювала наступним чином:

def sq(query, **params):
    return mysql_query(query.format(
        **{k: mysql_real_escape_string(v) for k, v in params.items()}
    )) or die(mysql_error())

Тобто щоб можна було викликати

sq("select count(*) from streets where name='{name}';", name=$name);

І все було безпечно.

2

Re: Безпечні екрановані SQL запити (перекладіть мені з Python)

bunyk написав:

Тобто щоб можна було викликати

sq("select count(*) from streets where name='{name}';", name=$name);

І все було безпечно.

А так хіба не працює?

$r=mysql_query(mysql_real_escape_string("select count(*) from streets where name='$name';"));

3

Re: Безпечні екрановані SQL запити (перекладіть мені з Python)

Bartash написав:

А так хіба не працює?

$r=mysql_query(mysql_real_escape_string("select count(*) from streets where name='$name';"));

Звичйно ні:

php > $name = "Bunyk's";
php > echo mysql_real_escape_string("select count(*) from streets where name='$name';");
select count(*) from streets where name=\'Bunyk\'s\';

Треба щоб лапку в слові "Bunyk's" ескейпило, а лапки запиту - ні, інакше синтаксична помилка SQL.

4

Re: Безпечні екрановані SQL запити (перекладіть мені з Python)

Може вже краще mysqli_real_escape_string?

5

Re: Безпечні екрановані SQL запити (перекладіть мені з Python)

Можливо краще, хоча проблема не в цьому.

Проблема в тому як підставити наприклад масив в рядок?

6 Востаннє редагувалося Invader (13.03.2013 02:02:51)

Re: Безпечні екрановані SQL запити (перекладіть мені з Python)

Я не зовсі м розумію що потрібно, але може якось так:

array_walk($names, create_function('&$name', '$name = mysqli_real_escape_string($name)');

Так:

mysql_query("select count(*) from streets where name = 
create_function('$name', 'if(is_array($name)){
foreach($name as $val){
    return mysql_real_escape_string($val);
}} else {
    return mysql_real_escape_string($name);
}');");

Буде створена анонімна функція яка поверне результат виконання функції mysqli_real_escape_string. Якщо $name — масив, то функція mysqli_real_escape_string буде застосована до кожного елементу масиву. ТІльки от, скоріш за все,  буде where name = останній_елемент_масиву. Хоча я не впевнений.

7

Re: Безпечні екрановані SQL запити (перекладіть мені з Python)

використовувати framework або pdo =)

Подякували: bunyk1

8

Re: Безпечні екрановані SQL запити (перекладіть мені з Python)

Як варіант:

$sqlVariables['name'] = 'Robert\'; DROP TABLE student;';
array_map('mysql_real_escape_string', $sqlVariables);
$result = mysql_query(
    "select count(*) from streets where name='".$sqlVariables['name']."';"
) or die(mysql_error());

9

Re: Безпечні екрановані SQL запити (перекладіть мені з Python)

$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'username', 'password');

$stmt = $db->prepare("SELECT * FROM table WHERE id=:id AND name=:name");
$stmt->bindValue(':id', $id);
$stmt->bindValue(':name', $name);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

Красиво можна оптимізувати код засунути деякі фішки у ф-цію і маєте простий клас для роботи з базою при тому надійний ;) Удачі =)

Подякували: bunyk2