Проблема с XSS Attack и SQL Injection

Я новичок в web security После траты времени на чтение некоторых блогов и сайтов сообщества, таких как SO , я нашел некоторые методы, чтобы быть в безопасности от XSS Attack и SQL Injection Но проблема в том, что большинство вопросов, связанных с безопасностью, очень старые. Итак, мой вопрос:

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

Есть ли что-нибудь еще, что я могу сделать, чтобы быть в безопасности от атаки? Кстати, я использую HTMLPurifier для 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> 

SQL-материал прекрасен, параметризованные запросы – это наилучший подход для предотвращения внедрения SQL.

Подход к XSS … немного странный.

HTMLPurifier используется, когда вы хотите разрешить пользователю вводить ограниченную разметку HTML. Это может быть разумным для форматируемых полей freetext (например, я догадываюсь о ques ), если вы не можете беспокоиться о том, чтобы предоставить свой собственный язык мини-разметки, такой как Markdown.

Но действительно ли вы хотите, чтобы пользователь мог вводить разметку для всех полей, включая их имя и адрес электронной почты? Должен ли я иметь название «Edw ard B oi ng J r»? Должны ли пользователи вводить &amp; каждый раз, когда они хотят использовать амперсанд?

Лучший подход, как правило, заключается в том, чтобы воспринимать простой текст как есть, а затем HTML-escape-код в том месте, где вы вставляете его в HTML-страницу (например, с помощью <?php echo htmlspecialchars($value); ?> ), Чтобы точную строку введенный пользователем, отображается на странице. Поля, где вы намеренно разрешаете разметку (и поэтому используете HTMLPurifier вместо htmlspecialchars), как правило, являются очень исключительными случаями.

Обратите внимание, что если вы впрыскиваете в другие контексты, вам нужны разные функции экранирования: например, если вы вставляете строку JavaScript в блок <script> тогда вам нужно htmlspecialchars экранирование JS-строки, и ни htmlspecialchars ни HTMLPurifier не помогут вам в этом.

Возможно, тестирование, если задана каждая из пост-переменных, а не только одна. Также, проверяя их в javascript, а также перед отправкой на php, чтобы освободить сообщение от любых нежелательных символов. Вы можете повторно задавать и проверять пустые строки в javascript, например.

Большинство проверок – тем лучше.

Вы также можете использовать имена, которые не так распространены (abrv_page_name_email, а не просто «электронная почта»).

Много вещей.

Regex и mysqli_real_escape_string также являются обычной практикой.