安全なWebアプリケーションを作成する12のスキル

この記事には啓示は含まれていません。 まず、一般的な脆弱性とそれらを解決する方法に関する情報は、初心者にとって有用です。 経験豊富な開発者はすべてこれを知っているか、自分自身をそう考えているかどうかを知る必要があります。



ほとんどのコード例は特定のプログラミング言語に関連付けられていませんが、わかりやすくするために、PHPを使用します。



行きましょう。







1. SQLインジェクションに対する保護



ユーザー名入力フォームを備えたWebサイトがあるとします。 データベース内の名前の存在を確認するには、次のコードを使用します。

$query = "SELECT * FROM `Users` WHERE UserName='" . $_POST["Username"]. "'";
mysql_query($query);
      
      





$_POST[«Username»] — .



Username

' or '1'='1

      
      





, :

SELECT * FROM `Users` WHERE UserName = '' OR '1'='1'
      
      





, , .



:

a';DROP TABLE `Users`; SELECT * FROM `userinfo` WHERE 't' = 't
      
      







:

SELECT * FROM `Users` WHERE `UserName` = 'a';DROP TABLE `Users`; SELECT * FROM `userinfo` WHERE 't' = 't'
      
      





SQL injection:



, . PHP MySQLi

$stmt = $db->prepare('update people set name = ? where id = ?');
$stmt->bind_param('si',$name,$id);
$stmt->execute();
      
      







PHP mysql_real_escape_string, escape . :

$query = sprintf("SELECT * FROM `Users` WHERE UserName='%s'",

mysql_real_escape_string($_POST["Username"]));

mysql_query($query);









2. ross Site Scripting (XSS)



XSS , - , : , , . XSS - Javascript , , .



? , . . .



:

<form id="myFrom" action="showResults.php" method="post">
<div><textarea name="myText" rows="4" cols="30"></textarea><br />
<input type="submit" value="Submit" name="submit" /></div>
</form>
      
      







showResults.php:

echo("You typed this:");
echo($_POST['myText']);
      
      







, . :





, javascript . htmlentities() :

echo("You typed this:");
echo(htmlentities($_POST['myText']));
      
      







3. HTTPS



. , — HTTPS. - .



4.





-, . , .



public_html/files, mysecretdoc.pdf mysecurewebsite.com/files/mysecretdoc.pdf.



:







5.







. (MD5+salt), , .



— , - . , .



— (-) RSA . .



— , Facebook, Twitter OpenID. .



6.



, , . , , . , .



, . , , .



PHP: ionCube, ZendGuard, SourceGuardian



: Thicket Obfuscator for PHP



7.



, , , .



. / . , .



MySQL.





delimiter |

CREATE TRIGGER insert_encrypt BEFORE INSERT ON cars
  FOR EACH ROW BEGIN
    SET NEW.Model = AES_ENCRYPT(NEW.Model,"my passphrase");
  END;
|

delimiter |

CREATE TRIGGER update_encrypt BEFORE UPDATE ON cars
  FOR EACH ROW BEGIN
    SET NEW.Model = AES_ENCRYPT(NEW.Model,"my passphrase");
  END;
|
      
      





SQL

SELECT
...
AES_DECRYPT(Model,"my passphrase"),
...
FROM carscars
      
      









. , . .



:







8. (PHP, shared server)



, , - .



PHP:

userName|s:5:"admin";accountNumber|s:9:"123456789";

      
      





:



— . PHP session_set_save_handler





9.





. .



, . PHP :

error_reporting(0);
@ini_set('display_errors', 0);
      
      







, , . PHP set_error_handler(). , set_error_handler().



10.



. , SSL MySQL PHP.



11. form spoofing



: example.com/edit_user.php?id=12345. 12345 . .



, GET POST . . , POST .



, . , .



, . - .

<input name="gender" type="radio" value="m" />Male
<input name="gender" type="radio" value="f" />Female
      
      





, m f, .



.



<input name="gender" type="text" value="m';DROP TABLE `Users`; ... " />
      
      





mysql_real_escape_string(), ( ).



:

substr($_POST['gender'],0,1)

      
      







12. Cross-site request forgery (CSRF)



XSS, . , Vasya , :

<img src="http://mysecurebank.com/withdraw?account=petya&amount=1000000&for=vasya" />
      
      





Petya,

http://mysecurebank.com/withdraw?account=petya&amount=1000000&for=vasya
      
      





, , Petya , , , .



— GET POST ( ). . :

<form id="f" action="http://mysecurebank.com/withdraw" method="post">
        <input name="account" value="petya" />
        <input name="amount" value="1000000" />
        <input name="for" value="vasya" />
    </form>
      
      





— . .



?



:

http://en.wikipedia.org/wiki/Cross-site_request_forgery

http://www.codinghorror.com/blog/2008/09/cross-site-request-forgeries-and-you.html





. . PHP (Yii, CakePHP, CodeIgniter, Zend, Symfony) (PHPRunner) . , , , . — .



 



All Articles