Какие шаги я должен предпринять, чтобы предотвратить инъекцию SQL? - PullRequest
1 голос
/ 04 марта 2012

В ответ на предыдущий вопрос, который я разместил , был ответ, что я открывал свою базу данных для SQL-инъекции.Код приведен ниже:

    <?php


        $firstname = stripslashes(strip_tags($_POST['firstname']));

        $lastname = stripslashes(strip_tags($_POST['lastname']));
        $email = stripslashes(strip_tags($_POST['email']));
        $title = stripslashes(strip_tags($_POST['title']));
        $organization = stripslashes(strip_tags($_POST['organization']));


    $pdbHost = "localhost";
    $pdbUserName = "******";
    $pdbPassword = "******";
    $pdbName     = "db1080824_emails";



    //  Connect to mySQL
    $conlink = mysql_connect($pdbHost, $pdbUserName, $pdbPassword);
    if(!$conlink) {die('Unable to connect to '.$pdbHost);}
    if (!mysql_select_db($pdbName, $conlink)){die('Cannot find database '.$pdbName);}

    //SQL query

        $SQL2="INSERT INTO  `db1080824_emails`.`emails` (`record_id` ,`firstname`,`lastname`,`email`,`title`,`organization`)VALUES (NULL ,  '".$firstname."',  '".$lastname."',  '".$email."',  '".$title."',  '".$organization."')";

        mysql_query($SQL2);
    //  Connect to Closing the connection
    mysql_close($conlink);
?>

Было предложено, чтобы я мог выполнить проверки на стороне сервера для '/ ^ [A-Za-z0-9] /', чтобы убедиться, что SQL-инъекция не может произойти, но этоэтого достаточно или есть лучшая практика, которой я должен следовать для обеспечения очистки данных?

Ответы [ 3 ]

3 голосов
/ 04 марта 2012

Используйте готовые заявления.Шутки в сторону.Простой способ сделать это - использовать оболочку базы данных PDO из PHP.

$firstname = $_POST['firstname'];
$lastname = …;
…

$db = new PDO('mysql:host=hostname;dbname=dbname', 'username', 'password');
$stmt = $db->prepare('INSERT INTO  `db1080824_emails`.`emails` (`firstname`,`lastname`,`email`,`title`,`organization`)
  VALUES (:firstname, :lastname, :email, :title, :organization)');
$stmt->execute(array(
  ':firstname' => $firstname,
  ':lastname' => $lastname,
  ':email' => $email,
  ':title' => $title,
  ':organization' => $organization));
1 голос
/ 04 марта 2012

Используйте mysql_real_escape_string() для предотвращения внедрения SQL.Достаточно только этой функции.

И, как сказал @knittl, использование подготовленных операторов также является очень хорошим способом предотвратить это.Но обычная библиотека mysql_ * этого не поддерживает.Вам нужна библиотека в виде PDO или MySQLi для подобных вещей.Я предлагаю вам переключиться на PDO или MySQLi, потому что в более высоких версиях PHP библиотека mysql_ * будет устаревшей.

Некоторые другие советы по улучшению кода:

  • не используйтеdie().Если вы совершите ошибку, вы не умрете, так зачем компьютер?Лучше хорошо обрабатывать ошибки и размещать их там, где вы хотите.
  • mysql_close() не требуется.PHP закрывает каждое соединение в конце выполнения.
  • использовать обработку ошибок в запросе, если запрос возвращает false, есть проблема.Также проверьте с помощью mysql_affected_rows() или mysql_num_rows, если запрос что-то сделал.

Я приказываю ответить на комментарии к этому ответу,Вы должны использовать mysql_real_escape_ string только для строк.Если вы используете mysql_real_escape_string(), убедитесь, что вы поставили кавычки (') вокруг строки в запросе:

$query = "SELECT foo FROM bar WHERE name = '".mysql_real_escape_string($_POST['name'])."'";

Если вы используете целые числа или любое другое число, вы должны использовать typecasting а не функция выхода:

$query = "SELECT foo FROM bar WHERE id = ".(int) $_POST['id'];
0 голосов
/ 04 марта 2012

Я использую PDO, я считаю, что это защищает от инъекций:

$db_user = "****";
$db_pass= "****";
$dsn = "mysql:dbname=yourdatabasename; host=localhost";
$dbh = new PDO($dsn, $db_user, $db_pass);

$sql = 'INSERT INTO
        emails(firstname, lastname, email, title, organization)
        VALUES(:firstname,:lastname,:email,:title,:organization)';
$data = array(':firstname'=>$firstname,
              ':lastname'=>$lastname,
              ':email'=>$email,
              ':title'=>$title,
              ':organization'=>$organization);

$sth = $dbh->prepare($sql);
$sth->execute($data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...