【问题标题】:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near - at line 1您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行附近使用正确的语法
【发布时间】:2016-03-04 11:34:14
【问题描述】:

我的代码有这个问题,但找不到问题所在,有没有人遇到过类似的问题?

<?php
include("db.php"); 
if(isset($_POST['submit']))
{
$name=$_POST['namename'];
$job=$_POST['job'];
$message=$_POST['message'];
$insert=mysql_query("insert into     commenttable(name,job,message)values('$name','$job','$message')")or     die(mysql_error());
header("Location:../home.php");
}
?>

这是在本地主机上运行的

服务器类型:MySQL 服务器版本:5.5.42 - 源码分发

忘了提一下,如果我发表简单的评论,比如“你好”,效果很好,但是当我尝试发表这样的评论时

<INPUT TYPE="IMAGE" SRC="javascript:alert('XSS');">

对于攻击它不起作用,我收到错误消息。 我为小型攻击项目做这个,这就是为什么我需要让它工作。

谢谢!

【问题讨论】:

  • 我的猜测是 $name、$job 和/或 $message 中有一个 '。您应该使用参数化查询;或者至少尝试清理输入。
  • 为了帮助找到此类问题的根源,首先将查询字符串存储在一个变量中通常很有帮助,然后echo 该变量。此外,您使用的是已弃用的 mysql_ 函数,您应该真正切换到 mysqli_ 或 pdo。
  • 那么我的代码应该是什么样子?由于我在 php 编程方面不是很有经验。这是一个小项目,它不会对我将使用的 sql 产生任何影响

标签: mysql localhost


【解决方案1】:

如果您在尝试插入文本 &lt;INPUT TYPE="IMAGE" SRC="javascript:alert('XSS');"&gt; 时代码失败,那么显然,正在发生的事情是 Uueerdo 在他的评论中建议的:MySQL 将“XSS”之前的单引号解释为字符串,给你留下一个悬空的XSS');',这当然是一个语法错误。

有两种方法可以解决这个问题:

  1. 以编程方式转义单引号。如果你自己做这将是相当棘手的,但 PHP 中应该有一些库函数,所以它看起来像message = escape_for_sql( message )。 (对不起,我没有复制美元符号,我过敏。)

  2. 更好的是,使用参数化查询,在其中使用“?”构造查询代替每个值,表示查询的一个参数,然后为每个参数提供值,然后然后执行查询。不知道PHP是怎么做到的,搜索“参数化查询PHP”。

【讨论】:

  • 请看我编辑的帖子,感谢您的回复!
  • @GediminasTam 哦,我明白了。我修改了答案。
【解决方案2】:

为了扩展@Mike 的答案,正确的准备语句 PHP 语法应该是,使用 mysql 驱动程序:

None. Don't use the mysql driver. It's been deprecated since forever.

使用mysqli:

// You need to define the following $db_* vars elsewhere
$dbh = new mysqli($db_host, $db_user, $db_password, $db_name;)

$query = "INSERT INTO commenttable (name, job, message) VALUES (?, ?, ?)";
$stmt = $dbh->prepare($query);
$stmt->bind_param($name, $job, $message);
$stmt->execute();

// When you're finished...
$stmt->close();

使用 PDO:

// Edit the connection string as appropriate for your installation
$dbh = new PDO('mysql:host=mydbhost;dbname=whatever', $db_user, $db_password);

$query = "INSERT INTO commenttable (name, job, message) VALUES (:name, :job, :message)";
$stmt = $dbh->prepare($query);
$params = array(':name' => $name, ':job' => $job, ':message' => $message);
$stmt->execute($params);

// PDO has no explicit close() call.

我将错误处理留给读者作为练习。希望对您有所帮助。

【讨论】:

  • 感谢我,也代表 OP。 stackoverflow 的初衷是在您要进行修改时编辑人们的答案,但这很少被遵循,而且不太可能这样做,因为通过发布您自己的单独答案,您可以获得赞成票,就像我刚刚的那个给你。 C-:=
  • 谢谢。我没有编辑您的答案,因为我认为这对我很粗鲁。
猜你喜欢
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多