Avatar
michales
Člen
Avatar
michales:

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
Člen
Avatar
Odpovídá na michales
Ori:

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  +1 15.7.2014 9:32
Avatar
michales
Člen
Avatar
Odpovídá na Ori
michales:

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:

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):

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  +1 15.7.2014 10:32
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Jiří Gracík:

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
Creating websites is awesome till you see the result in another browser ...
Avatar
michales
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
michales:
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):

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());
      }
  }
}

Jiří Gracík
Díky za odkaz :-)

Editováno 15.7.2014 11:04
 
Nahoru Odpovědět  +1 15.7.2014 11:04
Avatar
michales
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
michales:

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:

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
Člen
Avatar
Odpovídá na michales
Ori:

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
michales:

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.