关于XSS攻击和SQL注入的问题

时间:2015-02-25 01:16:55

标签: php security mysqli xss sql-injection

我是web security的新手。在花时间阅读一些博客和社区网站(例如SO)之后,我发现了一些安全的技术XSS AttackSQL Injection但问题是,大多数与安全相关的问题都很老。所以,我的问题是

does my following code has any major security holes that can be bypassed by amateur or mid-level attacker(hacker)

我还能做些什么才能安全免受攻击?顺便说一句,我使用HTMLPurifier来保护XSS Attack

PHP

require_once '/path/to/HTMLPurifier.auto.php';

$connect_dude=mysqli_connect('localhost','root','','user');

$config = HTMLPurifier_Config::createDefault();
$purifier = new HTMLPurifier($config);

if(isset($_POST["sub"])){
  $name=$_POST["namex"];
  $email=$_POST["email"];
  $ques=$_POST["ques"];
  $clean_name = $purifier->purify($name);
  $clean_email = $purifier->purify($email);
  $clean_ques = $purifier->purify($ques);

  $stmt = mysqli_stmt_init($connect_dude);
     if(mysqli_stmt_prepare($stmt, 'INSERT INTO question (name,email,question) VALUES(?,?,?)')) {

        mysqli_stmt_bind_param($stmt, "sss", $clean_name, $clean_email, $clean_ques);
        mysqli_stmt_execute($stmt);
      }
}

HTML表格

<div id="form">
  <form id="sub_form" action="ask.php" method="post" enctype="multipart/form-data">
     <p id="nam" class="indi">Name</p><input type="text" id="namex" name="namex" placeholder="Your Name" required></br>
     <p id="ema" class="indi">Email</p><input type="text" id="email" name="email" placeholder="Email" required></br>
     <p id="que" class="indi">Question</p><textarea id="ques" name="ques" placeholder="Question" required></textarea></br>
     <input type="submit" id="sub" name="sub" value="Send">
  </form>
</div>

2 个答案:

答案 0 :(得分:1)

SQL的东西很好,参数化查询是防止SQL注入的最佳实践方法。

XSS的方法是......有点奇怪。

HTMLPurifier可用于允许用户输入有限的HTML标记。对于可格式化的自由文本字段(如我猜测ques而言),这可能是合理的,如果您不愿意提供自己的自定义迷你标记语言,如Markdown。

但是您真的希望用户能够为所有字段输入标记,包括他们的姓名和电子邮件地址吗?我应该能够命名为“Edw ard B oi ng < s> J r“?用户每次想要使用&符时都必须输入&amp;吗?

更好的方法通常是接受纯文本,然后在将其插入HTML页面(例如使用<?php echo htmlspecialchars($value); ?>)时将其转义为HTML,以便用户输入的确切字符串出现在页面中。您故意允许标记的字段(因此使用HTMLPurifier而不是htmlspecialchars)通常是非常特殊的情况。

请注意,如果要注入其他上下文,则需要使用不同的转义函数:例如,如果要注入<script>块中的JavaScript字符串,则需要JS字符串转义且htmlspecialchars都不需要也不是HTMLPurifier会帮助你。

答案 1 :(得分:0)

也许测试是否设置了每个post变量而不仅仅是sub。此外,在发送到PHP以删除任何不需要的字符的帖子之前,也在javascript中检查它们。例如,您可以在javascript中使用正则表达式并测试空字符串。

支票越多越好。

您还可以使用不常见的名称(abrv_page_name_email而不是简单的&#34;电子邮件&#34;)。

很多东西。

Regex和mysqli_real_escape_string也是常见做法。