Rich Text Editor to Database
Beste,
Na het implementeren van mijn Rich Text Editor (uEditor.js) kan ik wel handmatig text toevoegen. Maar als ik bepaalde teksten kopieer en plak vanuit kladblok, wordt de tekst wel weergeven in de textarea.. Maar zodra ik het op sla, wordt het niet toegevoegd aan de database
Geen idee of het nu aan mijn PHP functie ligt (aangezien hij in een normaal textarea field wel alles succesvol wegschrijft) of dat het aan de Javascript code ligt.
JS code:
https://github.com/laoqiu/uEditor/blob/master/uEditor.js
Misschien kunnen jullie het vinden.. Alvast bedankt!
Gewijzigd op 15/01/2014 09:52:50 door CNEPHP -
C Stonebakers op 15/01/2014 09:39:22:
zodra ik het op sla, wordt het zonder ene foutafhandeling gewoon niet toegevoegd aan de database
Lijkt me dat je geen of onvoldoende doet aan foutafhandeling. Controleer of de query goed is gegaan en check daarna ook of er daadwerkelijk iets is toegevoegd (affected_rows). Gebruik je mysql(i)_real_escape_string voor het de database in gaat? Anders kan het nog iets met de quotes te maken hebben.
Code is even verkleind, anders wordt het gekkenwerk
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
session_start();
include '../connect.php';
include 'head.php';
if ($_SESSION['login'] != 1)
{
header('location:login.php');
exit();
}
else
{
mysql_query("INSERT INTO events(titel, tekst, url)
VALUES('".$_POST['titel']."', '".$_POST['tekst']."', '".$_POST['url']."')");
?>
session_start();
include '../connect.php';
include 'head.php';
if ($_SESSION['login'] != 1)
{
header('location:login.php');
exit();
}
else
{
mysql_query("INSERT INTO events(titel, tekst, url)
VALUES('".$_POST['titel']."', '".$_POST['tekst']."', '".$_POST['url']."')");
?>
En nu je het zegt.. geen foutafhandeling haha, je krijgt alleen een melding als het is geupload anders niet
Gewijzigd op 15/01/2014 09:52:24 door CNEPHP -
Content niet geescaped, zodra er dus een quote in de tekst staat ga je helemaal nat. Of dat nu uit een gecopieerde tekst komt, of uit handmatig ingevoerde tekst zal mysql een worst wezen.
Geen foutafhandelijk, bouw een normale fout afhandeling in om te zien of je een database error krijgt. En denk om SQL injection, met deze code kunnen kwaadwilligen je database vernielen/hacken etc...
Oke bedankt ik ga even aan de slag
mysql_query vanaf PHP 5.5.0 deprecated is, geen idee hoelang je dit script wil gaan gebruiken maar zodra je server overgaat naar 5.5 zal het dus niet meer werken.
Kijk als vervanger voor mysqli_ of PDO, dit staat overigens wel los van het probleem dat je hebt.
Let overigens wel op dat Kijk als vervanger voor mysqli_ of PDO, dit staat overigens wel los van het probleem dat je hebt.
Gewijzigd op 15/01/2014 10:18:17 door Chris PHP
Toevoeging op 15/01/2014 10:51:35:
Chris NVT op 15/01/2014 10:17:51:
Let overigens wel op dat mysql_query vanaf PHP 5.5.0 deprecated is, geen idee hoelang je dit script wil gaan gebruiken maar zodra je server overgaat naar 5.5 zal het dus niet meer werken.
Kijk als vervanger voor mysqli_ of PDO, dit staat overigens wel los van het probleem dat je hebt.
Kijk als vervanger voor mysqli_ of PDO, dit staat overigens wel los van het probleem dat je hebt.
Hebben meer mensen me opgewezen :p, ik denk dat ik mysqli ga gebruiken in mijn huidige site. Komt goed ;)
Gewijzigd op 15/01/2014 10:51:54 door CNEPHP -
1 - filter alle user input via bijvoorbeeld filter_var functies.
2 - typecast alle niet string variabelen naar hun echte type
3 - gebruik de mysqli_real_escape_string functie voor alle variabelen die je als waarde in een query wilt hebben
4 - (of in plaats van 3) gebruik prepared statements met parameters, dit kan in zowel mysqli of pdo.
5 - als je user input gebruikt om kolomnamen te selecteren, zorg er dan voor dat je niet klakkeloos de user input overneemt, maar gebruik een switch statement (bijvoorbeeld) om een voorgedefinieerde waarde te gebruiken
En de oplossing die alle problemen zal voorkomen
6 - geen user input gebruiken in queries....
Jou query die niet escaped is
Code (php)
1
2
3
4
2
3
4
<?php
mysql_query("INSERT INTO events(titel, tekst, url)
VALUES('".$_POST['titel']."', '".$_POST['tekst']."', '".$_POST['url']."')");
?>
mysql_query("INSERT INTO events(titel, tekst, url)
VALUES('".$_POST['titel']."', '".$_POST['tekst']."', '".$_POST['url']."')");
?>
Jou code die wel escaped is
Code (php)
1
2
3
4
2
3
4
<?php
mysql_query("INSERT INTO events(titel, tekst, url)
VALUES('".mysql_real_escape_string($_POST['titel'])."', '".mysql_real_escape_string($_POST['tekst'])."', '".mysql_real_escape_string($_POST['url'])."')");
?>
mysql_query("INSERT INTO events(titel, tekst, url)
VALUES('".mysql_real_escape_string($_POST['titel'])."', '".mysql_real_escape_string($_POST['tekst'])."', '".mysql_real_escape_string($_POST['url'])."')");
?>
Voor mysqli is het mysqli_real_escape_string();
Voor PDo gebruik je prepared bijv
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
$titel = $_POST['titel'];
$tekst = $_POST['tekst'];
$url = $_POST['url'];
$ins = $conn->prepare("INSERT INTO events(titel, tekst, url)
VALUES(':titel', ':tekst', :url')");
$ins->bind_param(':titel', $titel, PDO::PARAM::STR, 5);
$ins->bind_param(':tekst', $tekst, PDO::PARAM::STR, 5);
$ins->bind_param(':url', $url, PDO::PARAM::STR, 5);
$ins->execute();
?>
$titel = $_POST['titel'];
$tekst = $_POST['tekst'];
$url = $_POST['url'];
$ins = $conn->prepare("INSERT INTO events(titel, tekst, url)
VALUES(':titel', ':tekst', :url')");
$ins->bind_param(':titel', $titel, PDO::PARAM::STR, 5);
$ins->bind_param(':tekst', $tekst, PDO::PARAM::STR, 5);
$ins->bind_param(':url', $url, PDO::PARAM::STR, 5);
$ins->execute();
?>
Let wel alle methodes hierboven is nog steeds zonder foutafhandeling!
@Chris foutafhandeling heb ik op deze manier nu,
Verder is het hele verhaal van SQL injection duidelijk, ik heb het wel een aantal keer voorbij zien komen maar nooit aandacht aan besteed omdat ik niet wist wat het inhield.
------
PS: Door mysql_real_escape_string worden alle teksten naar de database gezet
Gewijzigd op 15/01/2014 11:22:25 door CNEPHP -
De query mislukte door de aanwezigheid van een of meer single quotes ( ') in de tekst.
Dit zou met een controle "is de query gelukt" aan het licht gekomen zijn.
Dat geld ook voor query's waarin wel escapet wordt en ook op als je het met PDO oplost: er kan altijd een reden te verzinnen zijn, waarom de query mislukt. Als is het maar omdat de database koffie-pauze heeft.
C Stonebakers op 15/01/2014 11:07:55:
@Chris foutafhandeling heb ik op deze manier nu,
Dat is geen foutafhandeling, dat is simpelweg het tonen van fouten. Kan je soms al helpen, maar in dit geval niet. De fout die je had (de quotes dus) zal voor een mysql fout zorgen, niet een php fout. mysql zal de query niet uivoeren en daar een melding voor genereren. Omdat php dat helemaal niet ziet, zal php lekker doorgaan en jij ziet dus nog steeds niet wat er aan de hand is.
Voor queries moet je altijd naar het resultaat van de functie kijken. Is dat 'false' dan is de query mislukt en zal je iets moeten doen. Dat is de foutafhandeling.
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
define('ONTWIKKELMODE', true);
$sql = "een of andere query";
$result = mysql_query($sql, $connectie);
if($result === false)
{
// er ging iets fout. Wat doen we nu?
// je kunt dit loggen in een file, erorr log oid.
// liefst vertel je niet te veel aan de gebruiker, ivm gevaar van hackers die niet slimmer
// moeten worden.
// in ontwikkelmode:
if( ONTWIKKELMODE === true)
{
echo 'de query<br>'. $sql . '<br>is mislukt met de foutmelding<br>'. mysql_error($connectie);
// en nu? stoppen we? gaan we door? draaien we iets terug?
}
else
{
echo 'sorry, er ging iets mis';
}
}
?>
define('ONTWIKKELMODE', true);
$sql = "een of andere query";
$result = mysql_query($sql, $connectie);
if($result === false)
{
// er ging iets fout. Wat doen we nu?
// je kunt dit loggen in een file, erorr log oid.
// liefst vertel je niet te veel aan de gebruiker, ivm gevaar van hackers die niet slimmer
// moeten worden.
// in ontwikkelmode:
if( ONTWIKKELMODE === true)
{
echo 'de query<br>'. $sql . '<br>is mislukt met de foutmelding<br>'. mysql_error($connectie);
// en nu? stoppen we? gaan we door? draaien we iets terug?
}
else
{
echo 'sorry, er ging iets mis';
}
}
?>
Toevoeging op 15/01/2014 12:00:49:
en omdat dit nogal een lap code is, doen veel mensen simpel weg
mysql_query($sql) or die(mysql_error())
nadeel is dan natuurlijk dat je lang niet alle query's met een afgebroken scherm moet laten zitten, en dat je dan veel kunt verraden aan mensen die kwaads in zin hebben.
Daarom is het wel handig om 1 class te hebben, of desnoods een file met functions die al je query's uitvoeren.
Dan heb je maar 1 plek waar je de hele foutafhandeling moet opnemen.
En als alle query's toch in 1 file staan: dan is de overstap naar Mysqli ook niet zo groot meer (of naar Postgresql, of Oracle etc)
Gewijzigd op 15/01/2014 11:57:57 door Ivo P
Zoals Erwin al aangeeft is dit niet echt een foutafhandeling, wat Ivo laat zien voor mysql (wat jij gebruikt) krijg je al een stuk duidelijker in beeld waarom je query misloopt.
Tevens een tip, wanneer je query niet goed loopt en je kunt geen wijs uit de foutafhandeling, druk je query eens af op je scherm. Dan zie je precies wat hij doet, en had je gezien dat er dus quotes in staan die je "string" vroegtijdig afbreken met alle gevolgen van dien ;-)
En omdat je nu mysql_real_escape_string(); hebt gebruikt werkt het wel, en dat komt omdat mysql_real_escape_string(); deze quotes eruit haald en je query dus goed doorloopt.
Let wel dat je specifieke foutafhandelingen alleen in je ontwikkel stadium wilt hebben! Wanneer je deze 'live' gaat dragen kun je er algemene foutmeldingen van maken of zelf codes maken waaraan alleen jij kunt zien wat het inhoudt. Anders kun je dus eventuele gevoelig info delen aan hackers die deze foutafhandeling krijgt te zien.
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
header("Content-Type:text/html;charset=utf-8");
$db_hostnaam = "host";
$db_gebruiker = "user";
$db_wachtwoord = "password";
$db_naam = "databasename";
$mysqli = new mysqli($db_hostnaam, $db_gebruiker, $db_wachtwoord, $db_naam);
?>
header("Content-Type:text/html;charset=utf-8");
$db_hostnaam = "host";
$db_gebruiker = "user";
$db_wachtwoord = "password";
$db_naam = "databasename";
$mysqli = new mysqli($db_hostnaam, $db_gebruiker, $db_wachtwoord, $db_naam);
?>
Werkt dus niet..
Wat heeft het een met het ander te maken?
Daarop baseer ik dat PHP 5.5 dan niet mogelijk is op mijn website. En dan is mijn vraag hoe dit dan zit.
Gewijzigd op 16/01/2014 16:58:35 door CNEPHP -
Oke dankje ;p dan kijk ik maar eens verder waarom het niet werkt