Как удалить добавленные вручную обратные слеши в SQL-инъекциях?

Я использую MySQL и PHP для управления своими данными на моем сайте.

У меня есть параграф, напечатанный в формате TeX, в котором так много математических формул. Я хочу вставить в свою базу данных и получить то же самое в другом месте.

При получении я использую mathjax для отображения математической части. Проблема при вставке данных.

Когда я вставляю данные

$\int f d\mu $ ( Note that this '\' is required to run the math formula)

Я получаю вставленные данные как

$\\int f d \\mu $

Там две обратные косые черты вместо одной.

Как предотвратить обратную косую черту, которая добавляется каждый раз с добавленной вручную обратной косой чертой (что необходимо).

Будет ли stripslashes() помощь или любые другие решения?

Заранее спасибо.

<form action="" method="POST">



<input type="hidden" name="id" value=<?php echo $print->Id; ?> >

<table class="speaker-abstract" style="width:49%; float:left;">

  <tr>

  <th> Update the Abstract Details Here </th>
  </tr>

<tr>
<td>
<label> Title of the Talk </label>
<input  style="width:95%" type="text" name="title1"  value="<?php echo $print->title_of_the_talk1; ?>">
</td>


</tr>

<tr>
<td> 
<label> Abstract of the Talk (Type in TeX format) </label>

 <textarea style="width:95%" name="abstract1"  rows="10"  ><?php echo $print->Abstract1; ?></textarea>

 </td>

 </tr>

  </table>

  <table class="speaker-abstract" style="width:49%; float:left;">
  <tr>

  <th> If any other, update the Abstract Details Here </th>
  </tr>

<tr>
<td>
<label> Title of the Talk </label>
 <input style="width:95%" type="text" name="title2" value="<?php echo $print->title_of_the_talk2; ?>">
</td>

</tr>

<tr>
<td> 
<label> Abstract of the Talk  (Type in TeX format) </label>
 <textarea style="width:95%" name="abstract2"  rows="10"  > <?php echo $print->Abstract2; ?> </textarea>

 </td>

 </tr>

  </table>

 <input style="float:right;" type="submit" name="update_abstract" value="Submit/Update"> 

</form>

и PHP-код для отправки формы и отображения данных заключается в следующем.

<?php

$success_msg="Updated Successfull !!!";
$search= "Search the Speaker Here";

if (isset($_POST['update_abstract'])){
$id=$_POST['id'];
$title1=$_POST['title1'];
$title2=$_POST['title2'];
$abstract1=$_POST['abstract1'];
$abstract2=$_POST['abstract2'];

$update=$wpdb->update( 
    'Invited_Speakers_auto', 
    array( 
        'title_of_the_talk1' => $title1,
        'title_of_the_talk2' => $title2,
        'abstract1' => $abstract1,
        'abstract2' => $abstract2

    ), 
    array( 'id' => $id )

);
if ($update==true){

echo $success_msg.$abstract1;

}else
{
 $success_msg="There is an error in the update";
}

}
?>

PS:

  1. Пожалуйста, обратите внимание, что мне нужна косая черта, вставленная пользователем, я просто удалил косые черты, которые автоматически вставляются во время вставки sql.

  2. stipslashes() Помогает мне удалить добавленные косые черты в выводе.

но я хочу удалить обратную косую черту во время самой вставки.

1 ответ

Вы можете использовать MySqli или PDO с подготовленным заявлением. Кстати, это самый известный метод предотвращения инъекций SQL. Узнайте больше о профилактике инъекций Sql из этого фантастического ответа!

Следующий код успешно вставляет строку в базу данных MySql и читает из нее. Надеюсь, поможет!

 <?php
    $_user = 'root';
    $_password= 'root';
    $_db = 'localtest';
    $_host = 'localhost';
    $_port = 3306;
    $con = new mysqli($_host, $_user, $_password, $_db) or die(mysql_error);

    $new = '$\int f d\mu $';

        //insert into mysql table
        $sql="INSERT INTO test (math) VALUES (?); ";
        $stmt = $con-> prepare($sql);
        $stmt -> bind_param("s", $new);
        $stmt -> execute();

    // Reading From DB
    $id = 1;
    $sql="SELECT math FROM test WHERE id = ?";
    $stmt = $con->prepare($sql);
    $stmt->bind_param("i", $id);
    $stmt -> execute(); 
    $stmt->store_result();
    /* Get the number of rows */
    $num_of_rows = $stmt->num_rows;

    /* Bind the result to variables */
    $stmt->bind_result($new);

    if($num_of_rows < 1){ 
        echo "Can't find any record!"; 
        mysqli_close($con); 
        exit();
    }
    while ($stmt->fetch())
    {
        echo $new . PHP_EOL;

        /* free results */
        $stmt->free_result();

    }
    mysqli_close($con); 
    exit();
   ?>

Обновить

Если вы не можете использовать PDO или MySqli, тогда mysql_real_escape_string может помочь вам правильно избежать специальных символов.

Вы также можете попробовать использовать htmlentities перед вставкой в ​​базу данных, а затем html_entity_decode когда получено.

Другие вопросы по тегам