0

送信時にデータベース内の行を更新するテキストエリアを持つ単純なフォームがあります! ユーザーが一重引用符を入力できるようにしたいのですが、何らかの理由で解析されません! これは私の解析ファイルとして持っているものです..

<?php
$sql = "SELECT * FROM testimonials WHERE id='$pid'"; 

      $pid = $_POST['pid'];
      $testtitle = htmlentities($_POST['ts_tt']);
      $testbody = htmlentities($_POST['ts_tb']);
      $compowner = htmlentities($_POST['ts_co']);
      $ownertitle = htmlentities($_POST['ts_ot']);
      $compname = htmlentities($_POST['ts_cn']);
      $compwebsite = htmlentities($_POST['ts_cw']);

      include_once "../php_includes/db_conx.php";

      $sql = "UPDATE testimonials SET testtitle='$testtitle', testbody='$testbody', compowner='$compowner', ownertitle='$ownertitle', compname='$compname', compwebsite='$compwebsite' WHERE id='$pid'";

      if (!mysql_query($sql, $connection)){
          die('Error: ' . mysql_error());
  }
  echo 'Testimonial has been Edited successfully. <br /><br /><a href="admin/">Click Here</a>';
  exit();
?>

どんなアイデアでも!どうもありがとう - フィリップ

4

3 に答える 3

2

まず、環境で許可されている場合は、mysql_ 関数から切り離してください。これらは非推奨であり、PHP の次のリリースでは使用できなくなります。PDOまたはmysqliに切り替える必要があります。

mysql_* 関数を使用してはいけない理由について詳しくは、こちらをご覧ください。

次に、ユーザー入力を受け入れ、データベースに安全に挿入するためにエスケープしていません。この場合、クエリが失敗しただけですが、少し技術的な知識があれば、データベース内のデータを消去または変更するためにさまざまなことを行うことができます。これは SQL インジェクションと呼ばれ、Web サイトがハッキングされる一般的な方法の 1 つです。

スクリプトでもう少し慎重な処理を使用できる主なポイントが 2 つあります。最初はこれです。

$sql = "SELECT * FROM testimonials WHERE id='$pid'"; 

そのはず

$sql = "SELECT * FROM testimonials WHERE id='".mysql_real_escape_string($pid)."'";

2つ目は

$sql = "UPDATE testimonials SET testtitle='$testtitle', testbody='$testbody', compowner='$compowner', ownertitle='$ownertitle', compname='$compname', compwebsite='$compwebsite' WHERE id='$pid'";

どちらにするべきか

$sql = "UPDATE testimonials SET testtitle='".mysql_real_escape_string($testtitle)."', testbody='".mysql_real_escape_string($testbody)."', compowner='".mysql_real_escape_string($compowner)."', ownertitle='".mysql_real_escape_string($ownertitle)."', compname='".mysql_real_escape_string($compname)."', compwebsite='".mysql_real_escape_string($compwebsite)."' WHERE id='".mysql_real_escape_string($pid)."'";

mysql_real_escape_string への最初の呼び出しの前に、データベース接続インクルードを移動する必要があることにも注意してください。

このエクスプロイトがどのように発生するかについて詳しく説明するために、テキスト フィールドから pid を取得していると仮定して、最初のクエリを取り上げます。

$sql = "SELECT * FROM testimonials WHERE id='$pid'";

私は邪悪なハッカーなので、入力するだけです

0'; update testimonials set testbody = '<script>window.location.href="http://www.compeditors-website.com";</script>';

そして、データベースに送信されるものは次のとおりです。

SELECT * FROM testimonials WHERE id='0'; update testimonials set testbody = '<script>window.location.href="http://www.competitors-website.com";</script>';

そして今、誰かがお客様の声のページにアクセスすると、競合他社の Web サイトにリダイレクトされます。

于 2013-07-31T07:57:41.613 に答える
2

クエリでmysql_real_escape_string($textareadata)を使用します...動作します...

于 2013-07-31T07:50:47.463 に答える
2

使用する

addslashes

php で利用できます。これにより、特殊文字がエスケープされます。

于 2013-07-31T07:42:07.567 に答える