PHP-инъекция

Я занимаюсь серфингом в эти дни и узнал о SQL INJECTION ATTACK. Я попытался реализовать на своей локальной машине, чтобы узнать, как это можно сделать, чтобы я мог предотвратить ее в моей системе …

я написал такой код

Код PHP:

if(count($_POST) > 0){ $con = mysql_connect("localhost","root","") or die(mysql_error()); mysql_select_db('acelera',$con) or die(mysql_error()); // echo $sql = 'SELECT * FROM acl_user WHERE user_email = "'.$_POST['email'].'" AND user_password = "'.$_POST['pass'].'"'; $res_src = mysql_query($sql); while($row = mysql_fetch_array($res_src)){ echo "<pre>";print_r($row);echo "</pre>"; } } 

HTML-код:

 <html> <head></head> <body> EMAIL : <input type="text" name="email" id="email" /><br /> PASWD : <input type="text" name="pass" id="pass" /><br /> <input type="submit" name="btn_submit" value="submit email pass" /> </body> </html> 

по этому коду, если я даю ввод как " OR ""=" тогда SQL-инъекция должна быть выполнена. но он работает неправильно. в почтовых данных у меня есть добавочные слэши, если я даю выше ввода в поле пароля.

может ли кто-нибудь показать мне, как на самом деле SQL INJECTION ATTACK можно сделать? (код будет более заметным)

Related of "PHP-инъекция"

Возможно, у вас есть магические кавычки. Проверьте возвращаемое значение get_magic_quotes_gpc .

«Волшебные кавычки» – это античная попытка PHP, чтобы автоматически активировать SQL-инъекцию, но в текущих версиях она устарела, и вам рекомендуется использовать подготовленные инструкции, чтобы избежать инъекции SQL.

См. Здесь, как отключить их, чтобы вы могли экспериментировать с SQL-инъекцией.

Как все уже сказали – у вас, вероятно, есть волшебные цитаты . Хотя вот трюк: эта функция делает SQL Injection труднее выполнять, но не совсем невозможно.

Более того, даже addslashes() не может вам помочь. Возможный атакующий может попробовать многобайтовые кодировки и некоторые другие трюки.

Вот хорошая статья об этом: http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-string

Короче говоря: если вы используете многобайтовые символы в однобайтовой среде, некоторые из них станут двумя однобайтовыми символами – косой чертой, котировками и т. Д.

Я думаю, что в твоих волшебных кодах php.ini или что-то вроде этого. это означает, что специальные символы автоматически экранируются.

На этой странице в руководстве php объясняется, как отключить его:

http://www.php.net/manual/en/security.magicquotes.disabling.php

Я думаю, что вы получаете дополнительную косую черту из-за магических цитат http://ch2.php.net/magic_quotes

Большинство современных установок PHP отключили его, поэтому вы не хотите полагаться на это. Просто используйте mysql_real_escape_string () или, лучше, используйте PDO http://ch2.php.net/pdo

Я предлагаю посмотреть Acunetix, или что-то подобное и бесплатное, как это дополнение для firefox:

https://addons.mozilla.org/en-US/firefox/addon/sql-injection/

Это быстрее для тестирования против SQL Injections, а также сканирует все формы / методы SQLi, о которых вы не знали. Acunetix расширяет это и тестирует RFI, XSS и т. Д.

Использование кода неэффективно.

SQL, который вы пытаетесь сформировать, должен выглядеть так:

 SELECT * FROM acl_user WHERE user_email = "a@a.com" Or 1=1; --" AND user_password = "" 

Попробуйте ввести:

 a@a.com" Or 1=1; -- 

Как адрес электронной почты и игнорировать пароль.

The – делает остальную часть утверждения игнорируемой.

Вот некоторая хорошая информация по этому вопросу: http://php.net/manual/en/security.database.sql-injection.php

измените его на: noe, если вы вводите пароль как что-то ИЛИ 1 = 1, тогда это вызовет инъекцию

  <?PHP if(count($_POST) > 0){ $con = mysql_connect("localhost","root","") or die(mysql_error()); mysql_select_db('acelera',$con) or die(mysql_error()); // echo $sql = "SELECT * FROM acl_user WHERE user_email = ".$_POST['email']." AND user_password = ".$_POST['pass']; $res_src = mysql_query($sql); while($row = mysql_fetch_array($res_src)){ echo "<pre>";print_r($row);echo "</pre>"; } } ?> <html> <head></head> <body> <form action="" method="post"> EMAIL : <input type="text" name="email" id="email" /><br /> PASWD : <input type="text" name="pass" id="pass" /><br /> <input type="submit" name="btn_submit" value="submit email pass" /> </form> </body> </html> 

Как предотвратить инъекцию SQl

1) Filter Input – перестать верить вашим пользователям: наибольшая угроза для приложения принадлежит его пользователям. Пользователи не должны быть хорошо воспитаны и послушны, как вы ожидаете. У некоторых пользователей есть плохие намерения, а некоторые просто пытаются проверить свои навыки взлома. Независимо от того, какой код вы собираетесь писать, напишите его с использованием лучших практик и рассмотрите аспекты безопасности. Подтвердить каждое поле в форме

2) Использовать классы оболочки базы данных или PDO. Оболочки базы данных или PDO (в PHP) могут снизить риск прямого доступа входных значений к базе данных. Подготовленные утверждения могут использоваться вместе с PDO, как показано ниже.

http://www.itechnicalblog.com/what-is-a-sql-injection-and-how-to-fix-it/

использовать:

 mysql_real_escape_string($_POST['thing']) 

Я также предлагаю использовать PDO или MySQLI для подключения / запроса вашей базы данных. старые команды mysql_ являются второстепенными для PHP3, а также улучшением производительности.

Вот хорошее (но упрощенное) введение в то, как SQL Injection работает через PHP / MySQL: http://www.tizag.com/mysqlTutorial/mysql-php-sql-injection.php