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

use mysql_real_escape_string($textareadata) in query... it will work...

于 2013-07-31T07:50:47.463 回答
2

首先,如果您的环境允许,您应该将自己与 mysql_ 函数分开。它们已被弃用,并且不会在 PHP 的下一个版本中提供。您应该切换到PDOmysqli

这里有更多关于为什么你不应该使用 mysql_* 函数的信息。

其次,您正在接受用户输入,而不是将其转义以安全地插入数据库。在这种情况下,它只会导致您的查询失败,但是如果有人在哪里有一点技术知识,他们可以做很多事情来擦除或更改数据库中的数据。这称为 SQL 注入,是网站被黑客入侵的更常见方式之一。

有两个要点可以让您的脚本使用更谨慎的处理方式。第一个是这个。

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

它应该是

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

第二个是

$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>';

现在,当任何人访问您的推荐页面时,他们将被重定向到您的竞争对手网站。

于 2013-07-31T07:57:41.613 回答
2

利用

addslashes

在 php 中可用。这会转义特殊字符。

于 2013-07-31T07:42:07.567 回答