Skocz do zawartości
  • 0
producer

Brak polskich znaków w skrypcie shoutboxa

Pytanie

Autor tematu Napisano (edytowany)

Cześć mam otóż pewien problem, na stronie normalnie polskie znaki działają, zrobiłem system newsów, do bazy danych zapisywane są i wyświetlają się bez problemy, ale gdy pobrałem z internetu gotowy skrypt shout boxa, i go dodałem, formularz z funkcją na glownej stronie, a plik wykonujący jest w osobnym folderze  o nazwa pliku  jquery 1.9.0? z rozszerzeniem js z dodatkami ajaxa jakże dziwnie to brzmi, wracając do tematu nie pobiera polskich znaków nie wyświetla zupełnie nic gdy wpiszemy np ść, do shout boxa piszę ś ć ź po czym wiadomość wysłana jako pusta i się wysyła, a jest to o tyle dziwne ze shout box sprawdza i gdy chce sie wysłac pusta wiadomość wywala informacje że nie może być pusta, a ść przechodzi i do bazy dodaje się rekord w polu  "tresc" też pusty, co pokazuje jak by nie pobierał już z formularza polskich znaków i nie przekazywał ich dalej. Wszędzie dodałem gdzie mogłem utf-8 ale dalej nic. Jakieś rady?

 

ps: wiem że google nie boli ale przeszukuje już 2h i dalej nic nie pomaga, wiekszość ma o tyle przyjemność że im ść zamienia się na sc, a mi totalnie ani to ani tamto

 

 

KOD INDEX.PHP

Spoiler
<script type="text/javascript" src="js/jquery-1.9.0.min.js" charset="utf-8"></script>
<script type="text/javascript" charset="utf-8">
$(document).ready(function() {

    // load messages every 1000 milliseconds from server.
    load_data = {'fetch':1};
    window.setInterval(function(){
     $.post('shout.php', load_data,  function(data) {
        $('.message_box').html(data);
        var scrolltoh = $('.message_box')[0].scrollHeight;
        $('.message_box').scrollTop(scrolltoh);
     });
    }, 1000);
    
    //method to trigger when user hits enter key
    $("#shout_message").keypress(function(evt) {
        if(evt.which == 13) {
                //var iusername = $('#shout_username').val();
                var iusername = "<?php echo $imie; ?>";
                var imessage = $('#shout_message').val();
                post_data = {'username':iusername, 'message':imessage};
                 
                //send data to "shout.php" using jQuery $.post()
                $.post('shout.php', post_data, function(data) {
                    
                    //append data into messagebox with jQuery fade effect!
                    $(data).hide().appendTo('.message_box').fadeIn();
    
                    //keep scrolled to bottom of chat!
                    var scrolltoh = $('.message_box')[0].scrollHeight;
                    $('.message_box').scrollTop(scrolltoh);
                    
                    //reset value of message box
                    $('#shout_message').val('');
                    
                }).fail(function(err) { 
                
                //alert HTTP server error
                alert(err.statusText); 
                });
            }
    });
    
    //toggle hide/show shout box
    $(".close_btn").click(function (e) {
        //get CSS display state of .toggle_chat element
        var toggleState = $('.toggle_chat').css('display');
        
        //toggle show/hide chat box
        $('.toggle_chat').slideToggle();
        
        //use toggleState var to change close/open icon image
        if(toggleState == 'block')
        {
            $(".header div").attr('class', 'open_btn');
        }else{
            $(".header div").attr('class', 'close_btn');
        }
         
         
    });
});

</script>

<div class="shout_box">
					
						<div class="header">GLOBAL CHAT<div class="close_btn"> </div></div>
						
							<div class="toggle_chat">
								<div class="message_box">
								</div>
								<div class="user_info">
								<input name="shout_message" id="shout_message" type="text" placeholder="Type Message Hit Enter" maxlength="100" /> 
							</div>
						</div>
					</div>

 

 

shout.php

Spoiler
if($_POST)
{
	//connect to mysql db
	$sql_con = mysqli_connect($db_host, $db_username, $db_password,$db_name)or die('could not connect to database');

	
	//check if its an ajax request, exit if not
    if(!isset($_SERVER['HTTP_X_REQUESTED_WITH']) AND strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest') {
        die();
    } 
	
	if(isset($_POST["message"]) &&  strlen($_POST["message"])>0)
	{
		//sanitize user name and message received from chat box
		//You can replace username with registerd username, if only registered users are allowed.
		$username = filter_var(trim($_POST["username"]),FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH);
		$message = filter_var(trim($_POST["message"]),FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH);
		$user_ip = $_SERVER['REMOTE_ADDR'];
		

		//insert new message in db
		if(mysqli_query($sql_con,"INSERT INTO shout_box(user, message, ip_address) value('$username','$message','$user_ip')"))
		{
			$msg_time = date('h:i A M d',time()); // current time
			echo '<div class="shout_msg"><time>'.$msg_time.'</time><span class="username">'.$username.'</span><span class="message">'.$message.'</span></div>';
		}
		
		// delete all records except last 10, if you don't want to grow your db size!
		mysqli_query($sql_con,"DELETE FROM shout_box WHERE id NOT IN (SELECT * FROM (SELECT id FROM shout_box ORDER BY id DESC LIMIT 0, 10) as sb)");
	}
	elseif($_POST["fetch"]==1)
	{
		$results = mysqli_query($sql_con,"SELECT user, message, date_time FROM (select * from shout_box ORDER BY id DESC LIMIT 10) shout_box ORDER BY shout_box.id ASC");
		while($row = mysqli_fetch_array($results))
		{
			$msg_time = date('h:i A M d',strtotime($row["date_time"])); //message posted time
			echo '<div class="shout_msg"><time>'.$msg_time.'</time><span class="username">'.$row["user"].'</span> <span class="message">'.$row["message"].'</span></div>';
		}
	}
	else
	{
		header('HTTP/1.1 500 Are you kiddin me?');
    	exit();
	}
}

 

 

PLIK: 

jquery-1.9.0.min.js

 

Skan Jquery-1.9.0.min.js

https://www.virustotal.com/#/file/f24a446638e285c4467c333cb0c5067f89b07efb258a192a471dce8e5024f89a/detection

Edytowano przez producer

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

11 odpowiedzi na to pytanie

Polecane posty

  • 0

Bez kodu nie mamy jak pomóc, można tylko gdybać

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0
Przed chwilą, GrabsonPL napisał:

Bez kodu nie mamy jak pomóc, można tylko gdybać

już załączam kod to głownego postu 

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

@producer Jeśli zamieszczasz w temacie plik, musisz także załączyć jego skan, np. z virustotal.com. Masz czas do godziny 15 jutro (11/11).

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0
44 minuty temu, maxaz napisał:

@producer Jeśli zamieszczasz w temacie plik, musisz także załączyć jego skan, np. z virustotal.com. Masz czas do godziny 15 jutro (11/11).

okej dziękuje za podpowiedz poprawiłem dodałem skan, mam nadzieję ze się zgadza

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0
$message = filter_var(trim($_POST["message"]),FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH);

Ta linijka najprawdopodobniej psuje wszystko gdyż filtruje wiadomość pozbywając się wszystkich znaków specjalnych (a, że w alfabecie angielskim nie ma ąęó itp to je też usuwa)

Spróbuj zamienić to jakąś funkcją, która pozbywa się jedynie znaków specjalnych, które mogą być interpretowane przez przeglądarkę, takich jak np:

< > &

 

Najprawdopodobniej, bo oczy mi się kleją i nie potrafię racjonalnie myśleć, a to pierwsze co zauważyłem, nie zapewniam, że to to. Może jutro jak będę przytomny to bardziej się przyglądnę ;)

 

EDIT: No i nie zapomnij o cudzysłowach, bo może namieszać w bazie danych ;)

Edytowano przez Latreso
Poprawki

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0
Dnia 11.11.2018 o 00:36, Latreso napisał:
$message = filter_var(trim($_POST["message"]),FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH);

Ta linijka najprawdopodobniej psuje wszystko gdyż filtruje wiadomość pozbywając się wszystkich znaków specjalnych (a, że w alfabecie angielskim nie ma ąęó itp to je też usuwa)

Spróbuj zamienić to jakąś funkcją, która pozbywa się jedynie znaków specjalnych, które mogą być interpretowane przez przeglądarkę, takich jak np:

< > &

 

Najprawdopodobniej, bo oczy mi się kleją i nie potrafię racjonalnie myśleć, a to pierwsze co zauważyłem, nie zapewniam, że to to. Może jutro jak będę przytomny to bardziej się przyglądnę ;)

 

EDIT: No i nie zapomnij o cudzysłowach, bo może namieszać w bazie danych ;)

zgadza się sprawdziłem i to jest wina tego filtru, wpisałem samo $_post[message] pobrało wiadomość z polskimi znakami, przepraszam że to było tak widoczne ale dopiero jestem początkujacy a na filtrach totalnie się nie znam, poleciłbyś coś może zamiast tego? lub ten ale dodać wykluczenia i wykluczyć polskie znaki. Tylko jak to zrobić?
A i przy okazji gdy już jesteśmy przy tych filtrach czy można było by się też dowiedzieć jaki filter zastosować właśnie też do pola login i hasło aby ktoś nie wykonał ataku? 

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0
6 godzin temu, producer napisał:

zgadza się sprawdziłem i to jest wina tego filtru, wpisałem samo $_post[message] pobrało wiadomość z polskimi znakami, przepraszam że to było tak widoczne ale dopiero jestem początkujacy a na filtrach totalnie się nie znam, poleciłbyś coś może zamiast tego? lub ten ale dodać wykluczenia i wykluczyć polskie znaki. Tylko jak to zrobić?
A i przy okazji gdy już jesteśmy przy tych filtrach czy można było by się też dowiedzieć jaki filter zastosować właśnie też do pola login i hasło aby ktoś nie wykonał ataku? 

Ode mnie na pewno nic nie dostaniesz podane na tacy :D

 

"wpisałem samo $_post[message]":

 

1. spróbuj teraz napisać w wiadomości:

Cytat

testowa wiadomość','0.0.0.0'),('test','aaa','1.1.1.1')

(lub to samo z podwójnymi cudzysłowami)

No i napisz tu co się stanie ;)

 

 

2. Poszukaj jak z tekstu usunąć znaki (w google będzie to coś typu "php str replace"):

Tak na prawdę potrzebujesz pozbyć się tych znaków:

Cytat

< > ' " &

Podpowiem Ci tylko, że te znaki powinny być albo usunięte, albo zmienione na odpowiednio:
znak " < " na "&lt;"

znak " > " na"&gt;"

znak " ' " na "&#39;"

znak " " " na "&quot;"

znak " & " na "&quot;"

Ta zmiana sprawi, że usuniesz z tekstu praktycznie wszystkie znaki, które mogą sprawić, że coś się wysypie, ale jednocześnie będą one widoczne ;) (wiem masło maślane :D )

TYLKO PAMIĘTAJ, żeby zmianę znaku & zrobić na końcu (zrób na początku to zobaczysz dlaczego ;) )

//

Jako że jesteś początkujący to rób wszystko w krokach (później się nauczysz bardziej profesjonalnie ;) ), czyli:

/* 1 */ $message = funkcja_usuwająca_lub_zmieniająca_znak(parametry); // tu pozbywasz się znaku "<"

/* 2 */ $message = funkcja_usuwająca_lub_zmieniająca_znak(parametry); // tu pozbywasz się znaku ">"
I tak wszystkie powyżej. Później możesz poszukać jak to zrobić używając tylko jednej funkcji ;)

 

 

___________________________________

 

"A i przy okazji gdy już jesteśmy przy tych filtrach czy można było by się też dowiedzieć jaki filter zastosować właśnie też do pola login i hasło aby ktoś nie wykonał ataku"

Co rozumiesz pod "NIE WYKONAŁ ATAKU"? Jak będzie chciał i znajdzie lukę to i tak wykona ;)

Rozumiem, że chodzi Ci o złożoność hasła?

Poszukaj jak zrobić:

- sprawdzanie długości stringa (dajmy na to, że hasło musi mieć min. 8 znaków)

- sprawdzanie czy w stringu jest przynajmniej jedna litera i jedna cyfra

- sprawdzanie czy w stringu jest przynajmniej jeden znak specjalny (kropka, przecinek, podkreślenie)

A przy loginie:

- długość

- żeby nie było spacji,

-  min 1 litera/cyfra

 

Jak coś zrobisz to podeślij tu kod to ocenimy ;)

Jak będziesz szukał to staraj się po ang ;)

Nie sprawdzałem gramatycznie (nie mam już czasu się rozpisywać) także jak coś będzie nie jasne pytaj ;)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0
Autor tematu Napisano (edytowany)

OO Wreszcie dziś moge pisać, okej dziękuje za pomoc @Latreso

W przypadku 1, nic się nie wyświetla nic nie wysyła, totalny brak reakcji.

Co do 2 to tak zrobiłem kod zamieszczę niżej, zamienia mi te zakazane znaki na te "ciągi znaków" w bazie są zapisywane zgodnie z kodowaniem, tylko teraz mam problem w którym miejscu mam je odkodować, próbowałem ale wywala mi troszke błędów więc domyslam się że w złym miejscu. Zastosować pewnie muszę funkcję odwrotnie, najpierw dać te znaki zakodowane i odkodować

 

Kod

Spoiler
if(isset($_POST["message"]) &&  strlen($_POST["message"])>0)
	{
		//SZYFT
		$dozmiany = array("'",'"',"<",">","&");
		$zmiana = array("&#39;","&quot;","&lt;","&gt;","&quot;");
		//sanitize user name and message received from chat box
		//You can replace username with registerd username, if only registered users are allowed.
		$username = filter_var(trim($_POST["username"]),FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH);
		$message = str_replace($dozmiany,$zmiana,$_POST["message"]);
		$user_ip = $_SERVER['REMOTE_ADDR'];
		

		//insert new message in db
		if(mysqli_query($sql_con,"INSERT INTO shout_box(user, message, ip_address) value('$username','$message','$user_ip')"))
		{
			$msg_time = date('h:i A M d',time()); // current time
			echo '<div class="shout_msg"><time>'.$msg_time.'</time><span class="username">'.$username.'</span><span class="message">'.$message.'</span></div>';
		}
		
		// delete all records except last 10, if you don't want to grow your db size!
		mysqli_query($sql_con,"DELETE FROM shout_box WHERE id NOT IN (SELECT * FROM (SELECT id FROM shout_box ORDER BY id DESC LIMIT 0, 10) as sb)");
	}
	elseif($_POST["fetch"]==1)
	{
		$results = mysqli_query($sql_con,"SELECT user, message, date_time FROM (select * from shout_box ORDER BY id DESC LIMIT 10) shout_box ORDER BY shout_box.id ASC");
		while($row = mysqli_fetch_array($results))
		{
			$msg_time = date('h:i A M d',strtotime($row["date_time"])); //message posted time
			echo '<div class="shout_msg"><time>'.$msg_time.'</time><span class="username">'.$row["user"].'</span> <span class="message">'.$row["message"].'</span></div>';
		}
	}
	else
	{
		header('HTTP/1.1 500 Are you kiddin me?');
    	exit();
	}
}

 

 

Edytowano przez producer

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

Ja tak tylko na szybko, bo nie mam czasu zerknąć w kod:

1. widzę, że @Latreso pewnie z rozpędu skopiował i masz to samo dla " i &, ampersand (czyli to - &) powinno być zamienione na '&amp;' zamiast '&quot;'

2. tak jak Ci @Latreso zasugerował możesz się także całkowicie pozbyć tych znaków, jeżeli ich nie potrzebujesz, same tagi html możesz usunąć np. funkcją strip_tags(), z kolei zamiast zamieniać znaki str_replace() możesz użyć funkcji htmlspecialchars(), które automatycznie zamieni Ci wszystkie wypisane przez Latreso znaki, jezeli później będziesz potrzebował je zdecodować możesz użyć htmlspecialchars_decode() - nie są to najlepsze rozwiązania i nie gwarantują 100% bezpieczeństwa (jest jeszcze mnóstwo innych miejsc do zabezpieczenia), ale wydaje mi się, że na początek są najłatwiejsze do zrozumienia.

 

tak jak mówiłem, nie mam jak teraz zerknąć na kod, więc to tylko takie ogólne uwagi

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0
Autor tematu Napisano (edytowany)
23 godziny temu, carbonx napisał:

Ja tak tylko na szybko, bo nie mam czasu zerknąć w kod:

1. widzę, że @Latreso pewnie z rozpędu skopiował i masz to samo dla " i &, ampersand (czyli to - &) powinno być zamienione na '&amp;' zamiast '&quot;'

2. tak jak Ci @Latreso zasugerował możesz się także całkowicie pozbyć tych znaków, jeżeli ich nie potrzebujesz, same tagi html możesz usunąć np. funkcją strip_tags(), z kolei zamiast zamieniać znaki str_replace() możesz użyć funkcji htmlspecialchars(), które automatycznie zamieni Ci wszystkie wypisane przez Latreso znaki, jezeli później będziesz potrzebował je zdecodować możesz użyć htmlspecialchars_decode() - nie są to najlepsze rozwiązania i nie gwarantują 100% bezpieczeństwa (jest jeszcze mnóstwo innych miejsc do zabezpieczenia), ale wydaje mi się, że na początek są najłatwiejsze do zrozumienia.

 

tak jak mówiłem, nie mam jak teraz zerknąć na kod, więc to tylko takie ogólne uwagi

 

Zastosowałem htmlspecialchars() Czy tak to wystarczy czy to wogóle działa tak jak powinno?
Wycinek z formularza rejestracyjnego , w pierwszym pliku mam formularz a w tym pobieram i wysyłam zapytania do bazy danych.

Spoiler
	if(isset($_POST['login'])){
		$login = htmlspecialchars($_POST['login']);
	}
	
	if(isset($_POST['password1'])){
		$password1 = htmlspecialchars($_POST['password1']);
	}
	
	if(isset($_POST['password2'])){
		$password2 = htmlspecialchars($_POST['password2']);
	}
	
	if(isset($_POST['email'])){
		$email = htmlspecialchars($_POST['email']);
	}
	

 

 

gdy ktoś wpisuje np " podczas rejestracji normalnie przechodzi nie zabrania mu, ale w bazie danych mam login wyglądający tak  dla przykładowego użytkownika (adam1") wygląda rekord login: adam1&quot; 

 

Do formularza logowania dopisałem tak samo, i użytkownik potrafi się zalogować na loginie adam1" 

Czy tak powinno na początek wystarczyć czy lepiej kategorycznie zabronić używania tych znaków, jakąś funkcją która je wykluczy i gdy wpisze się " to usunie go? 

Edytowano przez producer

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0
Cytat

Czy tak to wystarczy czy to wogóle działa tak jak powinno?

Cytat

dla przykładowego użytkownika (adam1") wygląda rekord login: adam1&quot; 

Sam sobie odpowiedziałeś - tak, działa tak jak powinno.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się


  • Kto przegląda   0 użytkowników

    Brak zalogowanych użytkowników przeglądających tę stronę.


×
Okienko zamknie się za 5 sekund...