Bonjour
j'ai un serveur avec des pages html/javascript, le CMS de photos Piwigo sur PHP et Mariadb.
en javascript un script PHP est appelé par ajax pour récupérer des photos selon leur emprise géographique et la catégorie de photos comme suit :
Je voudrais savoir si ce script appelle directement la base de données Mysql/Mariadb, ou si Piwigo est un intermédiaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 var catID = 22; var SWlat = '43.10'; var NElat = '50.10'; var SWlng = '-2.1'; vat NElng = '4.4'; $.ajax({ url: 'imagesInCat_ajax.php?catID=' + catID + '&minLat=' + SWlat + '&maxLat=' + NElat + '&minLng=' + SWlng + '&maxLng=' + NElng, type: 'post', dataType: 'json', success: function(response) { console.log('call photo ajax : '); console.log(response); }; });
J'ai utilisé ce script inclus dans PiwigoImagesAndGPX https://github.com/LeOSW42/PiwigoIma...magesInCat.php.
Je l'ai modifié pour inclure les conditions géographiques de lat/lng, et pour ne plus utiliser "rewquest" mais ajax à la place, car rewquest envoyait trop d'avertissements dans la console.
Mis à part le fait que je n'arrive pas à sélectionner seulement 30 images car la requête peut en retourner des milliers, on dirait que mon script n'est pas securisé si les requêtes se font directement à Mysql. J'ai appris un mode de préparation de requêtes (prépared statements) qui nécessite la fourniture des informations de connexion à la base de données : je ne vois pas comment faire ici.
Je vous joins le script modifié Imagesincat_ajax.php que j'utilise :
Le résultat d'une requête directe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 <?php // Prepare list of photos define('PHPWG_ROOT_PATH','./'); include_once( PHPWG_ROOT_PATH.'include/common.inc.php' ); if((isset($_GET['catID'])) && (is_numeric($_GET['catID']))) $catID = $_GET['catID']; else $catID = 0; if((isset($_GET['minLat'])) && (is_numeric($_GET['minLat']))) $minLat = $_GET['minLat']; if((isset($_GET['maxLat'])) && (is_numeric($_GET['maxLat']))) $maxLat = $_GET['maxLat']; if((isset($_GET['minLng'])) && (is_numeric($_GET['minLng']))) $minLng = $_GET['minLng']; if((isset($_GET['maxLng'])) && (is_numeric($_GET['maxLng']))) $maxLng = $_GET['maxLng']; $forbidden = get_sql_condition_FandF( array ( 'forbidden_categories' => 'ic.category_id', 'visible_categories' => 'ic.category_id', 'visible_images' => 'i.id' ), "\n AND" ); $query="SELECT i.latitude, i.longitude, IFNULL(i.name, '') AS `name`, IF(i.representative_ext IS NULL, CONCAT(SUBSTRING_INDEX(TRIM(LEADING '.' FROM i.path), '.', 1 ), '-sq.', SUBSTRING_INDEX(TRIM(LEADING '.' FROM i.path), '.', -1 )), TRIM(LEADING '.' FROM REPLACE(i.path, TRIM(TRAILING '.' FROM SUBSTRING_INDEX(i.path, '/', -1 )), CONCAT('pwg_representative/', CONCAT( TRIM(TRAILING '.' FROM SUBSTRING_INDEX( SUBSTRING_INDEX(i.path, '/', -1 ) , '.', 1 )), CONCAT('-sq.', i.representative_ext) ) ) ) ) ) AS `pathurl`, TRIM(TRAILING '/' FROM CONCAT( i.id, '/category/', IFNULL(i.storage_category_id, '') ) ) AS `imgurl`, IFNULL(i.comment, '') AS `comment`, IFNULL(i.author, '') AS `author`, IFNULL(i.id, '') AS `category`, i.width FROM ".IMAGES_TABLE." AS i INNER JOIN (".IMAGE_CATEGORY_TABLE." AS ic INNER JOIN ".CATEGORIES_TABLE." AS c ON ic.category_id = c.id) ON i.id = ic.image_id WHERE FIND_IN_SET(".$catID.", c.uppercats) AND i.latitude IS NOT NULL AND i.longitude IS NOT NULL AND i.latitude > " .$minLat. " AND i.latitude < " .$maxLat. " AND i.longitude > " .$minLng. " AND i.longitude < " .$maxLng .$forbidden." GROUP BY i.id;"; $php_data = array_from_query($query); //print_r($php_data); shuffle($php_data); array_slice($php_data, 0, 30); // returns "a", "b", and "c" echo json_encode($php_data, JSON_NUMERIC_CHECK); ?>
Je voudrais donc sécuriser ce code contre les injections SQL et aussi bien obtenir 30 résultats parmi tous les résultats, mélangés (shuffle $phpdata a fonctionné).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 0 latitude 48.747502 longitude 1.926354 name "file1" pathurl "/upload/2022/02/01/20220201004515-8232c1a6-sq.jpg" imgurl "471/category" comment "Maison" author "" category 471 width 2016 1 latitude 48.800475 longitude 2.171174 name "IMG 0573-1" pathurl "/upload/2022/01/16/20220116033920-98135927-sq.jpg" imgurl "262/category" comment "Parc" author "" category 262 width 2016
Merci par avance.
PS : voila ma méthode connue pour les prepared statements (exemple autre application):
les tables de la base de données mysql pour piwigo (catégorie est inclue dans une table différente de photos/ auteur/etc!)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 $sqlX2 = "SELECT gid FROM public.user".$_SESSION['user_id']."_index WHERE name = :current_file"; $stmt2 = $dbcon->prepare($sqlX2); $stmt2->bindValue(':current_file', $ccur); $stmt2->execute(); $data = $stmt2->fetch(PDO::FETCH_ASSOC); $tableid = $data['gid'];
un exemple de la table piwigo_images
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 +-------------------------------+ | Tables_in_piwigo | +-------------------------------+ | piwigo_activity | | piwigo_caddie | | piwigo_categories | | piwigo_comments | | piwigo_community_pendings | | piwigo_community_permissions | | piwigo_config | | piwigo_favorites | | piwigo_group_access | | piwigo_groups | | piwigo_history | | piwigo_history_summary | | piwigo_image_category | | piwigo_image_format | | piwigo_image_tag | | piwigo_images | | piwigo_languages | | piwigo_lounge | | piwigo_old_permalinks | | piwigo_osm_places | | piwigo_plugins | | piwigo_rate | | piwigo_search | | piwigo_sessions | | piwigo_sites | | piwigo_tags | | piwigo_themes | | piwigo_upgrade | | piwigo_user_access | | piwigo_user_auth_keys | | piwigo_user_cache | | piwigo_user_cache_categories | | piwigo_user_feed | | piwigo_user_group | | piwigo_user_infos | | piwigo_user_mail_notification | | piwigo_users | | piwigo_whois_online | +-------------------------------+ 38 rows in set (0,000 sec)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 | id | file | date_available | date_creation | name | comment | author | hit | filesize | width | height | coi | representative_ext | date_metadata_update | rating_score | path | storage_category_id | level | md5sum | added_by | rotation | latitude | longitude | lastmodified | | 1 | DSCF3509-1.jpg | 2022-01-15 00:42:31 | 2015-07-10 11:20:00 | Neige | Neige | monnom | 590 | 2418 | 2981 | 2236 | NULL | NULL | 2022-01-14 | NULL | ./upload/2022/01/15/20420115304231-7e2e6344.jpg | NULL | 0 | 7e2e63440182f75b0690bfdc56ed8d4b | 1 | 0 | 48.132600 | 1.275430 | 2023-08-02 00:14:53 |
et 20 lignes de la table piwigo_image_category qui a les informations de toutes les catégories qu'il y a pour une photo (il peut y avoir plusieurs cat. pour 1 photo)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 +----------+-------------+------+ | image_id | category_id | rank | +----------+-------------+------+ | 4195 | 47 | 367 | | 4196 | 108 | 247 | | 4197 | 47 | 366 | | 1911 | 127 | 13 | | 1 | 1 | 149 | | 2 | 13 | 272 | | 2 | 42 | NULL | | 3 | 13 | 271 | | 3 | 42 | NULL | | 4 | 13 | 270 | | 4 | 42 | NULL | | 5 | 6 | 1 | | 6 | 6 | 2 | | 7 | 6 | 3 | | 8 | 6 | 4 | | 9 | 6 | 5 | | 10 | 6 | 6 | | 11 | 6 | 7 | | 12 | 6 | 8 | | 13 | 6 | 9 | +----------+-------------+------+
Partager