单引号无法解析

时间:2013-07-31 07:41:11

标签: php mysql textarea html-parsing

我有一个带有textarea的简单表单,当我提交更新数据库中的行时!我希望我的用户能够输入单引号,但由于某种原因没有得到解析! 这就是我的解析文件..

<?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();
?>

任何想法都! 非常感谢 - 菲利普

3 个答案:

答案 0 :(得分:2)

使用

addslashes

在php中可用。这逃脱了特殊的角色。

答案 1 :(得分:2)

在查询中使用 mysql_real_escape_string($ textareadata) ...它会起作用......

答案 2 :(得分:2)

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

Here是关于为什么不应该使用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>';

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

相关问题