Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
michales
Člen
Avatar
michales:15.7.2014 8:55

Zdravím,
potřeboval bych poradit následující.

Potřeboval bych poradit jakým způsobem kontrolovat slova psaná do teaxtera a pokud se tam objeví nevhodné slovo zprávu neodeslat. Slovo které považuji za nevhodné je "heslo".

Tudíž pokud odesílaný vzkaz do chatu bude obsahovat toto slovo zpráva se neodešle a vyskočí hláška o tom že uživatel používá nevhodné slovo.

Scripty:
index.php

<?php
  session_start();
  require "../settings.php"; // Vloží soubor s třídou User
require "../user.class.php"; // Vloží soubor s třídou User
$user = new User; // Zavede třídu do proměnné
$user->load(); // Pokusí se přihlásit uživatele z uložených údajů v _SESSION nebo _COOKIE
$_SESSION['jmeno'] =  $user->jmeno ;
$_SESSION['admin'] = $user->admin ;
$_SESSION['id'] =  $user->id ;
?>
<!DOCTYPE html>
<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>AJAX chat
    </title>
    <link rel="stylesheet" href="/chat/css/style.css">
  </head>

  <body>
    <div class="chat">
      <div class="messages">
      </div>
      <div class="emotikons">
      <img onclick="Smile(':-)')" src="smileys/1.gif" width="15" height="15" align="middle">
<img onclick="Smile(':-(')" src="smileys/2.gif" width="15" height="15" align="middle">
<img onclick="Smile(':-D')" src="smileys/3.gif" width="15" height="15" align="middle">
<img onclick="Smile(':-P')" src="smileys/4.gif" width="15" height="15" align="middle">
<img onclick="Smile(';-)')" src="smileys/5.gif" width="15" height="15" align="middle">
<img onclick="Smile('X[]')" src="smileys/6.gif" width="20" height="15" align="middle">
<img onclick="Smile('B-]')" src="smileys/7.gif" width="15" height="15" align="middle">
<img onclick="Smile(':-!')" src="smileys/8.gif" width="20" height="15" align="middle">
<img onclick="Smile(':-/')" src="smileys/9.gif" width="25" height="15" align="middle">
<img onclick="Smile('blee')" src="smileys/10.gif" width="25" height="15" align="middle">
<br /></div>
<textarea class="entry" id="zprava" placeholder="Zprávu odešleš pomocí enter. Na další řádek jdi pomocí SHIFT + ENTER. Nepište si zde o heslo!!"></textarea>
    </div>
<script src="http://code.jquery.com/jquery-2.0.3.js"></script>
<script src="/chat/js/chat.js"></script>
  </body>
</html>

chat.js

var chat = {}
chat.fetchMessages = function () {
   $.ajax({     url: '/chat/ajax/chat.php',
       type: 'post',
          data: { method: 'fetch' },
             success: function(data) {
                    $('.chat .messages').html(data);
                      }
                       });
                         }
             chat.throwMessage = function (message) {
             if ($.trim(message).length !=0) {
             $.ajax({
             url: '/chat/ajax/chat.php',
             type: 'post',
              data: { method: 'throw', message: message },
                success: function(data) {
                  chat.fetchMessages();
                  chat.entry.val('');
           }
            });
              }
               }

                chat.entry = $('.chat .entry');
              chat.entry.bind('keydown', function(e) {
                    if (e.keyCode === 13 && e.shiftKey === false) {
                            chat.throwMessage($(this).val());
                  event.preventDefault();
                      }
                       });
   chat.interval = setInterval(chat.fetchMessages, 15000);
   chat.fetchMessages();


function Smile(smiley)
    {

        var currentText = document.getElementById("zprava");

        var smileyWithPadding = " " + smiley + " ";
        currentText.value += smileyWithPadding;
    currentText.focus();

    }
        function Names(name)
    {

        var currentText = document.getElementById("zprava");

        var nameWithPadding = ""+name+"";
        currentText.value = nameWithPadding;
    currentText.focus();

    }

Chat.php

<?php
class Chat extends Core{
     public function fetchMessages() {
          $this->query("
           SELECT     `chat`.`message`,
                       `chat`.`timestamp`,
                       `chat`.`ip`,
                       `chat`.`message_id`,
                       `uzivatele`.`jmeno`,
                       `uzivatele`. `id`,
                       `uzivatele`. `admin`
           FROM        `chat`
           JOIN        `uzivatele`
           ON          `chat`.`id` = `uzivatele`.`id`
           ORDER BY    `chat`.`timestamp`
           DESC
          ");

          return $this->rows();
     }
     public function throwMessage($id, $message){
     $adr=$_SERVER["REMOTE_ADDR"];
         $this->query("
             INSERT INTO `chat` (`id`, `message`, `timestamp`, `ip`)
             VALUES (" . (int)$id.", '" .$this->db->real_escape_string($message) ."', UNIX_TIMESTAMP(), '$adr')

         ");
     }
}

Budu vděčný za radu.

Editováno 15.7.2014 8:56
Odpovědět
15.7.2014 8:55
"Cíle by měly být třešínky na dortech, ne na hromadách hoven."
Avatar
Ori I
Člen
Avatar
Odpovídá na michales
Ori I:15.7.2014 9:32

tak určite by som na to použil regulárne výrazy. A to jednak v JS(pred odoslaním ajaxu), ALE aj v php(pretože JS si viem vypnúť a posielať zakázané slova aj bez neho).

Jednoducho bud to nejako implementuješ pomocou jQuery pluginu alebo si na to napíšeš vlastnú funkciu. V php je to potom jednoduché. Vo funkcii throwMessage budeš regexom kontrolovať slová a na konci odosielať json v ktorom budeš informovať o úspešnom / neúspešnom(obsahuje zakázané slová) vložení.

 
Nahoru Odpovědět
15.7.2014 9:32
Avatar
michales
Člen
Avatar
Odpovídá na Ori I
michales:15.7.2014 9:37

Díky za radu, ale jak přesně v throwMessage ty slova kontrolovat?

Nahoru Odpovědět
15.7.2014 9:37
"Cíle by měly být třešínky na dortech, ne na hromadách hoven."
Avatar
michales
Člen
Avatar
michales:15.7.2014 9:41

Nějak takto?

<?php
class Chat extends Core{
     public function fetchMessages() {
          $this->query("
           SELECT     `chat`.`message`,
                       `chat`.`timestamp`,
                       `chat`.`ip`,
                       `chat`.`message_id`,
                       `uzivatele`.`jmeno`,
                       `uzivatele`. `id`,
                       `uzivatele`. `admin`
           FROM        `chat`
           JOIN        `uzivatele`
           ON          `chat`.`id` = `uzivatele`.`id`
           ORDER BY    `chat`.`timestamp`
           DESC
          ");

          return $this->rows();
     }
public function throwMessage($id, $message){
     $adr=$_SERVER["REMOTE_ADDR"];
      if(!strstr($message, "heslo")){
         $this->query("
             INSERT INTO `chat` (`id`, `message`, `timestamp`, `ip`)
             VALUES (" . (int)$id.", '" .$this->db->real_escape_string($message) ."', UNIX_TIMESTAMP(), '$adr')

         ");
      }else{
        die("Text obsahuje slovo heslo!");
      }
}
}
Nahoru Odpovědět
15.7.2014 9:41
"Cíle by měly být třešínky na dortech, ne na hromadách hoven."
Avatar
Martin Konečný (pavelco1998):15.7.2014 10:32

Napadá mě udělat si privátní pole slov (takový blacklist) a v metodě throwMessage() to procházet cyklem a zjišťovat, zda tam takové slovo je. Nevím, jaká funkce je na to nejefektivnější, ale třeba strpos() by mohlo stačit.

private $badWords = array("heslo", "neco", "dalsiho");

// metoda
$wordExists = FALSE;
foreach ($this->badWords as $word) {
  if (strpos($message, $word) !== FALSE) {
    $wordExists = TRUE;
    break;
  }
}

// nebo třeba pomocí výjimky
try {
  foreach ($this->badWords as $word) {
    if (strpos($message, $word) !== FALSE) {
      throw new Exception("Text obsahuje slovo {$word}.");
    }
  }
} catch (Exception $e) {
  die($e->getMessage());
}
Nahoru Odpovědět
15.7.2014 10:32
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Neaktivní uživatel:15.7.2014 10:39

Tady je na to algoritmus, který vypadá celkem zajímavě :)

http://en.wikipedia.org/…ck_algorithm

Editováno 15.7.2014 10:39
Nahoru Odpovědět
15.7.2014 10:39
Neaktivní uživatelský účet
Avatar
michales
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
michales:15.7.2014 10:48
private $badWords = array("heslo", "neco", "dalsiho");

// metoda
$wordExists = FALSE;
foreach ($this->badWords as $word) {
  if (strpos($message, $word) !== FALSE) {
    $wordExists = TRUE;
    break;
  }
}

// nebo třeba pomocí výjimky
try {
  foreach ($this->badWords as $word) {
    if (strpos($message, $word) !== FALSE) {
      throw new Exception("Text obsahuje slovo {$word}.");
    }
  }
} catch (Exception $e) {
  die($e->getMessage());
}

Tohle vůbec nevím jak zakomponovat do stávajícího scriptu.
Nicméně děkuji

Editováno 15.7.2014 10:51
Nahoru Odpovědět
15.7.2014 10:48
"Cíle by měly být třešínky na dortech, ne na hromadách hoven."
Avatar
Martin Konečný (pavelco1998):15.7.2014 11:04

michales
Píšu to z hlavy, takže nezaručuji, že to bude fungovat, ale udělal bych to asi takto:

<?php

class Chat extends Core{

  private $badWords = array("heslo", "neco", "dalsiho");

  public function fetchMessages()
  {
     ...
  }


  public function throwMessage($id, $message){
      $adr=$_SERVER["REMOTE_ADDR"];

      try {
        foreach ($this->badWords as $word) {
          if (strpos($message, $word) !== FALSE) {
            throw new Exception("Text obsahuje slovo {$word}.");
          }
        }

        $this->query("
          INSERT INTO `chat` (`id`, `message`, `timestamp`, `ip`)
          VALUES (" . (int)$id.", '" .$this->db->real_escape_string($message) ."', UNIX_TIMESTAMP(), '$adr')
        ");
      } catch (Exception $e) {
        die($e->getMessage());
      }
  }
}

Neaktivní uživatel
Díky za odkaz :-)

Editováno 15.7.2014 11:04
Nahoru Odpovědět
15.7.2014 11:04
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
michales
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
michales:15.7.2014 11:13

Děkuji, funguje to že to opravdu nepošle zprávu obsahující slova v $badWords ovšem nevypíše to hlášku že Text obsahuje slovo ...

Nahoru Odpovědět
15.7.2014 11:13
"Cíle by měly být třešínky na dortech, ne na hromadách hoven."
Avatar
michales
Člen
Avatar
michales:15.7.2014 15:23

nemůže být problém že se zpráva odesílá ajaxem?

Nahoru Odpovědět
15.7.2014 15:23
"Cíle by měly být třešínky na dortech, ne na hromadách hoven."
Avatar
Ori I
Člen
Avatar
Odpovídá na michales
Ori I:15.7.2014 15:29

no tak v tej funkcii "outputni" json a v ajaxu si over, či neobsahuje nejakú chybovú hlášku. Každopádne by som to robil regulárnym výrazom + pred porovnávaním by som si ten string prehnal funkciou, čo mi z neho odstráni diakritiku a podobné veci

 
Nahoru Odpovědět
15.7.2014 15:29
Avatar
michales
Člen
Avatar
Odpovídá na Ori I
michales:15.7.2014 15:34

No script výše uvedený víceméně funguje, jen nevypisuje tu hlášku že bylo použito zakázané slovo

Nahoru Odpovědět
15.7.2014 15:34
"Cíle by měly být třešínky na dortech, ne na hromadách hoven."
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.