我的后端有一个脚本,允许我保存默认注册电子邮件。它可以处理一些消息,但有些消息却没有。我将字段设置为“longtext”和“utf8_general_ci”。我当前的代码将保存此消息:
您好,这是您房地产公司的默认电子邮件。如果您收到此电子邮件,则表示您已注册我们的网站。您好,这是您房地产公司的默认电子邮件。如果您收到此电子邮件,则表示您已注册我们的网站。
如果您正在寻找德克萨斯州的“牧场”房屋,那么您来对地方了。
但不会保存这个:
新的“太空灰”iPhone 5s将加入银色和金色的型号,当苹果的旗舰手机将于下周五(9月20日)上市销售。去年,iPhone 5有白色和黑色可供选择。
这一变化意味着iPhone 5s不再采用真正的黑色,而苹果则选择将铝背面和侧面改为浅灰色。设备的玻璃背面和正面保持黑色。
我不知道为什么它会保存某些消息,然后不保存其他人......这是我的代码:
管理页面上的jQuery:
$(function() {
$( "#defaultemail-ebook-submit" ).click(function() {
$("#defaultemail-ebook-form").ajaxSubmit({url: 'defaultemails.php', type: 'post', success: alert("Email with ebook has been set!")})
});
});
defaultemails.php:
$defaultemailebook = $_REQUEST['defaultemail-ebook'];
if (isset($_POST['defaultemail-ebook'])) {
mysql_query("UPDATE default_emails SET email_ebook='". $defaultemailebook ."' WHERE id = '1'");
echo $defaultemailebook;
}
每当我提交这些电子邮件时,即使是那些未提交的电子邮件,我也会收到成功警报......任何人都有任何想法为什么会发生这种情况?
答案 0 :(得分:0)
您需要处理提交的文本中可能包含撇号(')字符的事实。当您的代码遇到一个时,它会将其视为字符串的结尾。
这不仅是未保存文本的问题,而且还容易受到SQL注入的攻击。</ p>
您需要安全地处理字符串,方法是更改执行SQL的方式,或者在文本中捕获单引号并处理它们。
答案 1 :(得分:0)
一个更强大的解决方案是使用像PDO这样的扩展,并使用预处理语句。这有效地为您输出了输入,并且比使用addslashes()等函数更安全。
例如,在你的defaultemails.php脚本中:
//make sure the email address is set
if(!isset($_POST['defaultemail-ebook'])) { //it's better to use $_POST over $_REQUEST if you know it's a POST field
//handle email address not provided
}
$emailAddress = $_POST['defaultemail-ebook'];
//validate the email address
if(!filter_var($emailAddress, FILTER_VALIDATE_EMAIL)) {
//handle invalid email address
}
//update the database
$dbh = new PDO('mysql:dbname=dbname;host=127.0.0.1', 'username', 'password'); //replace with your details
$sth = $dbh->prepare('UPDATE default_emails SET email_ebook = ? WHERE id = 1;');
$sth->execute(array($emailAddress));
echo $emailAddress;
答案 2 :(得分:0)
忽略了一个明显的事实,即您的代码对sql和脚本注入攻击非常开放。您需要转义要存储的值。
如果您使用的是mysql函数,请在输入字符串上使用mysql_escape_string函数。
但是,请在将代码置于现场之前处理注射攻击。