abonnement Unibet Coolblue Bitvavo
pi_55622602
quote:
Op zaterdag 29 december 2007 13:19 schreef Farenji het volgende:

[..]

Het gaat juist om het inserten, of eigenlijk om de query. Je moet afvangen dat je iets doet als:
[ code verwijderd ]

En dat die $blaat dan uit een invoerveldje komt die zomaar ongecontroleerd in de query geplempt wordt. Wat gebeurt er dan als iemand invult "1 or 1"? Of nog erger: "1; drop table dbtable;" invult in het formulierveld? Juist!

Daar moet je dus filteren!! De data die uit je db komt is wat dat betreft veilig, die voer je niet uit, behalve als je de data weer in nieuwe queries gebruikt. Als je de data alleen gebruikt hoef je alleen te zorgen dat het geen problemen oplevert met speciale html karakters of quotes etc. Wel kan er bijv javascript inzitten en daar moet je dan weer voor uitkijken als je het op een html pagina plempt. Dat is waarschijnlijk ook het probleem van TS, al is dat meestal een minder ernstig probleem dan sql injection (meestal blijft de schade zeer beperkt).

Een fatsoenlijke taal gebruikt voor de beveiliging van sql injection overigens placeholders waardoor het allemaal automatisch gaat. Deze worden automatisch gequote en kunnen dus geen kwaad, wat je ook invult. Bijv in perl:
[ code verwijderd ]

Het vraagteken wordt vervangen met de gequote inhoud van $userinput. Dit is 100% sql injection proof. Misschien heeft php ook wel een plugin voor zoiets maar standaard kan het niet dacht ik.
Thx!
pi_55622637
quote:
Op zaterdag 29 december 2007 13:24 schreef colourAgga het volgende:

[..]

Voor mij gaat dat via mijn SQL klasse, die is ook makkelijk om zelf te maken maar om veiligheidsredenen zal ik nooit code van mijn SQL en Security klassen plaatsen, just to be sure
[ code verwijderd ]
Als je je code "om veiligheidsredenen" niet durft te tonen dan kan het nooit secure code zijn.
pi_55622798
quote:
Op zaterdag 29 december 2007 12:55 schreef Tarabass het volgende:

[..]

Leg het dan even uit? Ik vraag gvd om uitleg toch?
Je moet weten wat encoding/escaping is en waar het nodig is. En je moet het ook alleen gebruiken waar het nodig is, en niet gewoon maar overal toepassen onder het mom van "ik gebruik alles, dat zit het goede er ook wel tussen".

Als je in een MySQL statement een letterlijke string wil gebruiken, dan staat die tussen twee 'enkele quotes'. Als je in die string een enkele quote wil gebruiken dan moet je er voor zorgen dat die ' niet wordt verward met de ' die het eind van de string aan geeft. Dat doe je door er een backslash voor te zetten, of je laat het php doen met mysql_real_escape_string() (of addslashes() ). mysql_real_escape_string() en addslashes() gebruik je dus alleen als je een string in een mysql string wilt zetten.

In html hebben <, > en & een speciale betekenis. Als je een kleiner dan teken < in een html pagina wil laten zien, dan moet je voorkomen dat dat teken wordt gezien alt het begin van een html tag. Je gebruikt daarom &gt;, of je laat het door php doen met htmlentities(). Je gebruikt htmlentities() dus alleen als je tekst in een html pagina wil zetten.

Verder moet je natuurlijk alle invoer van de gebruiker controleren (is de userid uit de querystring wel echt een integer?). En dat geldt niet alleen voor gegevens die je naar je database stuurt.
Een handige manier om het gedoe met encoding van strings in sql te voorkomen, is door gebruik te maken van geparameteriseerde query's. Dat kan meel makkelijk met behulp van PDO.
Wil iedereen die in telekinese gelooft nu mijn hand op steken?
| Foto's van toen en nu | Icons | Whatpulse keyboard | .NET developer? |
pi_55624779
quote:
Op zaterdag 29 december 2007 13:37 schreef SuperRembo het volgende:
Als je in een MySQL statement een letterlijke string wil gebruiken, dan staat die tussen twee 'enkele quotes'. Als je in die string een enkele quote wil gebruiken dan moet je er voor zorgen dat die ' niet wordt verward met de ' die het eind van de string aan geeft. Dat doe je door er een backslash voor te zetten, of je laat het php doen met mysql_real_escape_string() (of addslashes() ). mysql_real_escape_string() en addslashes() gebruik je dus alleen als je een string in een mysql string wilt zetten.
mysql_real_escape_string() it is
quote:
In html hebben <, > en & een speciale betekenis. Als je een kleiner dan teken < in een html pagina wil laten zien, dan moet je voorkomen dat dat teken wordt gezien alt het begin van een html tag. Je gebruikt daarom &gt;, of je laat het door php doen met htmlentities(). Je gebruikt htmlentities() dus alleen als je tekst in een html pagina wil zetten.
htmlentities() it is
quote:
Verder moet je natuurlijk alle invoer van de gebruiker controleren (is de userid uit de querystring wel echt een integer?). En dat geldt niet alleen voor gegevens die je naar je database stuurt.
Een handige manier om het gedoe met encoding van strings in sql te voorkomen, is door gebruik te maken van geparameteriseerde query's. Dat kan meel makkelijk met behulp van PDO.
Die PDO gaat mij wat te snel, al ziet het er wel heel bruikbaar uit. Liever zou ik het eerst gecontroleerd willen doen door functies als is_int() etc..

Maar als ik dus is_int() gebruik voor integer, kan ik dan gewoon is_string() gebruiken voor strings enzovoort? En dat in een if-statement afvangen?
pi_55625126
Als je eens naar php.net gaat, dan wordt je al veel wijzer. Zie bijvoorbeeld deze pagina: http://nl2.php.net/is_int

Links zie je in het menu nog veel meer is_ functies staan.
pi_55625144
Als je trouwens dit doet:

1
2
3
<?php
$getal 
= (int)$iets;
?>


De variabele $getal bevat dan altijd een integer, ongeacht wat $iets is.
pi_55629265
quote:
Op zaterdag 29 december 2007 15:30 schreef HuHu het volgende:
Als je eens naar php.net gaat, dan wordt je al veel wijzer. Zie bijvoorbeeld deze pagina: http://nl2.php.net/is_int

Links zie je in het menu nog veel meer is_ functies staan.
Dat had ik gezien ja. Vandaar de vraag of ik dat dus in if-statements moest gebruiken zoals ze dat veel doen in de functies eronder. Maar nu snap ik hoe ik ze moet gebruiken, want op php.net draaien ze imo soms helemaal door (natuurlijk goed maarja) waardoor je al gauw zoiets hebt van "waar hebben ze het over". Dit gaan we even testen en uitproberen
pi_55632547
quote:
Op zaterdag 29 december 2007 13:30 schreef Farenji het volgende:

[..]

Als je je code "om veiligheidsredenen" niet durft te tonen dan kan het nooit secure code zijn.
Ik ga er zelf nooit vanuit dat mijn code 100% zeker is, dat is de reden
pi_55633158
quote:
Op zaterdag 29 december 2007 20:43 schreef colourAgga het volgende:

[..]

Ik ga er zelf nooit vanuit dat mijn code 100% zeker is, dat is de reden
Lijkt me *juist* reden om de code aan anderen te laten zien.
pi_55636347
quote:
Op zaterdag 29 december 2007 18:41 schreef Tarabass het volgende:

[..]

Dat had ik gezien ja. Vandaar de vraag of ik dat dus in if-statements moest gebruiken zoals ze dat veel doen in de functies eronder. Maar nu snap ik hoe ik ze moet gebruiken, want op php.net draaien ze imo soms helemaal door (natuurlijk goed maarja) waardoor je al gauw zoiets hebt van "waar hebben ze het over". Dit gaan we even testen en uitproberen
Je hoeft ook niet de comments te lezen, gewoon de documentatie is al genoeg. Binnen een if moet een boolean staan, de is_ geven een boolean terug: dus ze mogen binnen een if.
pi_55640199
quote:
Op zaterdag 29 december 2007 21:05 schreef Farenji het volgende:

[..]

Lijkt me *juist* reden om de code aan anderen te laten zien.
Dat is ook wel weer een punt
pi_55656159
Ik heb even wat gebouwd vanmiddag. Hopelijk wil iemand er even naar kijken en tips/commentaar geven. Hopelijk heeft iemand anders er dan ook nog wat aan:
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
<?
   CheckPostData($mysql_tbn);
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Perfect_Form</title>
</head>
<body>
<div id="container">
<?php
    $sql_select = "SELECT ip, data, date FROM " . $mysql_tbn . " ORDER BY id DESC LIMIT 0,5";
    $result = mysql_query($sql_select);
    $i = 0;

    echo "<table>";
      while(($row = mysql_fetch_object($result)) !== false) {
        $ip   = $row->ip;
        $ip   = long2ip($ip);
        $data = $row->data;
        $data = htmlentities(stripslashes($data));
        $date = $row->date;
        $i++;

        echo "<tr class=\"d".($i & 1)."\">";
           echo "<td width='50%' align='left'>" . $ip . "</td>";
           echo "<td align='right'><i>" . $date . "</i></td>";
        echo "</tr>";
        echo "<tr>";
           echo "<td align='left' colspan='2'>" . $data;
           echo "<hr /></td>";
        echo "</tr>";
      }
    echo "</table>";
?>
    <table>
        <form name="form" action="<?php $_SERVER['PHP_SELF'] ?>" method="POST">
            <tr>
                <td>
                    <textarea name="data" onClick="make_blank();">Hier je bericht.....</textarea>
                </td>
            </tr>
            <tr>
                <td align="right">
                    <input type="reset" value="Reset" />
                    <input type="submit" value="Submit" />
                </td>
            </tr>
        </form>
    </table>
</div>
<!-- Close Connection -->
<?php mysql_close($con); ?>
</body>
</html>

<!-- Functions -->
<?php
   function CheckPostData($mysql_tbn) {
        $ip = $_SERVER['REMOTE_ADDR'];
        $ip = ip2long($ip);
      $data = mysql_real_escape_string($_POST['data']);
      $date = date('y-m-j H:i:s');

        if($data != "Hier je bericht.....") {
          if($data != "" && is_string($data)) {
                InsertQuery($mysql_tbn, $ip, $data, $date);
          }
        }
   }
    function InsertQuery($table, $ip, $data, $date) {
      $sql_insert = "INSERT INTO " . $table . " SET ";
      $sql_insert .= "id = ''";
      $sql_insert .= ", ip = '" . $ip . "'";
      $sql_insert .= ", data = '" . $data . "'";
      $sql_insert .= ", date = '" . $date . "'";

        $result = mysql_query($sql_insert);
        header("Location: " . $_SERVER['PHP_SELF']);
        //exit;
    }
?>


Voorbeeld
pi_55658040
quote:
Op zondag 30 december 2007 16:25 schreef Tarabass het volgende:
Ik heb even wat gebouwd vanmiddag. Hopelijk wil iemand er even naar kijken en tips/commentaar geven. Hopelijk heeft iemand anders er dan ook nog wat aan:
[ code verwijderd ]

Voorbeeld
Een vraagje: waar de fuck komt $mysql_tbn vandaan?
pi_55660110
quote:
Op zondag 30 december 2007 17:43 schreef Farenji het volgende:

[..]

Een vraagje: waar de fuck komt $mysql_tbn vandaan?
Boven de functieaanroep van CheckPostData() stonden mijn database-variablen. Die heb ik in verband met veiligheid even weggehaald. $mysql_tbn is dus gevuld met de tabel-naam

Maar het gaat dus om de veiligheid van de afhandelingen van de gegevens

Wie heeft "Hier je bericht....." erin gekregen dan?
pi_55662774
quote:
Op zondag 30 december 2007 19:12 schreef Tarabass het volgende:
Wie heeft "Hier je bericht....." erin gekregen dan?
Wil iedereen die in telekinese gelooft nu mijn hand op steken?
| Foto's van toen en nu | Icons | Whatpulse keyboard | .NET developer? |
pi_55662806
quote:
Op zondag 30 december 2007 20:51 schreef SuperRembo het volgende:

[..]

Leg uit. Want ik vang wel af dat hij er niet in mag komen in principe. Heb zelfs de puntjes zitten tellen

En hoe vind je het verder er nu uitzien?

Verder in het centrale topic dus. Lekker overzichtelijk ook, die centrale topics

Bouw dan eerst een fatsoenlijke zoekmachine, want iets vinden in een centraal topic is nu nog vrijwel onmogelijk

Nouja, pech gehad! Had graag nog even verder gepraat over de security..
  zondag 30 december 2007 @ 20:53:06 #42
17137 Sander
Nerds do it rarely
pi_55662815
Laten we verder kleppen in het centrale topic.
abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')