【问题标题】:Make mail() php file safe from SQL Injections [closed]使mail()php文件免受SQL注入的影响[关闭]
【发布时间】:2014-07-09 19:39:57
【问题描述】:

阅读大量教程后,我只想确保安全。

我做了一个联系公式,看起来像这样

<form name="contakt" accept-charset="UTF-8" method="post" action="./mail.php">
<input type="text" name="name" />
<input type="text" name="email" />
<input type="text" name="tel" />
<input type="submit" value="Send" name="submit" />
<textarea name="message"></textarea>
</form>

我通过 jQuery 验证名称和消息是否不为空且不仅包含空格

我通过 jquery 使用以下脚本检查电子邮件

function ismailornot(email) {
var regex = /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/;
return regex.test(email);
}

现在,当我的变量通过并且我在我的 mail.php 上时,是否足以在我的脚本顶部检查 $_SERVER['HTTP_REFERER'] 并查看这些变量是否来自我自己的脚本?或者你也可以修改 $_SERVER 变量吗?

或者我是否必须再次检查每个传递的变量以确保安全?

例如:http://www.w3schools.com/php/php_secure_mail.asp 这个脚本是否 1oo% 不会被注射?

感谢您帮助我:)

【问题讨论】:

  • 如果您仅使用 Javascript 进行检查,则您什么也没有检查。依靠 Javascript 在用户提交页面之前通知他们错误,而不是为了清理。
  • 使 mail() 函数从 SQL 注入中保存...我是唯一一个得到这句话的网络
  • 制作一个包含 mail() 函数的 php 文件,以免被标头注入滥用。试图以某种方式缩短它......看起来我失败了。 @miken32 - 我只是使用 JS 来告知用户各种错误 - 只是添加了因为我不确定它对我的问题是否重要。
  • "我通过 jQuery 验证"..."我通过 jquery 检查电子邮件"..."我在我的 mail.php 上检查我的脚本 $ _SERVER['HTTP_REFERER'] 并查看这些变量是否来自我自己的脚本“您仅使用 Javascript 进行检查,并询问您是否应该进行更多检查。我要告诉你的是,你根本没有做任何真正的检查,所以你当然应该做更多的检查。

标签: php email header-injection


【解决方案1】:

方法:再次检查每个传递的变量以确保安全

【讨论】:

  • 是的,我刚刚搜索了一下,发现“HTTP_REFERER”是可滥用的:(
【解决方案2】:

在一些 mods 之后尝试这个以满足您的需求,这是 Larry Ullman 书中的一段:

 function spam_scrubber($value) {

    // List of very bad values:
    $very_bad = array('to:', 'cc:', 'bcc:', 'content-type:', 'mime-version:','multipart-mixed:', 
    'content-transfer-encoding:', '<script>');

    // If any of the very bad strings are in 
    // the submitted value, return an empty string:
    foreach ($very_bad as $v) {
        if (stripos($value, $v) !== false){ return '';}
    }

    // Replace any newline characters with spaces:
    $value = str_replace(array( "\r", "\n", "%0a", "%0d"), ' ', $value);

    //remove html tags:
    $value = htmlentities($value,ENT_QUOTES);

    // Return the value:
    return trim($value);

} // End of spam_scrubber() function.

// Clean the form data:
$scrubbed = array_map('spam_scrubber', $_POST);

if(isset($from)) {
    $from = $scrubbed['from'];
}else{
    $from = '';
}

// Minimal form validation:
if (!empty($from) && !empty($scrubbed['comments']) ) {

    // Create the body:
    $body = "Name: {$from}\n\nComments: {$scrubbed['comments']}";
    $body = wordwrap($body, 70);

    // Send the email:
    mail('YOUR_EMAIL', 'Contact Form Submission', $body, "From: {$from}");
 }

【讨论】:

  • @Kris 并且总是在服务器端验证!!!
猜你喜欢
  • 1970-01-01
  • 2015-11-19
  • 2016-05-31
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-16
相关资源
最近更新 更多