Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Chat - ongelma

Sivun loppuun

Codeprofile [16.11.2006 16:16:48]

#

Perustin jonkun-näköisen, raadon chatin omille sivuilleni, mutta nyt eteeni ilmestyi ongelma. Ongelma on siinä, että jotkut chatissäni käyvät ihmiset laittavat JScriptiä ja kaiken-näköistä HTML-pilaa kirjoittamalla viestiin esim. <h1>. Tämä alkaa ärsyttämään, kun joka kerta kun menen katsomaan chattiini, chat on täysin sekaisin.

Millä PHP-skriptillä siis saa estettyä ylimääräisten tagien käytön?!

Heikki [16.11.2006 16:25:44]

#

Funktio strip_tags() auttanee.

Codeprofile [16.11.2006 16:43:32]

#

Tai sitten semmonenkin käy, että jokaisen viestin alussa näytettäisiin kirjoittajan IP-osoite. Sitä varten siis, että voisin bannata vandaaleilta IP:t mun sivuille.

Mihin tiedostoon noi funktiot muuten laitetaan?

Olga [16.11.2006 17:15:36]

#

Yksi varteenotettava vaihtoehto on myös htmlspecialhars.

Codeprofile [16.11.2006 18:19:08]

#

KORJAAN:

Miten saisi chattiin, että se laittaisi jokaisen nimen eteen kirjoittajan IP-osoitteen?

Pyydän teitä korjaamaan alla esitetty PHP-tiedosto oikeanlaiseksi, koska en itse osaa.

***** CHAT.PHP

<?php
if ($nimi !="") {
$uusirivi = "<b>$nimi</b><big> ---> </big><br><tt><big>$viesti</big></tt><br><b>**************************************************</b><br>";
$tiedosto =("viestit.txt");
$av = fopen('viestit.txt', 'a');
// Huomaa, että käyttäjän antamasta tekstistä pitää siivota kaikki rivinvaihtomerkit pois
fputs($av, str_replace(array("\r\n", "\r", "\n"), '', $uusirivi) . "\n");
fclose($av);
}
if(empty($nimi)) {echo "Hups ! Taisi unohtua Nimimerkki O_o"; exit;}
if(empty($viesti)) {echo "Hups ! Taisi unohtua Viesti o_O"; exit;}
?>
<?php
header ("location: index.php")
?>

ajv [16.11.2006 18:54:17]

#

Toi ip:n bannaaminen on väärä ratkaisu. Bannaat kumminkin jonkun proxyn ja estät näin ollen monen syyttömänkin vierailun sivuillasi. Toisaalta sivujesi herättämään keskusteluun viitaten en tiedä onko se ollenkaan huono juttu... :)

Pöytälamppu [16.11.2006 19:29:23]

#

No nyt täytyy kyllä tunnustaa tuo <h1> juttu. Tarkoitus oli lopettaa se <h1> samalle riville, mutta typotin lopetustagin. Noh, vahinkojahan sattuu kaikille.

titityyana [17.11.2006 12:39:01]

#

Ton nimimerkin vois lähettää getillä ja näin ollen se kulkisi kokoajan mukana eikä tartte syöttää se kuin kerrran. Sitte headerilla ohjaat index.php?nimimerkki=$nimi

Ja järkevintä tuohon chathommaan on ihan vaan käyttää noita jo annettuja funktioita. Tuo IP-kikkailu on melkosen turhaa.. Mutta jos sen haluat tehdä, niin kirjota se edes niin, että se tallentuu viesti.txt tiedostoon mutta sieltä ei lueta chattiin muuta kuin nimimerkki ja itse viesti. Turha sitä IP-osoitetta (joka nyt ei juurikaan välttämättä kerro käyttäjästä mitään) on näkyviin tulostaa, kun itse sivuston ylläpitäjänä kyllä näet ne sitten sieltä tekstitiedostosta.

Ja sen ip-osoitteen selville saamisenhan oot kysyny jo toisaalla...


.p.s. on muuten kovat suunnitelmat tolla sun sivustolla.. :) Ehkä kannataisi kuitenkin tuo ulkoasu hio vähemmän sekavaksi, yhtenäiseksi, jättää ne taustakuvat pois ja luoda navigointi joka alasivulle..

Codeprofile [17.11.2006 13:14:59]

#

Oikeestaan en tarvi enää mitään ylimääräistä chattiin. Asetin juuri IP:n tallennus tilasto.txt-tiedostoon. Mutta silti tuo olisi kiva tietää. Mutta nyt avaan chatin.

Meitsi [17.11.2006 14:19:54]

#

Ip:n tallennus ei auta mitään, siinä vaiheessa jos vahinko on jo tapahtunut. Jos tallennat käyttäjän antamat tiedot sellaisenaan, (rivinvaihtojen säätäminen ei vaikuta) on kenellä tahansa mahdollisuus ajaa haluamaansa koodia palvelimella. Esim: joku voi tuhota sivusi tai muokata niitä, tai huomaamatta uploadata jotakin epäilyttävää/laitonta materiaalia. Oma ensimmäinen vieraskirjatekeleeni oli juuri tällainen, sinne pystyi laittamaan viestin seassa vaikka php-koodia. Koodisi kylläkin näyttää muutenkin erikoiselta, suosittelisin harjoittelemaan noita systeemejä suljetussa ympäristössä (laita vaikka salasanasuojattu hakemisto jossa voit itse testailla).

<?php
if ($nimi !="") {

Mistä nimi-muuttuja tulee? Sitä ei ole määritelty tai asetettu.

$uusirivi = "<b>$nimi</b><big> ---> </big><br><tt><big>$viesti</big></tt><br><b>**************************************************</b><br>";

Ei kannata tallentaa viestiä muotoilujen kanssa. Vie vain turhaa tilaa ja hankaloittaa viestien poistamista yms. Tallenna tiedostoon esimerkiksi: nimimerkki|viesti(rivinvaihto)nimimerkki|viesti(jne.) jolloin voit helposti näyttää viestit sivuillasi ja muokata niiden ulkoasua helposti. Myös viestien poisto onnistuu helposti kyseinen rivi tiedostosta poistamalla, ellei koodaa hallintasivua. Explode-funktioon kannattaa tutustua.

$tiedosto =("viestit.txt");

Mikäs tämän tarkoitus on? Kaikenlisäksi nuo sulkumerkit ovat turhat, jos haluaisit vain asettaa tiedosto-muuttujalle arvon "viestit.txt".

$av = fopen('viestit.txt', 'a');

Jos nyt haluat käyttää edellisessä huomautuksessa mainittua tapaa, että tiedostonimi on muuttujassa, vaihda 'viestit.txt':n tilalle muuttujan nimi joka on siis $tiedosto.

// Huomaa, että käyttäjän antamasta tekstistä pitää siivota kaikki rivinvaihtomerkit pois
fputs($av, str_replace(array("\r\n", "\r", "\n"), '', $uusirivi) . "\n");

Tässäkohtaa olisi sopiva vaihe karsia viestistä sopimaton sisältö (php, html, javascript yms.) pois käyttämällä jo aiemmin kerrottua funktiota.

fclose($av);
}
if(empty($nimi)) {echo "Hups ! Taisi unohtua Nimimerkki O_o"; exit;}
if(empty($viesti)) {echo "Hups ! Taisi unohtua Viesti o_O"; exit;}
?>

Öh? Tallennat viestin tiedostoon ja vasta sitten tutkit onko tietoja asetettu. empty-funktion (en muuten ole ikinä kuullutkaan tällaisesta, outoa...) sijaan voisit käyttää vaikka isset-funktiota tai tutkit vain onko viestissä tai nimessä mitään (if $viesti == "") jne.

<?php
header ("location: index.php")
?>

Miksi turhaan lopetat php-koodin ja aloitat sen heti uudestaan, nappaa php-tagit pois. Järkevämpi toteutus on muuten se, että php-koodi näyttää viestit, eikä ohjaile käyttäjää toisille sivuille. Tällöin säästytään monelta vaivalta.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta