2016-03-02 3 views
0

Мне интересно, действительно ли мой код защищен от SQL-инъекции. Мои сайты были введены раньше, и я никогда не понимал, как предотвратить это. Вот мой код для вставки комментария:Может ли это быть SQL-инъекцией?

if ($_POST['comment']) { 
    $comment = strip_tags(nl2br(mysql_real_escape_string($_POST['comment']))); 
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); 
    // set the PDO error mode to exception 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $sql = "INSERT INTO posts (comment, authorid) 
    VALUES ('$comment', '$uid')"; 
    // use exec() because no results are returned 
    $conn->exec($sql); 
    echo '<div style="width: 98%; max-width: 98%; border: 1px solid white; background-color: green; color: white; vertical-align: text-top; text-align: center;">Your comment was added to the wall!</div><br>'; 
} 
+0

Я строю их для удовольствия. Я только ученик средней школы –

+1

mysql_real_escape_string и PDO?!? –

+0

да, возможно. Смотрите это: http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string – Harsh

ответ

2

Да, это, вероятно, может быть введено: Вы, кажется, не будет защищать вашу $uid переменным. Кроме того, укладка nl2br и strip_tagsпосле escaping - плохая идея - вы хотите оставить mysql_real_escape_string как последней операции, чтобы избежать каких-либо эффектов взаимодействия фильтра.

В более общем плане, вы должны использовать подготовленные операторы, а не строчную интерполяцию, чтобы строить SQL-запросы. Он проще, эффективнее, безопаснее и требует меньше кода. Вы не можете создать подготовленное заявление, используя $conn->prepare и выполнить его с произвольными параметрами:

$stmt = $conn->prepare("INSERT INTO posts (comment, authorid) VALUES (?, ?)"); 
$stmt->execute(array($comment, $uid)); 

не миновать требуется.

+0

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

+1

@ DarwinvonCorax: На самом деле SQL-инъекция вполне возможна с использованием только одного оператора SQL во многих контекстах с использованием * вложенных запросов * - иногда вам нужно всего лишь считывать конфиденциальные данные из базы данных. – nneonneo

+0

Хорошо. Так как насчет обновления? Как я могу это сделать? –