[MySQL] SELECT in procedure, waarschuwing lege resultset.

Pagina: 1
Acties:

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Ik ben bezig met een stored procedure in MySQL (5.0.38-log). In de procedure zit een SELECT ... INTO die 1 of 0 rijen teruggeeft.

Wanneer de SELECT geen rijen teruggeeft genereert de procedure een warning. Dit is een groot probleem omdat de gebruiker NIET mag zien of de query een resultaat oplevert.

Het gaat om de volgende procedure:

SQL:
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
CREATE PROCEDURE cram_init (login TEXT)
LANGUAGE SQL
NOT DETERMINISTIC
MODIFIES SQL DATA
SQL SECURITY DEFINER
BEGIN   
        DECLARE cram_challenge  TEXT    DEFAULT MD5(NOW() * RAND());
        DECLARE userid          INT;

        SELECT  
                uid
        INTO
                userid
        FROM
                user
        WHERE   
                username        =       login;

        IF NOT userid IS NULL THEN
                INSERT INTO
                        cram
                (
                        fk_uid,
                        challenge
                )
                VALUES
                (
                        userid,
                        cram_challenge
                )
                ON DUPLICATE KEY UPDATE
                        fk_uid          =       userid,
                        challenge       =       cram_challenge;
        END IF;
        SELECT challenge;
END


Wanneer je dus cram_init aanroept met een gebruikersnaam die in de tabel user voorkomt gaat het allemaal goed. Wanneer de username niet voorkomt krijg je een warning te zien. Dit kan worden gebruikt om te controleren of een gebruikersnaam bestaat en dat is ongewenst.

Hoe kan ik die warning onderdrukken of, beter nog, de query uitvoeren zonder dat er een warning wordt gegenereerd? Ik kan er zelf niets over vinden op google of op GoT.

Ik ontken het bestaan van IE.


Verwijderd

Kun je die warning niet in je serverside code (PHP?) afvangen ipv 'm naar de user te laten doorlekken?

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Verwijderd schreef op donderdag 17 mei 2007 @ 18:33:
Kun je die warning niet in je serverside code (PHP?) afvangen ipv 'm naar de user te laten doorlekken?
Dat kan, maar dat is niet het punt. Ik schrijf de code in de veronderstelling dat de webserver gecompromitteerd kan worden en dus de logingegevens naar de database bekend zullen zijn.

De mysqlserver draait op een andere machine. Mocht de webserver dus gekraakt worden dan komen niet in een keer alle database gegevens op straat te staan (dan zullen ze dus ook de mysql server moeten kraken).

Ik ontken het bestaan van IE.


  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Probleem is opgelost. Ik heb gebruik gemaakt van handlers om simpelweg niets uit te voeren wanneer de warning ontstaat :) .

Ik ontken het bestaan van IE.


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
je zou nog, alhoewel het niet echt een nette manier is m.i., kunnen doen:
SQL:
1
SELECT max(userid) AS userid FROM blabla


dan krijg je iig altijd een resultaat... namelijk NULL als er geen resultaat is, en bij 1 resultaat krijg je het juiste userid... als je meerdere gebruikers hebt met dezelfde login (wat niet logisch is maar bijv. kan als je dezelfde tabel voor meerdere applicaties gebruikt) werkt dit uiteraard niet....