Veilig en correcte verwerking

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Michael Brouwer

Michael Brouwer

21/08/2013 17:05:30
Quote Anchor link
Ik heb een vraagje over onderstaande script, ik vroeg mij af of mijn script veilig genoeg is en correct opgebouwd.

Alvast bedankt

Groet,

Michael
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
session_start();

$_SESSION['n_title'] = $_POST['n_title'];
$_SESSION['n_content'] = $_POST['n_content'];

if($_SERVER['REQUEST_METHOD'] == 'POST') {
    if(!isset($_POST['n_title']) || empty($_POST['n_title'])) {
        $TitleError = 'Titel mag niet leeg zijn';
    }
elseif(strlen($_POST['n_title']) < 4) {
        $TitleError = 'Titel moet minimaal 4 letters lang zijn';
    }

    if(!isset($_POST['n_content']) || empty($_POST['n_content'])){
        $ContentError = 'Bericht mag niet leeg zijn';
    }

    if(empty($TitleError) && empty($ContentError)) {
        $sql = mysql_query
        ("
            INSERT INTO news (n_title, n_content)
            VALUE('"
.mysql_real_escape_string($_POST['n_title'])."', '".mysql_real_escape_string($_POST['n_content'])."')
        "
);
        
        if($sql) {
                $succes = 'Nieuwsartikel toegevoegd';
                header('Refresh: 3; url=/admin/news/');
            }
else {
                echo 'Er is een fout opgetreden bij de query';
                echo mysql_error();
            }        
    }
}

?>


<div id="main">
    <h1>Nieuw nieuwsartikel</h1>
    
    <div class="content">
        <form action="" method="POST">
            <div class="input_row">    
                <label for="n_title">Titel *</label>
                <input type="text" class="input" id="n_title" name="n_title" value="<?php echo $_SESSION['n_title']; ?>" />
                <?php echo $TitleError; ?>
            </div>

            <div class="input_row">    
                <label for="n_content">Bericht *</label>
                <input type="text" class="input" id="n_content" name="n_content" value="<?php echo $_SESSION['n_content']; ?>" />
                <?php echo $ContentError; ?>
            </div>                
                
            <input type="submit" class="button green" value="Toevoegen" />
        </form>
    </div>
</div>

Bewerkt:
Script tussen code-tags geplaatst. Gelieve dit voortaan zelf te doen.
Gewijzigd op 22/08/2013 12:58:56 door - Ariën -
 
PHP hulp

PHP hulp

23/04/2024 12:17:12
 
Kris Peeters

Kris Peeters

21/08/2013 17:25:48
Quote Anchor link
Lijnen 4 en 5 kunnen notice's geven wanneer $_POST leeg is.
Je kan dit doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$_SESSION
['n_title'] = isset($_POST['n_title']) ? $_POST['n_title'] : '';
...

?>


Google "ternary operator" voor meer info
Gewijzigd op 21/08/2013 17:26:29 door Kris Peeters
 
Chris PHP

Chris PHP

21/08/2013 17:29:09
Quote Anchor link
Regel 28 zou ik niet doen, dit geeft specifieke MySQL errors wat je niet aan de bezoekers wil mededelen aangezien dit potentionele hackers kunnen zijn en dus misbruik kunnen maken van die informatie.

Misschien ook slim om de switch te maken naar mysqli aangezien de meeste functies in php 5.5 deprecated zullen zijn.
Gewijzigd op 21/08/2013 17:30:37 door Chris PHP
 
Michael Brouwer

Michael Brouwer

21/08/2013 17:38:26
Quote Anchor link
Bedankt voor de tips!
Toch nog een vraagje. Is isset() en empty() beide nodig, of is 1 van de twee ook voldoende?

Is het script verder wel "veilig"?
 
Chris PHP

Chris PHP

21/08/2013 17:40:13
Quote Anchor link
In principe is isset() voldoende, eigenlijk de vervanger van empty()

isset() kijkt of de variabel geset is en niet null is.
Gewijzigd op 21/08/2013 17:41:36 door Chris PHP
 
Kris Peeters

Kris Peeters

21/08/2013 22:19:20
Quote Anchor link
Het is nooit nodig om beide samen te controleren.

if(isset($_POST['n_title']) && !empty($_POST['n_title'])) {

is het zelfde als

if(!empty($_POST['n_title'])) {

Omdat empty intern zelf een isset check doet.

De vraag is dus: "Is het relevant om een empty() te doen, of volstaat isset()".
Noteer daarbij dat empty een true geeft voor waarden als 0, of ''.
Over het algemeen kan je dus beter isset() controleren; en niet empty()
 
Chris -

Chris -

22/08/2013 06:46:34
Quote Anchor link
Chris NVT op 21/08/2013 17:40:13:
In principe is isset() voldoende, eigenlijk de vervanger van empty()

isset() kijkt of de variabel geset is en niet null is.


Zie je dit vaker zeggen, maar ben toch een voorstander van empty tegenover isset. In empty ZIT ISSET AL, het rekent false, nul (integer), null en een lege string als negatief resultaat.
 
Kris Peeters

Kris Peeters

22/08/2013 10:23:41
Quote Anchor link
Ik denk dat de waarde 0 het meest roet in het eten doet.

Door empty te gebruiken impliceer je dat 0 absoluut niet kan gebruikt worden als waarde.
Meestal is dat ook wel het geval.
Een username, password, e-mail, telefoonnummer ... kunnen nooit de waarde 0 hebben (of ge hebt een heel erg vreemd beleid op je site).

Dus daar kan je zonder probleem empty gebruiken.

---
Als je een index stuurt - bij voorbeeld met radio button of select - waar je dus zegt: het "zoveelse element" is gekozen, gebruik je isset. (want 0 kan een geldige waarde zijn)

---
Met getallen maakt het weinig uit, in volgende context:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$getal
= isset($_POST['getal']) ? intval($_POST['getal']) : 0;
// resulteert in het zelfde als
$getal = !empty($_POST['getal']) ? intval($_POST['getal']) : 0;
?>
 
Erik van Beek

Erik van Beek

22/08/2013 11:26:44
Quote Anchor link
Je doet
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $_SESSION['n_title']; ?>

Dit is dezelfde als de $_POST waarde, als ik html of javascript invoer zou dat dus gewoon uitgevoerd worden. Niet veilig dus.

Probeer je zelf aan te leren alles wat je op het scherm wilt hebben goed te escapen.

Maak er
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo htmlspecialchars($_SESSION['n_title']); ?>
van en dat probleem is ook opgelost ;).
 
Michael Brouwer

Michael Brouwer

22/08/2013 12:39:24
Quote Anchor link
Thanks voor de tip iedereen :)
 
Chris PHP

Chris PHP

22/08/2013 12:57:07
Quote Anchor link
@Chris,
De keuze is persoonlijk ik ga liever voor isset jij voor emtpy, feit is dat dubbele checks met isset en empty nooit nodig is. En of je nu isset gebruikt of empty tja dat is een keuze die je zelf maakt beide zijn goed.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.