Sql injections
Ik ben momenteel bezig met mijn website sql injection vrij te maken.
Maar er zijn nogal redelijk veel optie etc om het tegen te gaan.
Welke opties gebruik jij ? ( graag uitleg erbij )
Naar wat ik gelezen heb is dat je dit ' vooral tegen moet gaan , klopt dit ?
Laat even jullie reply + jullie anti sql achter
Alvast bedankt !
Het belangrijkste is dat je ALLE invoer ALTIJD checked en NOOIT zo in de query zet.
Maar waar moet je op letten met teskt dan ? welke tekens vooral enof welke fucntie
om te kijken of iets alleen uit nummers bestaat gebruik ik ctype_digit fucntie voor.
is addslashes al genoeg dan ?
Gewijzigd op 01/01/1970 01:00:00 door rick
PHP met PDO, prepared statements. Dat maakt SQL-injection onmogelijk.
Vervolgens wordt er in pgSQL een stored procedure aangeroepen, waardoor SQL-injection eveneens technisch onmogelijk is.
Knappe jongen als je daar nog SQL in weet te injecteren!
mysql_real_escape_string zal enkelt al voldoende zijn dus ?
rick schreef op 04.10.2007 18:00:
mysql_real_escape_string zal enkelt al voldoende zijn dus ?
Sql injectie tutorial.
Code (php)
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
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
CREATE OR REPLACE FUNCTION create_user(IN user_name TEXT, OUT user_id INT) AS
$BODY$
DECLARE
moment TIMESTAMP;
error_string TEXT := '';
BEGIN
<<MAIN_BODY>>
BEGIN
moment := NOW(); -- maak de datumtijdstempel aan (vooral handig met meerdere inserts in meerdere tabellen)
user_id = NEXTVAL('users_id_seq'); -- maak het id aan
INSERT INTO
tabelnaam (
id,
date_created,
name
)
VALUES (
user_id,
moment,
user_name
);
EXCEPTION
WHEN check_violation THEN
error_string := 'check_violation: ' || substring(SQLERRM, '"*([A-Za-z_]+)"'); -- naam van de check-constraint
WHEN unique_violation THEN
error_string := 'unique_violation: ' || substring(SQLERRM, '"*([A-Za-z_]+)"'); -- naam van de unique-constraint
WHEN OTHERS THEN
error_string := '13|' || SQLSTATE || ';' || SQLERRM;
END MAIN_BODY;
<<FUNCTION_CLOSING>>
BEGIN
IF (error_string <> '') THEN
RAISE EXCEPTION '%',error_string; -- in php op te vangen foutmelding
END IF;
END FUNCTION_CLOSING;
RETURN;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
$BODY$
DECLARE
moment TIMESTAMP;
error_string TEXT := '';
BEGIN
<<MAIN_BODY>>
BEGIN
moment := NOW(); -- maak de datumtijdstempel aan (vooral handig met meerdere inserts in meerdere tabellen)
user_id = NEXTVAL('users_id_seq'); -- maak het id aan
INSERT INTO
tabelnaam (
id,
date_created,
name
)
VALUES (
user_id,
moment,
user_name
);
EXCEPTION
WHEN check_violation THEN
error_string := 'check_violation: ' || substring(SQLERRM, '"*([A-Za-z_]+)"'); -- naam van de check-constraint
WHEN unique_violation THEN
error_string := 'unique_violation: ' || substring(SQLERRM, '"*([A-Za-z_]+)"'); -- naam van de unique-constraint
WHEN OTHERS THEN
error_string := '13|' || SQLSTATE || ';' || SQLERRM;
END MAIN_BODY;
<<FUNCTION_CLOSING>>
BEGIN
IF (error_string <> '') THEN
RAISE EXCEPTION '%',error_string; -- in php op te vangen foutmelding
END IF;
END FUNCTION_CLOSING;
RETURN;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
De roep je in PHP aan de volgende query:
Wanneer je nu probeert om SQL-injection uit te voeren, zal de boel stuk lopen. Je kunt in de functie onmogelijk meerdere parameters opgeven. In combinatie met prepared statements is dit helemaal waterdicht. Ook krijg je mooie foutmeldingen retour mocht er ergens een constraint worden overtreden. Die zijn naar eigen behoefte verder uit te breiden.
Het voorbeeld is niet echt functioneel, met een gewone INSERT-query kun je dit eenvoudiger afhandelen. Het wordt echter een ander verhaal wanneer je 4, 5 gekoppelde tabellen van data moet gaan voorzien. Dat is met een sp een stuk eenvoudiger te regelen. (pers. mening)