关于 XSS 攻击和 SQL 注入的问题
Issue about XSS Attack and SQL Injection
我是 web security
的新手。在花时间阅读了一些博客和社区网站(例如 SO
)之后,我发现了一些可以避免 XSS Attack
和 [=16] 的技术=]。但问题是,大多数与安全相关的问题都非常 old.So,我的问题是
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>
可能会测试 post 变量是否都已设置,而不仅仅是 sub
一个。此外,在发送到 php 之前也要在 javascript 中检查它们,以删除 post 中任何不需要的字符。例如,您可以对 javascript 中的空字符串进行正则表达式和测试。
检查越多越好。
您也可以使用不太常见的名称(abrv_page_name_email 而不是简单的 "email")。
很多东西。
正则表达式和mysqli_real_escape_string也是常见的做法。
SQL 东西很好,参数化查询是防止 SQL 注入的最佳实践方法。
XSS 的方法是……有点奇怪。
HTMLPurifier 用于允许用户输入有限的 HTML 标记的地方。如果您不愿意提供自己的自定义迷你标记语言(如 Markdown),那么这对于可格式化的自由文本字段(就像我猜 ques
是的那样)是合理的。
但是您真的希望用户能够为所有字段输入标记,包括他们的姓名和电子邮件地址吗?我应该可以取名为“Edward Boing Jr”吗?用户每次要使用符号时都必须输入 &
吗?
更好的方法通常是按原样接受纯文本,然后在将其插入 HTML 页面时 HTML-转义它(例如 <?php echo htmlspecialchars($value); ?>
) 以便用户输入的确切字符串出现在页面中。您故意允许标记的字段(因此使用 HTMLPurifier 而不是 htmlspecialchars)通常是非常特殊的情况。
请注意,如果您要注入其他上下文,则需要不同的转义函数:例如,如果您要注入 <script>
块中的 JavaScript 字符串,则需要 JS 字符串转义和htmlspecialchars
和 HTMLPurifier 都无法帮助您。
我是 web security
的新手。在花时间阅读了一些博客和社区网站(例如 SO
)之后,我发现了一些可以避免 XSS Attack
和 [=16] 的技术=]。但问题是,大多数与安全相关的问题都非常 old.So,我的问题是
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>
可能会测试 post 变量是否都已设置,而不仅仅是 sub
一个。此外,在发送到 php 之前也要在 javascript 中检查它们,以删除 post 中任何不需要的字符。例如,您可以对 javascript 中的空字符串进行正则表达式和测试。
检查越多越好。
您也可以使用不太常见的名称(abrv_page_name_email 而不是简单的 "email")。
很多东西。
正则表达式和mysqli_real_escape_string也是常见的做法。
SQL 东西很好,参数化查询是防止 SQL 注入的最佳实践方法。
XSS 的方法是……有点奇怪。
HTMLPurifier 用于允许用户输入有限的 HTML 标记的地方。如果您不愿意提供自己的自定义迷你标记语言(如 Markdown),那么这对于可格式化的自由文本字段(就像我猜 ques
是的那样)是合理的。
但是您真的希望用户能够为所有字段输入标记,包括他们的姓名和电子邮件地址吗?我应该可以取名为“Edward Boing Jr”吗?用户每次要使用符号时都必须输入 &
吗?
更好的方法通常是按原样接受纯文本,然后在将其插入 HTML 页面时 HTML-转义它(例如 <?php echo htmlspecialchars($value); ?>
) 以便用户输入的确切字符串出现在页面中。您故意允许标记的字段(因此使用 HTMLPurifier 而不是 htmlspecialchars)通常是非常特殊的情况。
请注意,如果您要注入其他上下文,则需要不同的转义函数:例如,如果您要注入 <script>
块中的 JavaScript 字符串,则需要 JS 字符串转义和htmlspecialchars
和 HTMLPurifier 都无法帮助您。