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 :
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); };  });
Je voudrais savoir si ce script appelle directement la base de données Mysql/Mariadb, ou si Piwigo est un intermédiaire.

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 :
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);
 
?>
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
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
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é).

Merci par avance.

PS : voila ma méthode connue pour les prepared statements (exemple autre application):

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'];
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
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)
un exemple de la table piwigo_images
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 |
+----------+-------------+------+