Правилно "почистване" на коментар

  • Автор Автор Hous
  • Начална дата Начална дата

Hous

Registered
От доста време съм го оставил това нещо ей така във времето да чака и до момента все се чудя кой е най-ефикасния метод за почистване и в същото време запазване на оригинала на един коментар.
Примерно:
Comment:
I wou'd l1k3 this t0 b3 @ crazy! comment,without any trouble with the fol0w1ng symbollz: <? ?> <html> <> !@#$%^&*()_+|"}{''..,.ï þ)šÕ|® ©
and etc.
Няма значение как изглежда в дб-то стига да не е проблем за синтаксиса на mysql, и другото е после да се покаже абсолютно чист код, без html/php inject тагове...
Някой ако може да даде код и да обясни ще съм благодарен.
 
Когато го записваш в базата данни, прави го с prepared statement:
Код:
$stmt = $mysqli->prepare("INSERT INTO comments VALUES (?, ?)");
$commenter_id = 1;
$comment = "I wou'd l1k3 this t0 b3 @ crazy! comment,without any trouble with the fol0w1ng symbollz: <? ?> <html> <> !@#$%^&*()_+|"}{''..,.ï þ)šÕ|® © 
and etc.";

$stmt->bind_param('is', $commenter_id, $comment);
$stmt->execute();

И след това прекарвай коментарите през htmlentities/htmlspecialchars преди да ги покажеш. Така се предпазваш от SQL injection и XSS, като същевремено съхраняваш оригиналния коментар.
 
И как точно преценят кои символ да не прецаква заявката тези mysql prepared statements?
Ако може с твои думи да кажеш че съм чел пък не ми харесват и не съм ги ползвал...
 
htmlspecialchars() .. има си и декод - функциия и е лесна .. ии в крайния резултат си пази всичко - аз лично много го обичам тозии методд.. :?: :lol: :)
 
Да знам ги тях както споменах има и други "дупки" за запълване...
за това ми трябва "the ultimate solution" :D
 
Какво ще кажете за:
Код:
$comentar=mysql_real_escape_string(htmlentities(htmlspecialchars(striptags($input))));
$bla=(nser into comentari (comment) values ('$comentar'));
 
Човек, какво ти пречи да използваш prepared statements? Те са правилният начин да вкарваш "суров" текст от потребителя - предпазват те почти на 100% от sql injections, само трябва да внимаваш когато го изкарваш - при изкарване ползвай htmlspecialchars.
 
тоест искаш да се предпазиш от:

<?php
echo "<?php echo 1; ?>";
?>

да не изкарва 1? Еми, няма да изкарва :) Не можеш да пуснеш php код от текстово поле... Не и по начина по който ти го правиш - просто вкарваш/изкарваш от база данни. Можеш да го пуснеш с eval(), но дори някой да го напише в текстовото поле, ще се получи това.

P.S. може да не съм те разбрал правилно.
 
Искам да се предпазя точно от това, защото като се запише в дб-то и после го обърна с htmlspecialchars може да се получи разминаване
или пък със разните decode_... да обърнат знаците, както често съм виждал че хакват сайтове в адресите, с помощта на декодиране на символи и обръщането им в оригиналните.
От тея неща се опитвам да се предпазя предварително...
 
Какво разминаване, какво объркване? Дай примери... тоя примерен коментар който си дал чрез prepared statements при вкарване и с htmlspecialchars() при изкарване няма никаква опасност нито за базата ти данни, нито за потребителя...
 
ако го напишеш кадърно с htmlspecialchars, няма как да стане тоя номер с промяната. Дори да смениш value-то на поста няма как да стане тая работа без да мине през htmlspecialchars. При гет параметри, ползвай само int. Колкото, до връзка с база данни аз използвам mysql_real_escape_string
 
Не мога да дам конкретен пример и ще ви се доверя, просто казвам че съм виждал доста хакнати сайтове по този метод но кои знае как са били защитени, за _GET метода отдавна му намерих цаката, само това с коментарите не знаех до сега как точно за го "почистя".
Ще пробвам и ... най-вероятно ще дам точката но не мога да я разделя , дано не се убидите, но съм благодарен за помощта на всички!

:?: :) :)
 
Код:
Call to a member function prepare() on a non-object
Някаква идея защо се полуава това?
Кода е 99% същия като в примера
 
как задаваш $mysqli ?

ако го пишеш $mysqli = mysqli_connect(...) няма да стане

трябва да е $mysqli = new mysqli("localhost", "my_user", "my_password", "world");

виж тук - Object oriented style и Procedural style. :)
 
Да така го правя... но постоянно дава грешки не съм свикнал с него и може някъде да изпускам запетайка или нещо при заявката... от 30мин го мъча.
Опитах да го дебъгна така:
Код:
or die(mysqli_connect_errno())
но нищо не показва...

сега показва само
Код:
call to a member function bind_param on a non object
 
Пробвай да сложиш накрая
$mysqli->close();

И го мини през един var_dump да видим какво излиза
 
Дай целия код от new mysqli() до края, който е свързан с това и който дава грешка.
 
@nqkafff нищо не излиза пак е грешката...

ианче ето го кода:
Код:
$mysqli = new MySQLi('localhost', 'user', 'pass', 'dbname');


$stmt = $mysqli->prepare("INSERT INTO comments(bla,bla,bla,bla,bla,bla) VALUES ('".$commentid."','bla','".USERID."','date',?,'".$ip."','0') WHERE comment_id='".$commentid."'");
$stmt->bind_param('is',$comment);
$stmt->execute();
$mysqli->close();
echo "done";
var_dump($stmt);
var_dump($mysqli);
 
new MySQLi('localhost', 'user', 'pass', 'dbname');
трябва да е:

Код:
new mysqli('localhost', 'user', 'pass', 'dbname');

Това не е паскал, има значение от главни и малки букви.
 

Back
Горе