我一直在努力解决一个小问题。它已存在多年,但这只是一个令人恼火的问题,而不是一个严重的问题,我刚刚解决它。但现在我想知道是否有人可以帮助我。我做了一些谷歌但没有成功。
如果我在这样的php文件中用html textarea做一个表单帖子:
<form action="http://action.com" method="post">
<textarea name="text"><a href="http://google.com">google's site</a></textarea>
</form>
当然还有提交按钮等等。
值是问题:<a href="http://google.com">google's site</a>
textarea的值都有“(引号)和'(撇号)。
要将其保存在mysql_database中,我这样做:
$result = mysql_query("INSERT INTO `table` (`row1`) VALUES ('".$_POST['text']."') ") or die(mysql_error());
现在我收到了mysql错误:
您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第1行的“站点”附近使用正确的语法
答案 0 :(得分:19)
你的sql字符串是:
INSERT INTO `table` (`row1`) VALUES ('google's site')
这不是有效的陈述。正如Nanne写的那样,至少使用mysql_real_escape_string转义字符串:http://php.net/manual/en/function.mysql-real-escape-string.php
阅读有关sql注入的内容 http://en.wikipedia.org/wiki/SQL_injection
想一想:如果有人发布了这个帖子:$_POST['text']
,其价值为:');delete from table;....
你可以对你的数据说再见:)。
始终过滤/转义输入!
编辑:从PHP 5.5.0开始,不推荐使用mysql_real_escape_string和mysql扩展。请使用mysqli扩展名和mysqli :: escape_string函数
答案 1 :(得分:9)
在将用户提供的值添加到数据库中时,始终至少使用mysql_real_escape_string。您应该查看绑定参数或mysqli,以便您的查询变为:
INSERT INTO `table` (`row1`) VALUES (?)
而且?在清理输入后,将被实际值替换。
在您的情况下使用:
$result = mysql_query("INSERT INTO `table` (`row1`) VALUES ('".mysql_real_escape_string($_POST['text'])."') ") or die(mysql_error());
阅读SQL注入。值得尽快做好准备!
答案 2 :(得分:3)
答案 3 :(得分:2)
你可以使用addslashes()函数。它用斜杠引用字符串。所以,当你在你的领域添加任何撇号时,它对你非常有用。
$result = mysql_query("INSERT INTO `table` (`row1`) VALUES ('".addslashes($_POST['text'])."') ") or die(mysql_error());
答案 4 :(得分:1)
而不是使用旧的mysql *函数,使用PDO并编写参数化查询 - http://php.net/pdo
答案 5 :(得分:0)
当我在mysql中更新数据时,我也在苦苦思索角色。
但我终于找到了一个更好的答案,这是:
$lastname = "$_POST["lastname"]"; //lastname is : O'Brian, Bran'storm
当您要更新数据库时,除非您使用MySQL REAL转义字符串,否则系统不会更新它。 这里:
$lastname = mysql_real_escape_string($_POST["lastname"]); // This Works Always.
然后你的查询肯定会更新。
Example: mysql_query("UPDATE client SET lastname = '$lastname' where clientID = '%"); //This will update your data and provide you with security.
如需了解更多信息,请查看MYSQL_REAL_ESCAPE_STRING
希望这有助于
答案 6 :(得分:0)
只需使用准备好的语句,您就不必担心转义或sql注入。
$con = <"Your database connection">;
$input = "What's up?";
$stmt = $con->prepare("insert into `tablename` (`field`)values(?)");
$stmt->bind_param("s",$input);
$stmt->execute();
答案 7 :(得分:0)
如果你使用的是 php 版本 > 5.5.0 那么你必须像这样使用
data %>%
ifelse (Q1 == 0) {
mutate(Q2 = coalesce(Q2,0))
}